AdSense

Samstag, 25. Mai 2013

ATmega - ESC ansteuern

(English version) Ich habe heut meinen Brushless-Motor aus China bekommen, das Steuergerät (ESC) kam schon eine Woche früher an. Nun wollte ich natürlich den Motor bewegen. Ich habe vieles im Internet zum Thema "ESC, PWM" gelesen aber eine genaue Anleitung wie es wirklich funktioniert gab es nicht.

Ein ESC ist folgendermaßen aufgebaut: 3 Kabel für den Motor (welches Kabel an welches am Motor kommt ist prinzipiell egal, falls der Motor sich falschrum dreht müssen einfach 2 vertauscht werden), 2 Kabel für den Akku (+, -) und 3 Kabel für das Steuern der Motor-Geschwindigkeit per PWM.

PWM funktioniert prinzipiell so, dass der Ausgang für eine gewisse Zeit des Zyklus an ist und dann aus geht. Beim ATMega zählt ein Counter bis 255 hoch. Setzt man nun den PWM-Ausgang auf einen Wert (z.B. 150), so ist der Ausgang während dem Zählen von 1 bis 150 high und dann von 150 bis 255 low. Wie das mit dem ATMega funktioniert sieht man unten im fertigen Programm.

Die 3 ESC-Kabel sind bei mir schwarz (geht an Masse), rot (wird nicht verbunden) und weiß (hier kommt das PWM-Signal hin). Ich steuere den ESC mit einem ATMega an, der hat ja Hardware-PWM. Um den Motor benutzen zu können muss aber erstmal eine Sequenz durchgefahren werden:
1) Das "Maximale-Leistung"-PWM-Signal, bis der Motor ein paar mal piepst (bei mir ist das 250)
2) Das "Keine-Leistung"-PWM-Signal, der Motor piepst dann andere Töne (bei mir 150).
Nun kann man ein PWM-Signal (bei mir von 150 bis 250) anlegen und den Motor dementsprechend steuern.

Hier mein Code um den ESC zu kalibrieren und dann den Motor auf voller Leistung anzuschalten:

#include <avr/io.h>
#define F_CPU 16000000
#include <util/delay.h>

int main( void )
{
  DDRB=0xFF; //Alle PORTB-Anschlüsse als Ausgang festlegen
  OCR2=250; //250 von 255, also fast die ganze Zeit high
  TCCR2=0x6D; //Frequenz auf etwas mehr als 50 Hz einstellen

  _delay_ms(10000);//Warten bis der Motor piepst
              //(10 Sekunden sind schon zu viel, aber zu viel schadet ja nicht)
  OCR2 = 150;((//150 von 255, also das Minimale-Leistung-Signal für den ESC
  _delay_ms(10000);
//Warten bis der Motor fertig ist

  //Jetzt ist der ESC kalibriert und kann verwendet werden.
  //OCR2 = 150: Minimale Leistung
  //OCR2 = 250: Maximale Leistung

  OCR2 = 200;//Auf halbe Leistung schalten
  while (1)
  {}
}

Keine Kommentare:

Kommentar veröffentlichen