Forum: Mikrocontroller und Digitale Elektronik ATMega168 treibt Schrittmotor über L6219 nicht


von Michael P. (mipl)


Lesenswert?

Hallo,

nach einer Weile experimentieren, lesen und suchen muss ich Euch nun 
doch fragen, ob Ihr mir helfen könnt. Ich kann (vorerst) einen 
Schrittmotor, bipolar, 4 Anschlüsse, 12-24 V, 0,67 A, ca. 10 R nicht zum 
Laufen bringen.

Alles geht zurück auf ein altes Projekt: 
https://www.mikrocontroller.net/articles/Sonnenfolger_/_Heliostat

Die Ansteuerschaltung scheint (was ich mit einem Multimeter messen kann) 
soweit zu funktionieren. Wenn ich folgenden vereinfachten Codeauszug 
verwende:
1
//############## Für Motortest ##################
2
3
PORTD &=~ _BV(4);                // PORT D 4 ( 6) = SL2:8  Motor pan Enable on (0=on)
4
                    // I0 und I1 sind so auf +5V
5
6
{PORTD |= _BV(6);PORTD &=~ _BV(7);}  //Motor pan PH2 = 1 , Motor pan PH1 = 0
7
set_cursor(0,3);
8
lcd_data('1');lcd_data('0');
9
_delay_ms(1000);
10
{PORTD |= _BV(6);PORTD |= _BV(7);}  //Motor pan PH2 = 1 , Motor pan PH1 = 1
11
set_cursor(0,3);
12
lcd_data('1');lcd_data('1');
13
_delay_ms(1000);
14
{PORTD &=~ _BV(6);PORTD |= _BV(7);} //Motor pan PH2 = 0 , Motor pan PH1 = 1
15
set_cursor(0,3);
16
lcd_data('0');lcd_data('1');
17
_delay_ms(1000);
18
{PORTD &=~ _BV(6);PORTD &=~ _BV(7);} //Motor pan PH2 = 0 , Motor pan PH1 = 0
19
set_cursor(0,3);
20
lcd_data('0');lcd_data('0');
21
_delay_ms(1000);
22
set_cursor(0,1);
23
24
PORTD |= _BV(4);
25
26
//############## Motortest Ende #############

dann kann ich an Ph1 und Ph2 gut die wechselnden TTL-Pegel messen. I0 
und I1 liegen auf +5Volt. Ich bin zwar verunsichert, da im Datenblatt 
steht, dass für maximalen Stromfluss diese Pins auf low sein müssen, 
doch ist der aus dem Projekt stammende Code ja mal lauffähig gewesen. 
Dennoch habe ich I0 und I1 auch mit PORTD |= _BV(4) angesteuert. Keine 
Änderung.

Vss liegt mit 12 Volt am Pin 24 an.

In der alten Schaltung ist Vref mit Vs zusammengeschaltet, also +5 Volt. 
Ich habe mittlerweile gelesen, dass dies aus einem falschen Datenblatt 
resultiert. Die Platine ist so aber nun fertig :-(

Anders betrachtet habe ich die Sense-Widerstände auf 0,75 Ohm gesetzt. 
Das müsste doch so passen: 5 V / 10*0,75 R = 0,67 A

Wenn ich also nun so takten lasse, kann ich bei den Motorspulen gegen 
Masse keine Spannung messen. Wenn ich das Multimeter in eine Spule 
zwischenschalte (wie zum Strom messen) steigt und fällt die Spannung im 
ca. 200 mV-Bereich. Ein Stromfluss ist nicht zu verzeichnen.

Ich habe auch mal Strom auf die einzelnen Spulen des Motors gegeben. 
Dieser reagiert – müsste somit i. O. Sein.

Was kann ich jetzt noch prüfen/ändern? Hat da jemand einen Tipp?

Danke.

Gruß Michael

: Bearbeitet durch User
von Hubert G. (hubertg)


Lesenswert?

Mit den I-Eingänge stellst du den Strom ein. Wenn beide auf high sind, 
dann fließt kein Strom.
Mit Vref auf Vs hast du keine Strombegrenzung.
Du solltest mal die Schaltung zeigen wie sie tatsächlich ist.

von Michael P. (mipl)


Angehängte Dateien:

Lesenswert?

Hallo Hubert G.,

habe mal den Schaltplan angehängt.

Zu den I-Eingängen: Wenn beide (oder alle vier) auf high stehen fließt 
kein Strom. Das seh ich lt. Datenblatt auch so. Aber bitte nur nochmal 
zu meiner Absicherung: Wenn ich
1
PORTD |= _BV(4);

bei dieser Schaltung vor dem "klappern" mit Phase programmiere müssten 
doch alle vier Leitungen auf low gesetzt sein und maximaler Strom 
fließen (können), oder?

Eine Strombegrenzung müsste doch gem. meiner Berechnung auf 0,67 A 
gegeben sein. Warum nicht?

von Hubert G. (hubertg)


Lesenswert?

Michael P. schrieb:
> zu meiner Absicherung: Wenn ich
> PORTD |= _BV(4);
>
> bei dieser Schaltung vor dem "klappern" mit Phase programmiere müssten
> doch alle vier Leitungen auf low gesetzt sein und maximaler Strom
> fließen (können), oder?

Hier setzt du PORTD4 aber auf 1.
Laut Datenblatt müsste deine Berechnung des Imax richtig sein.

von aSma>> (Gast)


Lesenswert?

Michael P. schrieb:
> bei dieser Schaltung vor dem "klappern" mit Phase programmiere müssten
> doch alle vier Leitungen auf low gesetzt sein und maximaler Strom
> fließen (können), oder?

Steht so jedenfalls im Datenblatt.

> Eine Strombegrenzung müsste doch gem. meiner Berechnung auf 0,67 A
> gegeben sein. Warum nicht?

Nach meiner Berechnung eher 0.5A.

von Michael P. (mipl)


Lesenswert?

ok, Fehler von mir. Es muss somit
1
PORTD &=~ _BV(4);

sein, um das Bit zu löschen und somit I0 und I1 auf low zu setzen. Dann 
müsste ich aber an den Pins 8, 9, 17 und 20 gegen Masse 0 Volt messen, 
oder?

Ich messe aber +5 Volt!?

von eProfi (Gast)


Lesenswert?

1. Pflicht des Thread-openers: Link zum Datenblatt angeben:
www.st.com/resource/en/datasheet/l6219.pdf

2. Pflicht des Thread-openers: Link zu Application Notes angeben:
www.st.com/resource/en/application_note/cd00003774.pdf
www.st.com/resource/en/application_note/cd00003771.pdf
www.st.com/resource/en/application_note/cd00004353.pdf

Sense-Rs müssen LoInductive sein, also keine gewickelten 
Drahtwiderstände, sondern Metallband-Rs.

Warum wird die Fähigkeit, den Phasenstrom einzustellen (microstepping), 
nicht genutzt?

Warum wurde kein L6218 verwendet? Den steuert man mit Step + Direction 
an.

D3 und D4 müssen auf Ausgang geschaltet werden.
DDRD |= 3<<3;

von Michael P. (mipl)


Lesenswert?

Hallo eProfi,

danke für die Resonanz.

Zu 1: Ok, versuche ich bei den nächsten Beiträgen, die ich verfasse, zu 
befolgen.

Zu 2: ich habe diese Beiträge erstens nicht gekannt und zweitens meine 
ich, dass diese derzeit zu tief in Details einsteigen (habe sie aber 
bislang nur überflogen). Ich stehe momentan vor dem Problem, dass sich 
nichts tut.

Rsense: Ja, da habe ich derzeit Lastwiderstände drin. Ist wahrscheinlich 
nicht die optimale Wahl. Aber können diese bewirken, dass gar nichts 
geht? Oder wäre eher "nur" das timing unsauber?

Phasenstrom/Microstepping nicht genutzt, da bisher gar nichts geht. Ich 
wollte zuerst das Einfachste zum Laufen bringen. Das erscheint mir der 
Vollstep zu sein, oder ist das nicht so?

L6219 wurde verwendet, da der Entwickler der Platine und der Software 
diesen Chip vorgesehen hat. Ich bin kein Elektrotechniker, der sich 
professionell mit IC's beschäftigt. Daher wäre ich nie darauf gekommen 
einen anderen Chip zu nehmen.

Am Anfang der main() steht:
1
// ****  Setting of inputs and outputs *************** 
2
DDRD = 0xf8;                    // PortD7-3  outputs PORTD2-0 inputs
3
PORTD= 0x07;                // set Enable engines to 1 = disable, to avoid a jerk when you turn on the motors

D3 und D4 sollten Outputs sein.

Aber was ist mit +5 Volt bei den I0 und I1-Pins, obwohl PORTD 4 auf low 
steht bzw. stehen sollte? Liegt hier nicht der Fehler?

Was empfehlt ihr mir:

Vref von Vss trennen und trimmbar machen?
Rsense gegen Metallschicht tauschen?

von eProfi (Gast)


Lesenswert?

> Warum wurde kein L6218
Ich meine den L6208 oder moderneres aus der L64xx-Serie

> PORTD= 0x07;  // set Enable engines to 1 = disable, to ...
Da widerspricht sich Code mit Kommentar.

Kann auch sein, dass das Pin bereits im Siliziumhimmel ist.
Zu schnell rutscht man beim Messen ab und "Hoch"spannung liegt am 
Prozessor an.
Deshalb baue ich gerne "Angst"widerstände (zur Strombegrenzung) ein.
100 Ohm stören das Signal nicht  und können viel retten.

Oder massive Unterschwinger infolge schlechten Gnd-Layouts.

von Hubert G. (hubertg)


Lesenswert?

Hast du die Leitungen zu den I schon mal gemessen, möglicherweise 
unterbrochen, dann sind sie nämlich auch auf high.
Trenn die Verbindung zum PD4 und leg die Leitung manuell auf low.

von Michael P. (mipl)


Angehängte Dateien:

Lesenswert?

gute Idee mit dem Durchgang der I-Leitungen. Hatte ich zwar auch im 
Datenblatt gelesen, dass offene Pins high geschaltet werden, aber nicht 
mehr im Kopf. Letztlich hat die Prüfung aber zur Lösung geführt.

Eine unterbrochene Leitung war es aber nicht. Es war ein Fehler in der 
Darstellung des Bestückungsplanes. Dort sieht es so aus ob Drahtbrücken 
zusammengelötet sind. Das habe ich jedenfalls gemacht und damit Vref mit 
I0 und I1 verbunden. Ich habe die Leitungen nun getrennt und es läuft.

Vielen Dank an Alle, die sich um eine Lösung bemüht haben.

Michael

: Bearbeitet durch User
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.