Forum: Mikrocontroller und Digitale Elektronik Zuckende DC-Motoren bei Ansteuerung mit H-Brücke/PWM und Arduino UNO


von Dennis V. (lodennis) Flattr this


Angehängte Dateien:

Lesenswert?

Hallo alle zusammen,

ich habe ein merkwürdiges Problem und hoffe, dass jemand vielleicht 
schon einmal mit einem ähnlichen Problem zu tun hatte und mir somit 
weiterhelfen kann.

Ich steuere mit meinem Arduino UNO zwei H-Brücken-Treiber (STK681-332-E) 
u. a. mit einem PWM-Signal an. Die beiden Treiber wiederrum steuern je 
einen meiner beiden DC-Motoren. Die Motoren lassen sich nun über 
entsprechende Eingangssignale, welche ich momentan noch mit Netzteil, 
Breadboard und Potis/Dip-Switch realisiere, steuern. Die Signale sollen 
später mal von einem Prüfstand gesendet werden (s. Anhang, unten links). 
Das ganze funktioniert eigentlich auch ganz gut. Aber nachdem ich die 
Schaltung auf meiner Lochrasterplatine zum Laufen gebracht habe, musste 
ich feststellen, dass die Motoren je nach PWM-Signal am entsprechenden 
Treiber-Pin anfangen etwa alle 1,5 Sekunden einmal zucken. Dies fällt 
besonders bei langsamen Drehzahlen (also geringem Tastgrad der PWM an 
den ENABLE-Pins) auf. Am Netzteil kann man bei manchen Motor-Rucklern 
sehen, dass der Strom kurz auf ein vielfaches steigt und die Spannung in 
dem Moment auf etwa die Hälfte zusammenbricht. Was ist da los???

Ich möchte mit dem Arduino und ein paar Sensoren noch eine Regelung 
umsetzen. Da das ganze recht präzise werden soll, passt mir so ein 
Motorzucken also Störgröße gar nicht ins Projekt.

Hier noch ein paar Infos zu den Motoren, um die kurze Umschreibung der 
Situation abzurunden:
Die DC-Motoren mit Bürsten haben einen Nennstrom von 2,3A bei 24V. Ich 
habe sie bisher nur im Leerlauf getestet.
Bin für jegliche Hilfe und Anregungen über die mögliche Fehlerquelle 
sehr dankbar!

Beste Grüße
Dennis

von aSma>> (Gast)


Lesenswert?

> Am Netzteil kann man bei manchen Motor-Rucklern
> sehen, dass der Strom kurz auf ein vielfaches steigt und die Spannung in
> dem Moment auf etwa die Hälfte zusammenbricht. Was ist da los???

Nur am Netzteil? Hast du ein Labornetzteil? Welche PWM Frequenz?
Wie sieht die Pufferung der Treiber aus? Leider hast du keine Werte in 
deinen Schaltplan eingefügt. Somit ist dieser nichtig!

Wie steuerst du die Motoren an? Inventierende eingänge an In1, In2 ?

mfg

von aSma>> (Gast)


Lesenswert?

Ach ja, Motordaten sind unvollständig.
-Blockierstrom?
-Induktivität?

cya

von Dennis V. (lodennis) Flattr this


Angehängte Dateien:

Lesenswert?

>Nur am Netzteil? Hast du ein Labornetzteil?

Ja, ich habe ein Labornetzteil. Die Strombegrenzung sollte groß genug 
eingestellt sein.

>Welche PWM Frequenz?

Die PWM-Frequenz vom Arduino habe ich schon variiert. Momentan laufen 
die Treiber mit 62,5kHz an ihren ENABLE-Pins (über Pin 5 und 6 vom 
Arduino). Ich habe die Frequenz aber auch schon auf 7,81kHz 
runtergesetzt mit dieser Funktion: 
http://playground.arduino.cc/Code/PwmFrequency
Es zeigte sich kein Unterschied, obwohl laut Datenblatt vom STK681-332-E 
die PWM-Frequenz zwischen 32 und 62kHz (typ. 47kHz) liegen soll.
Ich habe auch mal das Datenblatt zu dieser fertigen Schaltung gelesen:
http://de.farnell.com/on-semiconductor/stk681-332gevb/evaluation-board-stk681-332-e/dp/2250538?ost=stk681-332-e&selectedCategoryId=&categoryNameResp=Alle%2BKategorien&searchView=table&iscrfnonsku=false
Hier wurde mit 20kHz erfolgreich getestet, weshalb ich die PWM-Frequenz 
als mögliche Fehlerquelle eigentlich ausschließe.

>Wie sieht die Pufferung der Treiber aus? Leider hast du keine Werte in
>deinen Schaltplan eingefügt. Somit ist dieser nichtig!

Was meinst du mit Pufferung? Die Werte habe ich vorerst noch nicht 
eingefügt in der Hoffnung, sie seien nicht notwendig. Der neue und 
hoffentlich vollständige Schaltplan ist jetzt im Anhang. Die Widerstände 
und Kondensatoren habe ich alle gemäß Datenblatt ausgewählt. R5 und R10 
sind Dickschichtwiderstände an denen ich später noch eine 
Strommessverstärkerschaltung anbringen möchte. R3, R4, R8 und R9 sind 
Strombegrenzer an den IN1/2-Pins, die laut Datenblatt zwischen 100 und 
1000Ohm liegen sollen. Vref soll unter 2V liegen (Datenblatt), was durch 
den Spannungsteiler mit R1 und R2 bzw. R6 und R7 auch umgesetzt wurde.
Der DC/DC-Wandler wandelt von 24V auf 5V herunter.

>Wie steuerst du die Motoren an? Inventierende eingänge an In1, In2 ?

Laut Datenblatt brauchen die Treiber für Rechtslauf IN1=HIGH && IN2=LOW 
und für Linkslauf Rechtslauf IN1=LOW&& IN2=HIGH. Die Signale (5V für 
HIGH) liegen auch solide an, schon geprüft.

>Ach ja, Motordaten sind unvollständig.
>-Blockierstrom?
>-Induktivität?

Also bei den Motoren handelt es sich um "MOT-AE-B-024-010-042-F-A-AAAA" 
von Igus. Im zugehörigen Datenblatt finde ich nichts über den 
Blockierstrom und die Induktivität. Inwiefern könnten diese Werte denn 
eine Rolle spielen? Im Anhang dieses Post habe ich das Datenblatt mal 
hochgeladen.

: Bearbeitet durch User
von m.n. (Gast)


Lesenswert?

Ersetze mal die Attrappen von C1 und C4 durch richtige Kondensatoren
>= 2200 µF.
Ruckelt denn auch die PWM-Ansteuerung? Beim Programmieren vom Arduino 
wird gerne und viel falsch gemacht. Beispiel: delay() womöglich noch im 
Interrupt.

von Hubert G. (hubertg)


Lesenswert?

R5 und R10 ergeben, wie eingebaut, keinen Sinn. Du hast keine 
Stromüberwachung.

von aSma>> (Gast)


Lesenswert?

> Es zeigte sich kein Unterschied, obwohl laut Datenblatt vom STK681-332-E
> die PWM-Frequenz zwischen 32 und 62kHz (typ. 47kHz) liegen soll.

Das hast du hier falsch verstanden. Das ist die interne PWM für die 
Stromüberwachung.

Irgendwo wird mit max. PWM 50khz angepriesen.

Man muss die PWM so einstellen, dass der Rippelstrom des Motors vom 
Nennstrom <10% ist. Größtenteils hängt das von der anliegenden Spannung 
und der Motorinduktivität ab. Falls man einen Shunt hat, dann kann man 
mithilfe des Oszi sich ein Bild malen. Oder man rechnet ein wenig.

Ich würde erstmal C1/C4 etwas aufstocken (low esr cap!) + noch 100nF 
Kerko (X7R).

Weiterhin kann es sein, dass der Motor entstört werden muss.

> Vref soll unter 2V liegen (Datenblatt), was durch
> den Spannungsteiler mit R1 und R2 bzw. R6 und R7 auch umgesetzt wurde.
> Der DC/DC-Wandler wandelt von 24V auf 5V herunter.

Hier musst du mal die Datenblätter besser studieren:
>Vref = (R2 /(R1+R2))* VDD
>Output current peak (Iop) = (Vref/4.9)/Rs

Viel Erfolg.

von Dennis V. (lodennis) Flattr this


Angehängte Dateien:

Lesenswert?

>Ersetze mal die Attrappen von C1 und C4 durch richtige Kondensatoren
>>= 2200 µF.
>Ruckelt denn auch die PWM-Ansteuerung? Beim Programmieren vom Arduino
>wird gerne und viel falsch gemacht. Beispiel: delay() womöglich noch im
>Interrupt.

Die Kondesatoren habe ich so gewählt, weil es im Datenblatt so stand. 
Habe das entsprechende Schaltbild daraus mal im Anhang hinterlassen.

>R5 und R10 ergeben, wie eingebaut, keinen Sinn. Du hast keine
>Stromüberwachung.

Vielen Dank für den Hinweis... Wie geschrieben, ich möchte die 
Stromüberwachung später noch realisieren.

von m.n. (Gast)


Lesenswert?

Dennis V. schrieb:
> Die Kondesatoren habe ich so gewählt, weil es im Datenblatt so stand.
> Habe das entsprechende Schaltbild daraus mal im Anhang hinterlassen.

Das Datenblatt ist richtig schlecht!
Es finden sich keine Angaben zum Timing von den Ein- und Ausgängen.

von aSma>> (Gast)


Lesenswert?

m.n. schrieb:
> Das Datenblatt ist richtig schlecht!
> Es finden sich keine Angaben zum Timing von den Ein- und Ausgängen.

Wozu brauchst du die?

>On-chip output short-circuit detection function

>The maximum PWM frequency is 50kHz.

>The product can run at a minimum external PWM pulse width of 1µs.
>In the case when the high pulse width is less than 16µs, however,
>the IC may fail to detect a short-circuit condition when an output
>short-circuit occurs.

von Dennis V. (lodennis) Flattr this


Angehängte Dateien:

Lesenswert?

Ich habe den Fehler gefunden!
Tja, normalerweise würde ich ja sagen: "Da wäre ich nie drauf gekommen", 
aber ich hab's ja irgendwie doch herausgefunden.

Das Problem lag wohl in meiner Programmierung. Ich habe mir 
vorsichtigerweise diverse Größen und die Zyklusdauer über die serielle 
Schnittstelle vom Arduino (also USB) auf dem PC anzeigen lassen. Dazu 
musste ich entsprechende Serial-Befehle nutzen. Habe im Anhang mal 
entsprechende Zeilen aus meinen Code hinterlassen (die gemeinten Stellen 
habe ich mit lauter "////////" eingegrenzt). Genau in dem Rhythmus, in 
dem ich mit etwas habe ausgeben lassen, zuckten auch die Motoren. Und 
ich habe mir - wie ihr sehen könnt - echt viel anzeigen lassen. Ich 
vermute mal stark, dass es etwas mit der Zyklusdauer zu tun gehabt haben 
muss, da diese im Falle einer Ausgabe wohl ordentlich lang wurde. Mein 
Code besteht beinahe ausschließlich aus if-Abfragen und sollte somit 
eine recht kurze Zyklusdauer haben.

Nachdem ich sämtliche Ausgabebefehle aus meinem Code gelöscht habe 
laufen die Motoren sehr rund! Aber so richtig erklären kann ich mir das 
immernoch nicht. Hat jemand da vielleicht ein Idee? Hat es vielleicht 
doch nur etwas mit der seriellen Schnittstelle zu tun? Gehen da die 
PWM-Ausgänge vom Arduino vllt auf 100%, oder so?

Auch wenn das Problem beseitigt ist, wäre ich froh über Erklärungen der 
Ursache.

Gruß
Dennis

PS:
>Das Datenblatt ist richtig schlecht!

Auch wenn das Problem scheinbar nicht hier lag... ich finde das 
Datenblatt auch extrem schlecht. Es sind einige Fehler und Widersprüche 
enthalten. War echt ein Akt, die Schaltung nach dem Wisch umzusetzen.

von Joachim B. (jar)


Lesenswert?

Dennis V. schrieb:
> Hat es vielleicht
> doch nur etwas mit der seriellen Schnittstelle zu tun?

nicht vielleicht, sondern vermutlich sicher

je nach dem welche IDE, ist die serielle Ausgabe schon per IRQ und der 
Buffer ist auch nicht besonders groß HardwareSerial.ccp

von Einer K. (Gast)


Lesenswert?

Dennis V. schrieb:
> (über Pin 5 und 6 vom
> Arduino)

Pin 5 & 6 werden von Timer0 angesteuert.
Timer0 macht allerdings auch das millis() usw Gedöns.




Abhilfe:
Verwende die anderen Timer.
Dann sollte es auch keine Probleme mit der Seriellen geben.

von Joachim B. (jar)


Lesenswert?

U. F. schrieb:
> Abhilfe:
> Verwende die anderen Timer.
> Dann sollte es auch keine Probleme mit der Seriellen geben.

meinst du?


jede serielle Ausgabe die eine IRQ auslöst stoppt doch andere IRQ

mir war mal so das im IRQ IRQ gesperrt sind

wenn also per IRQ ständig Zeichen ausgegeben werden muss der PWM 
stottern wenn er in SW ist.

Ist die PWM nun SW oder HW ?

von Einer K. (Gast)


Lesenswert?

Joachim B. schrieb:
> meinst du?
Ich gehe davon aus, dass er HW PWM nutzt.

In https://www.arduino.cc/en/Reference/AnalogWrite findet sich ein 
Absatz "Notes and Known Issues"
Das Problem hat schon so manchem Pin 5&6 Nutzer einen Streich gespielt.
Z.B. flackernde LEDs.
Hier halt ein zuckender Motor.

Bei SW PWM kommt einem natürlich jeder Interrupt in die Quere.
Dagegen ist kein Kraut gewachsen.

von Huh (Gast)


Lesenswert?

Joachim B. schrieb:
> nicht vielleicht, sondern vermutlich sicher

Den Satz sollte man sich einrahmen (am besten golden) und ins Wohnzimmer 
hängen. :-D

von Dennis V. (lodennis) Flattr this


Lesenswert?

So, liebe Community,

ich konnte über's Wochenende leider nicht auf mikrocontroller.net 
zugreifen, deshalb nu die verspätete Antwort.
Vielen Dank erstmal für die Hilfe!
Ich habe jetzt die Pins 5 und 6 auf 9 und 10 verlegt. Klappt alles 
super! Die serielle Ausgabe habe ich nun zwar gelöscht, da ich sie nur 
zur Überprüfung meiner Variablen benötigte. Aber es ist gut zu wissen, 
dass ich diese nun notfalls doch noch nutzen kann.

>Ich gehe davon aus, dass er HW PWM nutzt.
Ja ich benutze die AnalogWrite-Funktion.

Weiter oben habe ich den Beitrag von aSma leider völlig übersehen:
>> Es zeigte sich kein Unterschied, obwohl laut Datenblatt vom STK681-332-E
>> die PWM-Frequenz zwischen 32 und 62kHz (typ. 47kHz) liegen soll.
>
>Das hast du hier falsch verstanden. Das ist die interne PWM für die
>Stromüberwachung.
>
>Irgendwo wird mit max. PWM 50khz angepriesen.

Das habe ich wohl tatsächlich missverstanden. Da ich aber nun Pin 9 und 
10 nutze, welche mit 31,25kHz laufen, sollte ich da wohl kein Problem 
mehr mit haben.

>> Vref soll unter 2V liegen (Datenblatt), was durch
>> den Spannungsteiler mit R1 und R2 bzw. R6 und R7 auch umgesetzt wurde.
>> Der DC/DC-Wandler wandelt von 24V auf 5V herunter.
>
>Hier musst du mal die Datenblätter besser studieren:
>>Vref = (R2 /(R1+R2))* VDD
>>Output current peak (Iop) = (Vref/4.9)/Rs

Die Formeln in diesen Passagen sind mir bestens bekannt und dienen 
meines Erachtens nur der Begrenzung des Stroms, welche mit dem im 
Datenblatt als Rs bezeichneten Widerstand umgesetzt werden kann aber 
nicht muss. Ursprünglich hatte ich das geplant, lasse nun aber doch die 
Finger davon, da mir für die Umsetzung des Projektes einfach die Zeit 
fehlt.

Nochmals vielen Dank, an alle die geholfen haben!

Beste Grüße
Dennis

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.