Servo-Testprogramm Variante 1a mit TimerOne-Library:
//Servo Testprogramm
//Test_Servo_Timer1-Lib.ino
//Code fuer Arduino
//Author Retian
//Version 1.0
#include <TimerOne.h>
#define servoPin 2 //Servo auf Pin 2
#define potiPin 2 // Potentiometer auf Pin A2
int pwmTime = 0; //PWM-Impulszeit
int potiWert = 0; // eingelesener Analogwert vom Potentiometer (0 - 1023)
//Servo-Impuls-Grundeinstellung
int pwmTimeMax = 2000; //maximale Impulszeit in Mikrosekunden
int pwmTimeMin = 1000; //minimale Impulszeit in Mikrosekunden
void setup() {
Serial.begin(115200);
pinMode(servoPin, OUTPUT);
digitalWrite(servoPin, 0);
Timer1.initialize(20000);
Timer1.attachInterrupt(servoTime);
}
void loop() {
potiWert = analogRead(potiPin);
pwmTime = map(potiWert, 0, 1023, pwmTimeMin, pwmTimeMax);
Serial.print("Potiwert: ");
Serial.print(potiWert);
Serial.print(" ");
Serial.print("Pulslaenge: ");
Serial.print(pwmTime);
Serial.println(" us");
}
void servoTime()
{
digitalWrite(servoPin, 1);
delayMicroseconds(pwmTime);
digitalWrite(servoPin, 0);
}
Servo-Testprogramm Variante 1b mit TimerOne-Library-PWM:
Einschränkungen durch Verwendung von TimerOne-PWM:
- PWM mit der TimerOne-Library ist nur mit den Arduino-Uno-Pins 9 und 10 möglich!
- Die Auflösung der PWM-Impulse beträgt nur ca. 20 µs (Auflösung von 10 Bit (0-1023) bei einer Periodendauer von 20 ms => 20 / 1024 = 19,5 µs). Dadurch ist eine schlechtere Feinjustierung der Servostellung gegenüber den Varianten 1a und 2 gegeben.
//Servo Testprogramm
//Test_Servo_Timer1-Lib-PWM.ino
//Code fuer Arduino
//Author Retian
//Version 1.0
#include <TimerOne.h>
#include <Streaming.h>
#define servoPin 9 //Servo nur auf Pin 9 oder Pin 10 moeglich
#define potiPin 2 // Potentiometer auf Pin A2
int pwmTime; //PWM-Impulszeit
int lastPwmTime; // letzte PWM-Impulszeit
int potiWert; // eingelesener Analogwert vom Potentiometer (0 - 1023)
//Servo-Impuls-Einstellung für Modelcraft RS2 MG/BB)
int pwmTimeMin = 600; //minimale PWM-Impulszeit in Mikrosekunden
int pwmTimeMax = 2400; //maximale PWM-Impulszeit in Mikrosekunden
int pwmWertMin;
int pwmWertMax;
void setup() {
Serial.begin(115200);
Timer1.initialize(20000); //Periodendauer 20 ms
//10 Bit - PWM-Signal:
//=> Impuls mit 1 ms Dauer => 1023 / 20 * 1 = 51,15 => pwmWertMin
//=> Impuls mit 2 ms Dauer => 1023 / 20 * 2 = 102,3 => pwmWertMax
pwmWertMin = (int) (1023.0 / 20.0 * (pwmTimeMin / 1000.0));
pwmWertMax = (int) (1023.0 / 20.0 * (pwmTimeMax / 1000.0));
//Bewege Servo in die Anfangsstellung entsprechend des Potiwertes
potiWert = analogRead(potiPin); //Lese Potiwert
pwmTime = map(potiWert, 0, 1023, pwmWertMin, pwmWertMax); //Berechne PWM-Impulszeit
Timer1.pwm(servoPin, pwmTime); //Initialisiere PWM => Servo faehrt in Anfangsstellung;
delay(500);
}
void loop() {
potiWert = analogRead(potiPin); //Lese Potiwert
lastPwmTime = pwmTime; //Speichere alte PWM-Impulszeit
pwmTime = map(potiWert, 0, 1023, pwmWertMin, pwmWertMax); //Berechne neue PWM-Zeit
//Wenn Differenz zwischen alter und neuer PWM-Impulszeit, dann setze neue PWM-Impulszeit
if (lastPwmTime != pwmTime) Timer1.setPwmDuty(servoPin, pwmTime);
Serial <<"Potiwert: " <<potiWert << " " <<"Pulslaenge: " << pwmTime * 20 <<" us\n";
delay(15);
}