PWM erzeugen für Servosteuerung ohne Delay

Hallo,

bin fleissig am Arduino programmieren und ausprobieren. Möchte nun einen Servo über einen DO ansteuern. (Arduino Nano hat leider keinen PWM Output)
Über google findet man auch einige Beispiele hierfür:
http://www.mariolukas.de/2011/08/arduino-servo-tutorial/#comment-530
Allerdings wird hier mit der Delayzeit von 20ms gearbeitet um eine Frequenz von 50Hz zu erhalten. Diese Delayzeit ist ja eine Totzeit die man anders nutzen koennte. zBsp einlesen von Eingängen, LED blinken lassen oder ähnliches.
Auch verändert sich ja die Frequenz des Servosignals, wenn man in der Main loop noch andere Programme aufruft.
Wer kennt einen weg, die PWM ohne Delayzeit zu realisieren? Wer hat einen Vorschlag um die oben genannte Probleme zu umgehen?

Grüße

Robert

  1. Arduino NANO hat 6 PWM Ausgänge
  2. Servos werden nicht mit PWM angesteuert sondern mit PPM ( ein Impuls von 1 bis 2 mSekunden (0 bis 180 Grad Ausschlag) alle 20mSekunden.
  3. Benutze die servo.h -Bibiothek. Diese ist Teil der IDE Programmierumgebung:
    Servo - Arduino Reference In der IDE findest Du Beispiele.

Grüße Uwe

Hi,
welche Pins sind die PWM Ausgänge?

sehe leider keine PWM Ausgänge auf der Platine.
Im Vergleich die Arduino Mega 2560 wo eindeutig die PWm Ausgänge beschriftet sind.

Habe bisher mit dem Arduino Mega Board und den PWM Ausgängen gearbeitet, hier hat alles funktioniert.
Nun bei dem Arduino Nano finde ich keine PWM Ausgänge und ich weiß nicht ob der Servo mit Libary einfach so am Digital Output funktioniert. Dachte die Libary funktioniert nur am PWM Ausgang.
Quelle der Bilder: http://www.arduino.cc/
Grüße

Robert

Der Nano ist eine verkleinerte Version des Arduino 2009 mit 2 zusätzlichen analogen Eingängen die NICHT als Digitale Ein/Ausgänge verwendet werden können.

Die PWM-Ausgänge sind D3, D5, D6, D9, D10, D11.

Die Servo-Bibiothek arbeitet auf 12 Ausgängen. Ich habe nirgens gefunden welche Pins das sein können. Darum nehme ich an, daß es alle Pin sein können, aber eben nur 12 der 20 möglichen Pins.

http://arduino.cc/en/Reference/Servo:
The Servo library supports up to 12 motors on most Arduino boards ... . On boards other than the Mega, use of the library disables analogWrite() (PWM) functionality on pins 9 and 10, whether or not there is a Servo on those pins. ...

http://arduino.cc/en/Main/ArduinoBoardNano:
Digital I/O Pins 14 (of which 6 provide PWM output)
Analog Input Pins 8

Grüße Uwe

Hi Uwe,

sorry, war da etwas Blind und hab das nicht gesehen. :slight_smile: Funktioniert wunderbar ueber die Libary.

Mich wuerde aber trotzdem interressieren, reine neugierde, ob jemand eine alternativloesung hat um das Problem ohne Delay zu loesen??

MfG

Robert

Welches Delay?
Grüße Uwe

Hi

hier der Code den ich oben verlinkt hatte.

// Festlegen des Servo Pins
int servo = 7;

// Weitere Variablen für PWM und Drehwinkel (Position)
int pwm;
int pos;

/* Funktion um das Servo zu bewegen. Hier wird die Position
berechnet und der Wert der neuen Position an das Servo
übergeben. */

void servoMove(int servo, int pos){
  //Winkel in Mikrosekunden umrechnen
  pwm = (pos * 11) + 500;
  // Servo Pin auf HIGH zum aktivieren des Servos
  digitalWrite(servo, HIGH);
  // Kurze Zeit warten
  delayMicroseconds(pwm);
  // Servo Pin auf LOW zum deaktivieren des servos
  digitalWrite(servo, LOW);
  // 20 ms warten
  delay(20);             //  <<<<====== Dieser Delay ist gemeint!
}

// Initialisieren des Servo Pins
void setup() {
   pinMode(servo, OUTPUT);
}

// Hauptprogramm
void loop() {
  for(pos=0; pos<180; pos++) {
    servoMove(servo, pos);
  }
}

Warum willst Du das so machen und benutzt nicht die servo.h Bibiothek.
Grüße Uwe

Hi,

wie oben geschrieben benutzte ich doch die servo libary (servo.h)
Ich will es aus neugierde anders machen. Ich will wissen ob es anders geht. Das ist der einfache Grund.

MfG

Du kannst mit millis() die vergangene Zeit messen http://arduino.cc/en/Tutorial/BlinkWithoutDelay
oder mittels Timer nache einer gewissen Zeit eine Funktion aufrufen. (da hab ich aber zuwenig Erfahrung um dir Ratschläge geben zu können).

Grüße Uwe