Forum: Mikrocontroller und Digitale Elektronik H-Brücken Wahl/Ansteuerung mit Atmega88


von D a v i d K. (oekel) Benutzerseite


Lesenswert?

Hi,

ich habe eine fertige (bereits Einsatz erprobte) DC-Motoransteuerung 
mittels 2 Relais(Umpolung) + IRFZ44N (Speed) und (nicht zugänglicher) 
Bascom Programmierung auf Atmega8 Basis.

Ich möchte gerne Platinendesign UND Programmierung (diesmal C++) 
überholen um  das Gerät dem wachsenden Kundenanforderungen anzupassen 
(2x16er HD44780 Display und sanfter Anlauf des Motors)

Auf Softwareseite wurde bislang mit dem IRFZ44N wohl eine sehr primitive 
Implementierung vorgenommen, denn jeh nach Stufe (50% 75% 100%) rast der 
Motor sofort mit dieser Drehzahl los)

Dort habe ich bereits ALLES in C++ neu/nachimplementiert doch die PWM 
Ansteuerung ist noch nicht perfect.

==Meine Fragen:==
Welchen PWM-Mode würdet ihr mir für diese Aufgabe empfehlen? (und 
welchen Takt)
Kann ich anstatt des IRFZ44N gleich den L6203 (bzw. (L6201PS) verwenden?
Oder doch eine diskrete H-Brücke aus IRFZ44N(s) aufbauen? [Nicht 
trivial? Bräuchte Beispiele/Hilfe]
Was sollte ich bei einer solchen integriertn H-Brücke noch alles 
beachten gegeben der folgenden Fakten:


VCC= 20-24V
IRFZ44N (41A!! hoffe die waren nur Reserve?)
L6201PS (4A 5A Peak--> 
https://www.mikrocontroller.net/articles/H-Brücken_Übersicht steht 
jedoch 10A Spitze, wie kommts?)
DC-Motor= 25W (mit der bestehenden Schaltung mal "festgehalten" bringt 
1,8A, dies würde sich mit der Faustformel Peak= Leistung *2 decken?)

Grüße Oekel

von Falk B. (falk)


Lesenswert?

@ D a v i d K. (oekel)

>Ich möchte gerne Platinendesign UND Programmierung (diesmal C++)

WOW! C++!!! Das muss je eine Super-Duper Motorsteuerung sein ;-)

>überholen um  das Gerät dem wachsenden Kundenanforderungen anzupassen
>(2x16er HD44780 Display und sanfter Anlauf des Motors)

Dazu reicht doch die vorhandene Hardware. Der MOSFET macht die 
Motoransteuerung mit PWM und die Relais die Umpolung für den 
Richtungswechsel.

>Auf Softwareseite wurde bislang mit dem IRFZ44N wohl eine sehr primitive
>Implementierung vorgenommen, denn jeh nach Stufe (50% 75% 100%) rast der
>Motor sofort mit dieser Drehzahl los)

Naja, das kann man ändern, rein in Software.

>Dort habe ich bereits ALLES in C++ neu/nachimplementiert

Welche C++ Spachelemente hast du denn da verwendet? ;-)

>Welchen PWM-Mode würdet ihr mir für diese Aufgabe empfehlen?

Ist egal. Akademisch gesehen sollte es ein glitchfreier sein, als beim 
AVR Phase/Frequency Correct Mode.

>(und welchen Takt)

Hängt vom Motor ab. Muss man mal probieren. Zwischen 50-10000 Hz PWM 
Frequenz ist vieles möglich.

>Kann ich anstatt des IRFZ44N gleich den L6203 (bzw. (L6201PS) verwenden?

Anstatt nicht, aber man kann die Relais und den MOSFET durch eine 
H-Brücke ersetzen.

>Oder doch eine diskrete H-Brücke aus IRFZ44N(s) aufbauen?

Nö.

> [Nicht
>trivial? Bräuchte Beispiele/Hilfe]

Such lieber nicht hier, hier gibt es viel zuviele schlechte 
Frickelbeispiele von planlosen H-Brücken.

>VCC= 20-24V

Können die meisten.

>IRFZ44N (41A!! hoffe die waren nur Reserve?)

Jaja, ich kann auch 1t hochheben . . .

>L6201PS (4A 5A Peak-->

Reicht das nicht?

>DC-Motor= 25W (mit der bestehenden Schaltung mal "festgehalten" bringt
>1,8A, dies würde sich mit der Faustformel Peak= Leistung *2 decken?)

Damit reicht der L6203 locker.

von m.n. (Gast)


Lesenswert?

Ich würde zum L6203 raten, wobei für IN1 und IN2 je ein eigener 
PWM-Kanal (eines Timers) verwendet wird. Die PWM-Frequenz sollte über 
dem Hörbereich liegen.
Schon immer einmal wollte ich ein Beispiel mit ATtiny45 dafür machen, 
bin aber bislang über einen Schaltplan nicht hinausgekommen. Bedarf?

Eine andere Möglichkeit wäre eine Drehzahlregelung mit dem IRFZ44, wobei 
die EMK gemessen und die PMW entsprechend angepaßt wird. Hier muß 
deutlich langsamer getaktet werden (100 - 300 Hz), damit man die 
Generatorspannung sauber messen kann. Dafür habe ich wohl auch ein 
Programm für den ATmega328 gemacht (Sollwertvorgabe mit Poti). Zur 
Umpolung ist aber noch ein Relais erforderlich.
Mit einem high-side-Treiber (BTS462) ist der Schaltungsaufwand etwas 
geringer und automatisch ein Überlastschutz vorhanden.

Mit einem anderen µC betreibe ich den L6203 mit 1%-Stufen von 0 - 100% 
und Rampen zum Anfahren und Bremsen.

von Falk B. (falk)


Lesenswert?

@ m.n. (Gast)

>Ich würde zum L6203 raten, wobei für IN1 und IN2 je ein eigener
>PWM-Kanal (eines Timers) verwendet wird. Die PWM-Frequenz sollte über
>dem Hörbereich liegen.

Nö. Weder muss sie das noch kann sie das bei allen Motoren.

von m.n. (Gast)


Lesenswert?

Falk B. schrieb:
> @ m.n. (Gast)
>
>>Ich würde zum L6203 raten, wobei für IN1 und IN2 je ein eigener
>>PWM-Kanal (eines Timers) verwendet wird. Die PWM-Frequenz sollte über
>>dem Hörbereich liegen.
>
> Nö. Weder muss sie das noch kann sie das bei allen Motoren.

Offensichtlich fehlt in Deinem Wortschatz das Wort "sollte".
Ich verwende nur Motore, die sich betreiben lassen, ohne mir die Ohren 
vollzupfeifen.

von D a v i d K. (oekel) Benutzerseite


Lesenswert?

m.n. schrieb:
> Ich würde zum L6203 raten,

Wäre auch mein Favorit, einfach weil ich SMDs liebe und die geplante 
Verkleinerung mit den Relais schwer realisierbar ist. Zwischen den 
Zeilen haben ich AUCH bei Falk gelesen, dass es problemlos machbar 
"wäre"?

> wobei für IN1 und IN2 je ein eigener
> PWM-Kanal (eines Timers) verwendet wird.

Kann ich machen (statt PWM am Enable), die PRO-Begründung für diese 
Ansteuerung ist mir nur noch nicht klar.

> Mit einem anderen µC betreibe ich den L6203 mit 1%-Stufen von 0 - 100%
> und Rampen zum Anfahren und Bremsen.

Du schriebst etwas von diversen Code-Bespielen und "Bedarf?".
Klar ein Blick auf Fremde Schnipsel zur Ideenbereicherung kann nie 
schaden.

@Falk: Welche Foren/Schaltbeispiele könnte ich mir denn mal anschauen, 
um die äußerern Beschaltungen der Brücke richtig zu dimensionieren? 
(Speziell Boot1/2 müsste ich nun eher raten.

Oder ist Figure 17: Bidirectional DC Motor Control (aus dem Datenblatt) 
für meinen Anwendungsfall schon ideal und kann 1:1 übernommen werden?

Grüße Oekel

PS: zu C++ : ja ich weiß, dass es zu 99,9% C Konstrukte sind und C++ 
garnicht seine Vorteile ausspielen kann. Oder war der Wink mit dem 
Zaunpfahl in eine andere Richtung?

von Falk B. (falk)


Lesenswert?

@ D a v i d K. (oekel)

>> wobei für IN1 und IN2 je ein eigener
>> PWM-Kanal (eines Timers) verwendet wird.

>Kann ich machen (statt PWM am Enable), die PRO-Begründung für diese
>Ansteuerung ist mir nur noch nicht klar.

Mit der PWM an IN1/2 kann man aktiv bremsen. Mit PWM an ENA nicht.
Wenn man nur eine einfache Richtungsumschaltung mit PWM Steuerung 
braucht, reicht auch EIN PWM Kanal an IN1 oder IN2. Den Rest kann man 
per Software machen (Invertierten PWM-Wert bei Richtungsumkehr 
ausgeben).

>@Falk: Welche Foren/Schaltbeispiele könnte ich mir denn mal anschauen,
>um die äußerern Beschaltungen der Brücke richtig zu dimensionieren?
>(Speziell Boot1/2 müsste ich nun eher raten.

Beim L620x reicht ein Blick ins Datenblatt. Was ist an 2 einfachen 15nF 
Kondensatoren groß zu beschalten?

>Oder ist Figure 17: Bidirectional DC Motor Control (aus dem Datenblatt)
>für meinen Anwendungsfall schon ideal und kann 1:1 übernommen werden?

Ja, wobei der Snubber mit 10 Ohm/22nF und die beiden Extradioden BYW98 
nicht wirklich benötigt werden. Die hat möglicherweise ein Praktikant 
aus alten Schaltungen mit anderen ICs einfach rüberkopiert ;-)

>PS: zu C++ : ja ich weiß, dass es zu 99,9% C Konstrukte sind und C++
>garnicht seine Vorteile ausspielen kann.

Eben.

>Oder war der Wink mit dem Zaunpfahl in eine andere Richtung?

Nein.

von D a v i d K. (oekel) Benutzerseite


Lesenswert?

Ok, letzte Frage, da ich mich gerade sehr schwer tue das Datenblatt 
bezüglich  "Compare Match output Pins" (PWM) zu überfliegen.

Welche beiden sollte ich kombiniert für die H-Brückenansteuerung 
verwenden können?
Zur Auswahl stehen:
OC0A
OC0B

OC1A
OC1B

OC2A

Die Frage läuft darauf hinaus, dass ja eigentlich immer nur EIN PWM 
Signal generieren brauche, welches ich dann an zwei verschiedenen Pins 
ausgebe. Dabei soll auch (nur) der zweite PIN "schweigen" und nicht 
wegen der Logikverknüpfung des Atmeagas  komische Seiteneffekte 
veranstalten, wenn ich ihn auf PWM-Mode = Dissable setze.

Also besser OC0A & OC0B
oder OC0A & OC1A?

Grüße Oekel

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@ D a v i d K. (oekel)

>Welche beiden sollte ich kombiniert für die H-Brückenansteuerung
>verwenden können?

Ist egal, da du eigentlich nur EIN PWM Signal brauchst. Der andere IN 
Kanal wird statisch geschaltet!

>OC1A
>OC1B

Das ist Timer 1, der ist 16 Bit und etwas flexibler.

>Die Frage läuft darauf hinaus, dass ja eigentlich immer nur EIN PWM
>Signal generieren brauche, welches ich dann an zwei verschiedenen Pins
>ausgebe.

Nein, es reicht EIN PWM Signal.

von M. N. (Gast)


Lesenswert?

Soweit ich das heute bei Sonnenschein zusammenstellen konnte: 
Beitrag "Drehzahlregler für DC-Motor, ATmega48-328"
;-)

von D a v i d K. (oekel) Benutzerseite


Angehängte Dateien:

Lesenswert?

Falk B. schrieb:

> Nein, es reicht EIN PWM Signal.

Mein Basiswissen ist nicht sonderlich ausgeprägt, was die H-Brücke 
angeht.
(https://de.wikipedia.org/wiki/Vierquadrantensteller)
Dabei bekomme ich im Kopf: 
https://de.wikipedia.org/wiki/Vierquadrantensteller#/media/File:Ansteuerlogik_H-Bruecke.svg
noch nicht auf:
https://de.wikipedia.org/wiki/Datei:Vierquadrantensteller-tiefsetzsteller-linkslauf.svg
gemappt :(

Habe aber Mal die Schaltung fertig gemacht und würde mich freuen, wenn 
Jemand kurz drüber schauen könnte. (Dann könnte ich einen Prototypen 
anfertigen lassen und weiter mit dem C-Code spielen ;)



M. N. schrieb:
> Beitrag "Drehzahlregler für DC-Motor, ATmega48-328"
> ;-)

Danke, ich hoffe/denke, dass sollte auch mit der H-Brücke funktionieren.
Wie genau berechnet sich denn die maximale PWM-Frequenz aus der 
Reaktionszeit des ADCs?

Grüße Oekel

von m.n. (Gast)


Lesenswert?

D a v i d K. schrieb:
> Danke, ich hoffe/denke, dass sollte auch mit der H-Brücke funktionieren.

Das ist nicht so einfach, da bei einer Regelung mit L6203 PWM am ENABLE 
liegen und die EMK irgendwo auf fliegendem Potential gemessen werden 
müssen. Anders wäre es, zwei Halbbrücken zu nehmen, bei der jede einen 
separaten Enable-Eingang hat.

> Wie genau berechnet sich denn die maximale PWM-Frequenz aus der
> Reaktionszeit des ADCs?

Willst Du nur steuern mit 25, 50, 75, 100% oder die Drehzahl auch 
regeln?
Um nur zu steuern, gibts Du beim L6203 das Tastverhältnis der PWM 
entsprechend vor. Hier kannst Du eine hohe PWM-Frequenz verwenden. Dabei 
reicht die 8 Bit Auflösung von T0 oder T2. T1 wäre mir zu schade dafür, 
aber das ist egal, solange T1 sonst nicht gebraucht wird.
Wichtig ist, wie Du es auch gezeichnet hast, daß die PWM-Signale auf IN1 
und IN2 kommen. ENABLE sollte einen Pulldown-Widerstand bekommen, damit 
die Brücke beim Einschalten passiv ist.

Erst wenn Du mit der EMK regeln willst, kommt der ADC ins Spiel, dessen 
Reaktionszeit aber relativ egal ist. In meinem Beispiel mit IRFZ34N 
lasse ich alle ADC-Kanäle permanent einlesen und bewerte die 
Motorspannung erst direkt vor dem Einschalten der PWM. Wie hoch die 
PWM-Frequenz sein kann, hängt in erster Linie vom verwendeten Motor ab. 
Bei hohem Tastverhältnis (= hoher Drehzahl) muß noch Zeit gelassen 
werden, damit der Rückschlagimpuls über die Freilaufdiode abgeklungen 
ist. Bilder vom Skope finde ich momentan nicht, aber sieh Dir das Signal 
selber an.
Die Regelung ist gut für langsame Drehzahlen und schwankende Last 
geeignet. Ob die Versorgungsspannung nun 8 V oder 15 V beträgt, die 
Drehzahl bleibt stabil. Bei höherer Drehzahl muß auf jeden Fall auch die 
Versorgungsspannung hoch sein, und wenn Du einen 24 V Motor hast, dann 
ruhig 30 V.

Um Rampen einzubauen, mußt Du dafür sorgen, daß die Änderung des 
Sollwertes begrenzt wird. Man kann entweder filtern, oder im z.B. 100 Hz 
Raster eine maximale Änderung zulassen. Wenn z.B. alle 10 ms der 
Sollwert sich nur um 1% ändern kann, wird die Rampe von 0 - 100% eine 
Sekunde brauchen.

Noch etwas zu Deiner Schaltung. Du wolltest einen ATmega88 nehmen, dann 
nutze ihn auch mit seinen verbesserten Eigenschaften gegenüber einem 
Mega8. Der ADC hat eine interne 1,1 V Referenz, sodaß der LM358 das 
Stromsignal des L6203 nicht verstärken muß. Selber bin ich bei diesen 
Strommessungen immer recht großzügig mit der Verlustleistung. Pro 1 A 
Motorstrom nehme ich 1 Ohm Widerstände und lasse Vref bei 5 V.
Wie gesagt, beim Mega88 bieten auch T0 und T2 jeweils zwei PWM-Ausgänge.

Feierabend!

von D a v i d K. (oekel) Benutzerseite



Lesenswert?

So "Feierabend" -->Morgen wird ein harter Arbeitstag :(

Hat einer die Zeit noch mal drüber zu schauen?
Insbesondere auch die brd, ob ich irgendein Bauteil offensichtlich 
unterdimensioniert habe.

[Der OpAmt ist eine optionale Bestückung]

Gibt es noch elegantere (günstige) Möglichkeiten das Netzteil von 20-30V 
--> 5V zu designen?

Grüße Oekel

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Mir fällt auf, das du C13 (den dicken Elko) sehr weit weg vom 
eigentlichen Störer, nämlich der Motorendstufe, plaziert hast. Der 
sollte in die unmittelbare Nähe des Dings, damit die Störungen des 
Motors nicht auf der ganzen Platine mit ihren relativen dünnen Bahnen 
herumschwirren.

Am besten trennst du Leistungs- und Steuerteil weit voneinander und 
sorgst für klare Verhältnisse von Masse und VCC.

m.n. schrieb:
> Um Rampen einzubauen, mußt Du dafür sorgen, daß die Änderung des
> Sollwertes begrenzt wird. Man kann entweder filtern, oder im z.B. 100 Hz
> Raster eine maximale Änderung zulassen. Wenn z.B. alle 10 ms der
> Sollwert sich nur um 1% ändern kann, wird die Rampe von 0 - 100% eine
> Sekunde brauchen.

Ich baue für solche Fälle meistens schon mal den PID Regler aus AVR221 
mit ein und setzte die Parameter erstmal auf null (speichern tue ich sie 
im EEPROM).
Im simpelsten Fall (nur steuern) schicke ich die Einstellwerte auf den 
PID und nutze den Ausgang für die Endstufe. Dann kann man mit I die 
Rampenzeit schon mal steuern und mit P und D den Endwert treffen.

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


Lesenswert?

Matthias S. schrieb:
> Ich baue für solche Fälle meistens schon mal den PID Regler aus AVR221

Wozu? Es handelt sich hier um einen Drehzahlsteller und nicht um einen 
Regler. Sofern ich in einer Beispielschaltung shunt-Widerstände 
eingefügt habe, dienen diese der Überstromerkennung. Die aktuelle 
Drehzahl aus dem Strom abzuleiten dürfte bei PWM-Ansteuerung etwas 
aufwendiger sein.


D a v i d K. schrieb:
> Gibt es noch elegantere (günstige) Möglichkeiten das Netzteil von 20-30V
> --> 5V zu designen?

Hier können die Bauteile deutlich kleiner gewählt werden:
http://www.reichelt.de/MCP-16331T-E-CH/3/index.html?&ACTION=3&LA=446&ARTICLE=153661&artnr=MCP+16331T-E%2FCH&SEARCH=mcp16

R35 kann 10 kOhm betragen und vor dem ADC-Eingang wäre ein Kondensator 1 
- 10 nF sinnvoll. D7 wird nicht gebaucht.
Da Du SMD bestücken möchtest, wäre der L6201PS auf kleiner Fläche schwer 
zu kühlen. Eine Alternative wäre ein VNH2SP30, beim dem RDSon um Faktor 
10 kleiner ist und damit deutlich weniger Verlustleistung anfällt. Er 
kann bis zu 20 kHz getaktet werden.
Wenn Du bei Schukat kaufen kannst: 
https://www.schukat.com/schukat/schukat_cms_de.nsf/index/CMSFFEDE67DB7032C11C1256DF1003EF651?OpenDocument&wg=B1495&refDoc=CMSFAE64106A6555CCAC125716200277FC7&kb=VNH2SP30#VNH2SP30

von m.n. (Gast)


Lesenswert?

m.n. schrieb:
> Eine Alternative wäre ein VNH2SP30,

Es muß ein VNH3SP30 sein, da nur dieser auch die höhere 
Versorgungsspannung von 24 V aushält. PWMmax. liegt dann bei 10 kHz.
Bezug: 
http://www.reichelt.de/VNH-3SP30/3/index.html?&ACTION=3&LA=446&ARTICLE=115923&artnr=VNH+3SP30&SEARCH=vnh3

von m.n. (Gast)


Lesenswert?

Zur Ansteuerung eines L6203 mit einem ATtiny25 gibt es nun auch ein 
Programm: Beitrag "Re: Drehzahlregler für DC-Motor, ATmega48-328"

von Joe (Gast)


Lesenswert?

Wer sucht der findet BTS7960b H-Brücken mit 28V / 40A

Auf der Seite  http://ups.bplaced.de  habe ich auch was gefunden.

Die Ansteuerung ist im Schaltplan und auch in der BASCOM Software 
beschrieben.

Die Brücken werden mit 16kHz betrieben, nicht hörbar!


Joe

von D a v i d K. (oekel) Benutzerseite


Lesenswert?

m.n. schrieb:
> m.n. schrieb:
>> Eine Alternative wäre ein VNH2SP30,
>
> Es muß ein VNH3SP30 sein, da nur dieser auch die höhere
> Versorgungsspannung von 24 V aushält. PWMmax. liegt dann bei 10 kHz.
> Bezug:
> 
http://www.reichelt.de/VNH-3SP30/3/index.html?&ACTION=3&LA=446&ARTICLE=115923&artnr=VNH+3SP30&SEARCH=vnh3

Kann mir Jemand sagen, ob bzw. warum nicht der VNH7013XP
http://www.mouser.com/ds/2/389/DM00040392-251551.pdf

Für diesen Anwendungsfall funktionieren würde?
(Preislich fast die Hälfte vom VNH3SP30)

Grüße Oekel

von Falk B. (falk)


Lesenswert?

@ D a v i d K. (oekel)

>Kann mir Jemand sagen, ob bzw. warum nicht der VNH7013XP
>http://www.mouser.com/ds/2/389/DM00040392-251551.pdf

Der geht bei 24V Versorgung auch, denn die MOSFETs haben 36V 
Durchbruchspannung, da ist ausreichend Luft.

>Für diesen Anwendungsfall funktionieren würde?
>(Preislich fast die Hälfte vom VNH3SP30)

Ja, aber der VNH3SP30 ist ein VOLLSTÄNDIGER Treiber incl. 
Pegelwandler während der VNH7013XP nur 4 MOSFETs enthält.

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.