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);
}


Zurück zum Servotest