Forum: Mikrocontroller und Digitale Elektronik Elektrischer Motorsteller mit ATmega8 (C), Motor dreht nicht, ESC initalisiert korrekt


von Lisa (Gast)


Lesenswert?

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:
1
/*************************************************************************
2
Title:    
3
Author:   
4
File:     
5
Software: 
6
Hardware: 
7
**************************************************************************/
8
#include <stdlib.h>
9
#include <avr/io.h>
10
#include "lcd/lcd.h"
11
#define F_CPU 8000000
12
#include <util/delay.h>
13
14
void initESC(){
15
  
16
  DDRB = (1<<PB1);
17
  
18
  for(int i=0; i<1000; ++i){
19
    PORTB |= (1<<PB1);
20
    _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

von Hmm (Gast)


Lesenswert?

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

von Lisa (Gast)


Lesenswert?

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!

von San L. (zwillingsfreunde)


Lesenswert?

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?

von Lisa (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Lisa (Gast)


Angehängte Dateien:

Lesenswert?

Achtung nachtrag
Ich habe beim rumprobieren einen Fehler gemacht.
Der oben publizierte Code erzeugt folgendes auf dem oszi:

Sieht eigentlich nicht schlecht aus, oder?

von Karl H. (kbuchegg)


Lesenswert?

Ich würde mal sagen, dass dein Controller damit
1
  for(int i=0; i<1000; ++i){
2
    PORTB |= (1<<PB1);
3
    _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.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von Lisa (Gast)


Lesenswert?

Hallo zusammen

Vielen Dank für ale Antworten.
Ich habe es letzen Endes doch noch zu laufen gekriegt.
1
/*************************************************************************
2
Title:
3
Author:
4
File:
5
Software:
6
Hardware:
7
**************************************************************************/
8
#include <stdlib.h>
9
#include <avr/io.h>
10
#include "lcd/lcd.h"
11
#define F_CPU 8000000
12
#include <util/delay.h>
13
14
void initESC(){
15
  
16
  DDRB = (1<<PB1);
17
  
18
  for(int i=0; i<500; ++i){
19
    PORTB |= (1<<PB1);
20
    _delay_us( 1001 );    // Motor stehend
21
    PORTB &= ~(1<<PB1);
22
    _delay_ms(22);
23
  }
24
  
25
  lcd_clrscr();
26
  lcd_puts("armed");
27
}
28
29
int main(){
30
  lcd_init(LCD_DISP_ON);
31
  lcd_clrscr();
32
  
33
  lcd_clrscr();
34
  lcd_puts("connect");
35
  initESC();
36
  
37
  lcd_gotoxy(0, 1);
38
  lcd_puts("run");
39
  
40
  while( 1 ) {
41
    
42
    for(int i=0; i<500; ++i){
43
      PORTB |= (1<<PB1);
44
      _delay_us( 1001 );    // Motor stehend
45
      PORTB &= ~(1<<PB1);
46
      _delay_ms( 18 );
47
    }
48
    
49
    for(int i=0; i<500; ++i){
50
      PORTB |= (1<<PB1);
51
      _delay_us( 1500 );    // Motor halbe Geschwindigkeit
52
      PORTB &= ~(1<<PB1);
53
      _delay_ms( 18 );
54
    }
55
    
56
    for(int i=0; i<500; ++i){
57
      PORTB |= (1<<PB1);
58
      _delay_us( 2000 );    // Motor volle Geschwindigkeit
59
      PORTB &= ~(1<<PB1);
60
      _delay_ms( 18 );
61
    }
62
    
63
  }
64
  return 0;
65
  
66
}

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von MaWin (Gast)


Lesenswert?

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

von uwe (Gast)


Lesenswert?

> 1.5msec oder 0.75msec ?
> Vielleicht läuft ja auch der Controller mit 4MHZ.

Deshalb frage an Lisa : Woher weißt du, daß dein AVR mit 8MHz läuft?

von San L. (zwillingsfreunde)


Lesenswert?

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...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.