Hallo zusammen
Ich möchte gerne einen Brushless-Motor mit meinem ATmega betreiben.
Dafür habe ich mal zum Start ein ganz einfaches Programm, ohne PWM,
kopiert (Quelle:
http://www.mikrocontroller.net/articles/Modellbauservo_Ansteuerung) und
auf die Motorsteuerung abgeändert
Hier mein Code:
_delay_us( 750 ); // in den 1500 steckt die Lageinformation
21
PORTB &= ~(1<<PB1);
22
}
23
lcd_puts("beep");
24
}
25
26
int main(){
27
lcd_init(LCD_DISP_ON);
28
lcd_clrscr();
29
lcd_puts("connect");
30
_delay_ms(5000);
31
lcd_clrscr();
32
33
initESC();
34
35
while( 1 ) {
36
PORTB |= (1<<PB1);
37
_delay_us( 1000 ); // Lageinformation
38
PORTB &= ~(1<<PB1);
39
_delay_ms( 22 );
40
}
41
return 0;
42
43
}
Der ESC piepst einmal nach der Initialisierung. Laut dem Datenblatt des
ESC
(http://www.hobbyking.com/hobbyking/store/uploads/1001782845X7478X34.pdf)
ist der ESC nachher betriebsbereit.
Leider dreht mein Motor aber nicht (ich spüre aber, sofort nach der
Stromversorgung des ESC) einen leichten Widerstand im Motor.
Hoffe ihr habt mir Tips;)
Grüsse
Lisa
Ich bin ein wenig verwirrt.
1:
Lisa schrieb:> // Lageinformation
Was ist die Lageinformation?
Lisa schrieb:> Leider dreht mein Motor aber nicht
Wieso sollte sich der Motor auch drehen? Ich sehe da keine sinnvolle
Ansteuerung.
Lisa schrieb:> Der ESC piepst einmal nach der Initialisierung. Laut dem Datenblatt des> ESC> (http://www.hobbyking.com/hobbyking/store/uploads/1001782845X7478X34.pdf)> ist der ESC nachher betriebsbereit.
- The motor transmits a single or double beeps to confirm the correct
connection. The ESC is ready to be operated and
the motor can be switched on
- A single beep announces that the brake is on; the double beep says
that the brake is off
Hallo Hmm und vielen Dank für deine Antwort!
>>>> // Lageinformation
Sorry, ein Überbleibsel von dort wo ich den Code rauskopiert habe (war
ursprünglich für die Ansteuerung von Servos. Das "Protokoll" für ESC und
Servos ist aber anscheinend das Selbe
>>Wieso sollte sich der Motor auch drehen? Ich sehe da keine sinnvolle>>Ansteuerung.
Im main() siehst du die while-Schlaufe.
Die Sollte eigentlich den Motor mit halber Geschwindigkeit laufen
lassen.
(Siehe den Link aus dem Forum, wo ich auch den Code her habe)
>>- The motor transmits a single or double beeps to confirm the correct>>connection. The ESC is ready to be operated and>>the motor can be switched on>>- A single beep announces that the brake is on; the double beep says>>that the brake is off
Ich nehme an, dass du hier Bezug zu der "Bremse" nimmst. Ich konnte
leider keine weiteren Infos zur Bremse finden. Da das Datenblatt aber
von verschiedenen Bremsmodi spricht interpretiere ich das nicht als
"blockieren" sondern eher als das Verhalten, wenn die Leistung
zurückgenommen wird (also ob der Motor noch langsam herunter dreht oder
sofort stoppt oder einfach "auskuppelt".
Ich lasse mich hier aber auch gerne korrigieren
Was ich noch nicht gesagt habe:
Ich habe den reinen Servo-Teil, also das hier:
1
while( 1 ) {
2
PORTB |= (1<<PB1);
3
_delay_us( 1500); // Lageinformation
4
PORTB &= ~(1<<PB1);
5
_delay_ms( 22 );
6
}
mit einem normalen Servo getestet, das funktioniert!
Lisa schrieb:> Das "Protokoll" für ESC und> Servos ist aber anscheinend das Selbe
Dieses "Protokoll" nennt sich im Modellbau PPM
(Pulse-Position-Modulation).
Wie genau sind dein Zeiten welche du da mit einem Delay denerierst? Hast
du da die möglichkeit mal nachzumessen?
Hi San Lue
San Lue schrieb:> Dieses "Protokoll" nennt sich im Modellbau PPM
Nun, das hilft sicher schon mal weiter - danke=)
San Lue schrieb:> Wie genau sind dein Zeiten welche du da mit einem Delay denerierst? Hast> du da die möglichkeit mal nachzumessen?
Also ich muss voraussenden, dass ich ein ABSOLUTER OSZI noob bin. Ich
habe hier ein "Teleequipment Type D1016", mal auf dem Flomarkt gefunden
und es spinnt ein bisschen.
Probiert habe ich es trotzdem Mal und dabei ist das angehängte Bild raus
gekommen.
Also irgendwas stimmt ja nicht, eigentlich sollte es eher wie hier
aussehen:
http://www.mikrocontroller.net/wikifiles/0/02/Servo.gif
Oder nicht?
Achtung nachtrag
Ich habe beim rumprobieren einen Fehler gemacht.
Der oben publizierte Code erzeugt folgendes auf dem oszi:
Sieht eigentlich nicht schlecht aus, oder?
_delay_us(750);// in den 1500 steckt die Lageinformation
4
PORTB&=~(1<<PB1);
5
}
wenig Freude haben wird.
Auch wenn die 20ms WIederholrate bei Servos (und Drehzahlreglern, denn
nichts anderes hast du da) nicht so genau genommen werden, eine Pause
von praktisch 0 zwischen den Pulsen wird keiner akzeptieren.
Hier
1
while(1){
2
PORTB|=(1<<PB1);
3
_delay_us(1000);// Lageinformation
4
PORTB&=~(1<<PB1);
5
_delay_ms(22);
6
}
hast du es (fast) richtig kopiert.
Es reicht eben nicht, einfach nur zu kopieren. Man muss auch verstehen
was man da kopiert und warum die einzelnen Anweisungen da stehen. Der
_delay_ms(22) ist in dieser Schleife nicht einfach nur blosse
Verzierung, sondern Teil der 'Protokoll'implementierung, die ein Servo,
resp. Drehzahlregler, von der Steuerung erwartet, damit er das als
gültiges Servosignal ansieht.
Lisa schrieb:> Der ESC piepst einmal nach der Initialisierung. Laut dem Datenblatt des> ESC> (http://www.hobbyking.com/hobbyking/store/uploads/1001782845X7478X34.pdf)> ist der ESC nachher betriebsbereit.
Der einzelne Piep heist nur, dass der ESC letzten Endes Strom hat.
'Betriebsbereit', so wie du dir das vorstellst ist er erst, wenn er 2
mal piepst.
Der Sinn dahinter ist der, dass derartige Drehzahlregler nicht sofort
loslaufen, wenn die EMpfangsanlage eingeschaltet ist. Man will eine
Rückmeldung haben, die einem sagt: alles ok, Strom ist da.
Aber lauslaufen wird der Motor erst, nachdem man den Gasknüppel einmal
in Leerlaufposition bringt, wenn er nicht beim Einschalten der
Fernsteuerung nicht sowieso schon dort war. Denn was man verhindern will
ist, dass man die Fernsteuerung einschaltet und der Motor sofort mit
Vollgas losdonnert, nur weil der Gasknüppel vom letzten mal noch auf
Vollgas stand und der Pilot das nicht bemerkt hat. Wegen sowas wurden
schon Finger abgehakt.
Ein guter Regler könnte es dir theoretisch sogar krumm nehmen, wenn du
übergangslos von Stillstand auf Halbgas gehst, weil der so programmiert
ist, das er das als Fehlpulse wertet. Kein Mensch kann in 0-Zeit einen
Knüppel auf der Fernsteuerung von einem Ende des Ausschlags in
Mittelstellung bringen.
Allerdings: manche Regler machen das, andere wieder nicht.
Das Problem war, dass ich immer zuerst den ESC eingesteckt habe und der
ATmega erst danach mit der Initialisierung anfing.
Die initalisierung muss aber schon laufen, wenn der ESC Strom kriegt (In
RC-Sprache übersetzt: Der Gasknüppel muss auf 0 gezogen sein, wenn man
die Batterie am Modell einsteckt).
Danke
Lisa schrieb:> void initESC(){>> DDRB = (1<<PB1);>> for(int i=0; i<500; ++i){> PORTB |= (1<<PB1);> _delay_us( 1001 ); // Motor stehend> PORTB &= ~(1<<PB1);> _delay_ms(22);> }
Das Problem war, dass du jetzt hier einen _delay_ms drinnen hast und
vorher nicht.
> Das Problem war, dass ich immer zuerst den ESC eingesteckt habe und der> ATmega erst danach mit der Initialisierung anfing.
Das allerdings mag auch durchaus sein.
Denn wie gesagt: Auf dem Flugplatz oder auf dem RC-Car Platz sind die
Modelle potentielle Waffen, die zu schweren Verletzungen führen können,
wenn Motoren unkontrolliert loslaufen.
Daher tut man empfängerseitig (also im Modell) alles um genau diesen
Zustand zu verhindern. Speziell bei allem was letzten Endes darauf
hinausläuft, dass ein Motor unkontrolliert sofort auf VOllgas geht, wenn
der Strom eingeschaltet wird.
Karl Heinz schrieb:> eine Pause von praktisch 0 zwischen den Pulsen wird keiner akzeptieren.
So seh ich das auch, und vor allem
_delay_us( 750 ); // in den 1500 steckt die Lageinformation
1.5msec oder 0.75msec ?
Vielleicht läuft ja auch der Controller mit 4MHZ.
#define F_CPU 8000000
Lisa schrieb:> Vielen Dank für ale Antworten.> Ich habe es letzen Endes doch noch zu laufen gekriegt.
Wieso Rätselt ihr überhaupt noch? Die Lösung steht 3 Posts weiter
oben...