Liebes Forum, ich habe mich in den letzten Tagen an einem Projekt versucht bei dem ich nicht weiterkomme. Ich weiß auch nicht so recht ob das überhaupt möglich ist. Im deutsprachigen Arduino-Forum konnte man mir leider nur sagen, dass mein Vorhaben grundsätzlich funktioniert aber konkret scheint auch niemand eine Idee zu haben wie ich das umsetzen könnte. Darum versuche ich es hier nochmal. Der Arduino soll einen Cmos Mosfet via PWM (ca. 1 kHz) so regeln, dass selbiger aus der Drehzahlabhängigen Ausgangsspannung eines Generators (0 - max. 60V) eine stabile Ausgangsspannung (13,8V)erzeugt. (Als Stromversorgung für den Arduino nehme ich zunächst einmal eine unabhängige Stromversorgung an). Dazu messe ich die Ausgangsspannung nach dem Mosfet und versuche den Arduino dazu zu bringen den PWM-Wert zu vergrößern, wenn die Spannung unter einen bestimmten Wert sinkt und zu verkleinern wenn die Spannung über einen bestimmten Wert steigt. (Mir ist schon klar, dass das mit einem Regler IC einfacher und effektiver geht. Ich verbaue aber zur Spannungs- und Strommessung und zur Anzeige selbiger an einem PC sowieso einen Arduino. Deshalb bietet es sich an das so zu versuchen.) Nun mal zu meinen etwas kläglichen Programierversuchen. Ich messe die Ausgnagsspannung nach dem Mosfet über einen Spannungsteiler. Ich lege die int=pwmvalue fest und gebe ihr zunächst den Wert 0. Im Loop versuche ich dann das: if (Ausgangsspannung > 13.8) {analogWrite(6, pwmvalue--);} if (Ausgangsspannung < 13.8) {analogWrite(6, pwmvalue++);} Das funktioniert aber leider nicht. Die testweise angeschlossene 35W Halogenlampe wird heller und wieder dunkler geregelt. Hat jemand eine Idde wie man sowas programmieren könnte? Ich weiß, dass ein richtiger Abwärtsregler dann noch eine Spule und einen Elko benötigt. Das Berechnungstool für Abwärtswandler unter http://schmidt-walter.eit.h-da.de/smps/abw_smps.html brechnet mir für einen Wandler mit 1kHz, 60V max. Eingansspannung und 25A max. Ausgangsstrom eine Spule mit 1100 uH. Stimmt das so und was für einen Elko benötige ich? Je größer desto besser?
:
Verschoben durch Moderator
Hallo, ich glaube so wird das nichts. Ein gängiger Ansatz ist über den Controller lediglich eine Referenzspannung vorzugeben und die Regelung per Hardware, z.B. OPV oder Komparator, vorzunehmen. Die Kette wäre dann wie folgt: 1. Controller ezeugt PWM 2. PWM wird tiefpass-gefiltert was eine Gleichspannung ergibt die der mittleren Spannung des PWM-Signals entspricht. 3. Die Gleichspannung gibt man als Spannungsreferenz auf einen OPV oder Komparator 4. Der OPV/Komparator vergleicht die Spannungsreferenz mit der per Spannungsteiler aka Shunt abgegriffenen Ausgangsspannung und steuert entsprechend der gemessenen Differenz den MOSFET an Die Regelung wird dabei allein vom OPV/Komparator übernommen und kann dadurch wesentlich schneller erfolgen als es mit dem Controller möglich ist. Siehe auch: http://www.mikrocontroller.net/articles/Konstantstromquelle#Konstantstromquelle_mit_Komparatoren http://www.mikrocontroller.net/articles/Stromsenke Viele Grüße Daniel
:
Bearbeitet durch User
Tim programmierte: >if (Ausgangsspannung > 13.8) {analogWrite(6, pwmvalue--);} >if (Ausgangsspannung < 13.8) {analogWrite(6, pwmvalue++);} Was ist, wenn die Spannung genau 13,8 Volt beträgt? MfG Paul
Vielen Dank für Eure Aatworten. Ich dachte mir schon, dass das nicht so einfach wird. Ich werde mich heute Abend nochmal hinsetzen und mich mit dem Beitrag von Daniel H. befassen. Auf die Schnelle is tmir das zu hoch ;-) Paul Baumann. Wenn die Spannung genau 13,8V beträgt, dann stimmt die Spannung ja und der PWM-Wert muss nicht verändert werden. Oder?
Was ist wenn vom Generator weniger wie 13,8V kommen? Dann brauchst du einen anderen wandler ;)
Jörg Esser: Weniger ist nicht schlimm. Evt. sogar vorteilhaft. Ich würde den Wandler evt. unter 5V abschalten lassen, dann bis 13,8V voll durchsteuern und ab 13,8V regeln. Aber wieso funktioniert der Sketch so nicht? Hat einer eine Idee? Wenn ich das richtig sehe verringert der Arduino den Wert bis 0 und fängt dann wieder bei 255 an. Kann ich das irgendwie verhindern?
Tim Baudermann schrieb: > Ich dachte mir schon, dass das nicht so > einfach wird. Es sieht auf den ersten Blick komplizierter aus als es ist. Der Vorteil der Lösung mit Komparator (empfiehlt sich wenn man einen Schaltregler aufbauen möchte) ist, dass der MOSFET (bei geeigneter Wahl des Komparators) deutlicher schneller als mit 1 kHz angesteuert und dadurch die Größe der Induktivität deutlich reduziert werden kann. Bei 1kHz brauchst du eine Induktivität mit etwa 1mH. Diese muss gemäß Tool aber 30A Spitze (Ripple!) aushalten. Eine derartige Induktivität kostet bei Mouser z.B. 60€ und wiegt 2kg. Erhöht man die Frequenz nun auf 100kHz so benötigt man nur noch 10µH. Diese Induktivität kostet dann auch nur noch knapp 4€ und wiegt um die 30g.
OK, jetzt habe ich mir den Vorschlag von Daniel H. mal durch den Kopf gehen lassen. So richtig verstehen tu ich's aber nicht. Kommt da nicht sowas wie ein Linearregler bei raus? Wieso sollte der Komperator/OPV denn PWM Signale geben? Dass die Spannung schneller angeglichen würde ist natürlich sehr gut. Der Atmega ist da - zumindest wenn der PWM Wert pro Durchlauf immer nur um 1 erhöht wird - nicht so schnell Das mit der höheren Frenquenz macht auch durchaus Sinn. Schade, dass der Atmega selbst nur 1kHz kann. Gibt es denn Microcontroller die selbst ein PWM Signal mit höherer Frequenz geben können? Ich hatte auch schon eine Spule mit 1mH und 25A rausgesucht, die bei RS ca. 20€ kostet. Das ist aber immer noch ziemlich viel. Hat niemand eine Idee wie man den Sketch hinbekommen könnte. Wie bringe ich den Atmega dazu mit der Werterhöhung bei 255 aufzuhören und nicht wieder bei 0 anzufangen nachdem er bis 255 hochgezählt hat? Ich möchte versuchen das Projekt so einfach wie möglich zu halten, nicht zuletzt um es meinen elektrotechnischen und programiertechnischen Kennmissen anzupassen ;-)
Keine Ahnung, warum das Ganze nicht geht. Ich würde aber ein bisschen Hysterie entwickeln. Eigentlich sollte klar sein, dass Regelungen auf Gleichheit nicht das Gelbe vom Ei sind.
Wenn er die mit PWM gepulste Spannung über einen Spannungsteiler direkt zurück in den ADC-Eingang des Controllers gibt, misst der irgendeine Spannung und inkrementiert/dekrementiert entsprechend immer weiter hoch/runter. Und da er vermutlich niemals die gewünschten 13,8V misst, wird er immer weiter inkrementieren bis er wieder bei 0 angekommen ist. :-) Um die Spannung korrekt zu messen wäre mindestens ein R-C-Tiefpass mit OpAmp vor dem ADC sinnvoll.
Tim Baudermann schrieb: > Kommt da nicht sowas wie ein Linearregler bei raus? Kommt darauf an, was man damit aufbaut. Nur mit OPV und MOSFET wird es ein Linearregler. Packe noch eine Induktivität und eine Diode dazu und du hast einen Schaltregler. Und da im zweiten Fall der MOSFET nicht mehr linear geregelt werden soll nimmt man dann statt des OPV besser direkt einen Komparator. Tim Baudermann schrieb: > Wieso sollte der Komperator/OPV denn PWM Signale geben. Weil er die gemessene Ausgangsspannung mit einer Referenzspannung vergleicht und in Abhängigkeit von der Differenz den MOSFET an- oder abschaltet. Sprich: Ausgangsspannung zu klein => Transistor an => Ausgangsspannung steigt Ausgangsspannung zu groß => Transistor aus => Ausgangsspannung sinkt Und je nachdem wieviel zu groß oder zu klein die Ausgangsspannung ist wird auch mehr oder weniger lange an- und abgeschaltet. Tim Baudermann schrieb: > Der Atmega ist da - zumindest wenn der PWM Wert pro Durchlauf immer nur > um 1 erhöht wird - nicht so schnell Was aber nichts macht wenn man ihn verwendet um die Referenzspannung für den Komparator zu erzeugen, da hier die Geschwindigkeit nicht so entscheidend ist. Tim Baudermann schrieb: > Hat niemand eine Idee wie man den Sketch hinbekommen könnte. Wie bringe > ich den Atmega dazu mit der Werterhöhung bei 255 aufzuhören und nicht > wieder bei 0 anzufangen nachdem er bis 255 hochgezählt hat? Dein Problem wird sein, dass du fortlaufend eine Spannung misst die kleiner als 13,8V ist. Dadurch wird dein Zähler solange erhöht bis er den Wertebereich eines Bytes (=> 255) überschreitet und wieder bei 0 anfängt. Ursache könnte sein, dass aufgrund von Verlusten, Störungen o.ä. tatsächlich niemals 13,8V hinter dem MOSFET gemessen werden. Viele Grüße Daniel Edit: Die Anmerkung von Florian bzgl. Filterung vor dem ADC halte ich auch für sehr sinnvoll.
:
Bearbeitet durch User
Tim Baudermann schrieb: > Das mit der höheren Frenquenz macht auch durchaus Sinn. Schade, dass der > Atmega selbst nur 1kHz kann. Gibt es denn Microcontroller die selbst ein > PWM Signal mit höherer Frequenz geben können? Ja, der dsPIC33FJ16GS502 zum Beispiel kommt bis auf 3.75MHz bei 8 bit Auflösung. > Wie bringe > ich den Atmega dazu mit der Werterhöhung bei 255 aufzuhören und nicht > wieder bei 0 anzufangen nachdem er bis 255 hochgezählt hat?
1 | if(Ausgangsspannung<13.8&&pwmvalue<255) |
2 | pwmvalue++; |
und um den Unterlauf zu verhuindern
1 | if(Ausgangsspannung>13.8&&pwmvalue>0) |
2 | pwmvalue--; |
Hast du eigentlich schon mal drüber nachgebracht was mit der Ausgangsspannung passiert wenn das Programm aus irgendeinem Grund abstürzen sollte?
:
Bearbeitet durch User
Tim Baudermann schrieb: > Das mit der höheren Frenquenz macht auch durchaus Sinn. Natürlich. Kein Mensch betreibt einen Schaltwandler mit 1kHz. Das fängt frühestens so bei 10kHz an und geht bis in den MHz-Bereich. Die meisten Wandler arbeiten so zwischen 50 und 200kHz, weil sich für viele Awendungen ungefähr in diesem Frequenzbereich ein Optimum ergibt. > Schade, dass der > Atmega selbst nur 1kHz kann. Das ist doch Unsinn. > Gibt es denn Microcontroller die selbst ein > PWM Signal mit höherer Frequenz geben können? AVRs können 8Bit-PWM mit 1/256stel der Taktfrequenz. Da die höchstmögliche Taktfrequenz 20MHz ist, wäre also die höchstmögliche Frequenz für eine 8Bit-PWM 20.000.000/256 = 78,125kHz. Die AVRs sind aber nicht zwingend auf 8 Bit PWM-Auflösung festgelegt. Man kann die Auflösung verringern und damit gleichzeitig im gleichen Maße die PWM-Frequenz erhöhen. Die allgemeine Formel für die maximale PWM-Frequenz ist (für FastPWM): fPWM = Systemtakt/2^AuflösungsBits Für die anderen möglichen PWM-Modi, die aber für eine Schaltwandler-Anwendung unwichtig sind, mußt du das Ergebnis noch einmal durch zwei teilen. > Wie bringe > ich den Atmega dazu mit der Werterhöhung bei 255 aufzuhören und nicht > wieder bei 0 anzufangen nachdem er bis 255 hochgezählt hat? Du lernst Programmieren. > Ich möchte versuchen das Projekt so einfach wie möglich zu halten, nicht > zuletzt um es meinen elektrotechnischen und programiertechnischen > Kennmissen anzupassen ;-) Wenn du nicht mal eine "gesättigte" Addition oder Subtraktion selbstständig hinbekommst, dann sind Schaltwandler eine Anwendung, die deine Fähigkeiten mit Sicherheit noch völlig überfordern. Also mußt du entweder deine Fähigkeiten durch Lernen ausbauen oder dir ein Projekt aussuchen, was du mit den vorhandenen Fähigkeiten realisieren kannst.
c-hater schrieb: > Also mußt du > entweder deine Fähigkeiten durch Lernen ausbauen oder dir ein Projekt > aussuchen, was du mit den vorhandenen Fähigkeiten realisieren kannst. oder nach einem SMPS Shield mit fertiger Lib suchen.
Diese primitive Regelung hat noch einen Haken: NACHDEM erkannt wurde, dass die Ausgangsspannung zu hoch ist, wird die Pulsweite angepasst. Dies zeigt VERZÖGERT Wirkung, weil Spule und Kondensator ja ein Tiefpass sind. Dass heisst, der Mikrocontroller wird trotz Anpassung der PWM weiterhin eine gewisse Zeit lang die Information "Spannung zu hoch" erhalten und demzufolge die Pulsweite zu sehr ändern. Das wiederrum hat zur Folge, dass die Ausgangssapnnug zu weit absinkt. Bis der Controller das merkt, ist die Pulsweite schon viel niedriger, als sie sein sollte. So entsteht eine Schwingung. Lies dich mal zum Thema PID Regler ein. Diese Regler arbeiten mit drei Komponenten (statt nur einer, wie dein Regler) und sie sind durch Faktoren einstellbar. Bei richtiger Einstellung entsteht keine Schwingung.
Max H. schrieb: >> Das mit der höheren Frenquenz macht auch durchaus Sinn. Schade, dass der >> Atmega selbst nur 1kHz kann. Gibt es denn Microcontroller die selbst ein >> PWM Signal mit höherer Frequenz geben können? > Ja, der dsPIC33FJ16GS502 zum Beispiel kommt bis auf 3.75MHz bei 8 bit > Auflösung. Die DSPs der TI TMS320C674x Serie (10$/Stück) können 3x eHRPWM mit ca. 200ps (!) Auflösung. Reicht bei 100 kHz für fast 16 Bit Auflösung bzw. fast 20 MHz bei 8 Bit... und den Regler rechnet er auch schnell genug ;-)
Hallo Tim, also: Der Arduino auf Basis 328 ist und bleibt ein stinknormaler µC von der fa. Atmel. Dieser kann (siehe Datenblatt) 67,5 kHz rausbringen. Wie? byte DeineGewuenschtePWM=0; #define TIMER_CLK_DIV1 0x01 void setup() { pinMode(11,OUTPUT); TCCR2A = _BV(COM2A1) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20); TCCR2B = _BV(TIMER_CLK_DIV1); } void loop(){ OCR2A = DeineGewuenschtePWM; } Achtung: Code ungeprüft, müsste aber so funzen. Deine Regelung: Im Ansatz richtig, leider aber untauglich. Der Regler benötigt eine logarithmische NAchregelung, d.h. kleine Regelabweichung, kleine Korrektur Deiner PWM-Breite, große Abweichung= große Korrektur. Weiterhin solltest Du eine Totzeit einbauen. Da der Arduino nur 0-255 kann wirst Du immer eine bleibende Regelabweichung behalten. Dein Projekt: Du musst mehr probieren, gerade (muss ich leider sagen) in diesem Forum sind nur wenige bereit, Anfängern geduldig über den Weg zu helfen. Im Gegenzug solltest Du so viel wie möglich versuchen selber zu ergründen. Hier wissen einige Leute viel, wollen aber auch nicht für Dich "entwickeln" um Dir dieses Stück unseres Hobbies abzunehmen. Viele Grüße Jörg
Ich versuche mal auf möglichst viele Beiträge zu antworten: > Wenn er die mit PWM gepulste Spannung über einen Spannungsteiler direkt > zurück in den ADC-Eingang des Controllers gibt, misst der irgendeine > Spannung und inkrementiert/dekrementiert entsprechend immer weiter > hoch/runter. Und da er vermutlich niemals die gewünschten 13,8V misst, > wird er immer weiter inkrementieren bis er wieder bei 0 angekommen ist. > :-) Um die Spannung korrekt zu messen wäre mindestens ein R-C-Tiefpass > mit OpAmp vor dem ADC sinnvoll. Danke. Das war ein sehr hilfreicher Hinweis. Ich habe das überprüft und den Arduino die Messergebnissen via serielprint ausgeben lassen. Da kommen tatsächlich äußerst seltsame Werte raus. Ein einfacher Elko hilft da auch nicht weiter. >if(Ausgangsspannung<13.8&&pwmvalue<255) > pwmvalue++; > >und um den Unterlauf zu verhuindern > >if(Ausgangsspannung>13.8&&pwmvalue>0) > pwmvalue--; Danke. Dass ich da nicht selbt drauf gekommen bin schreibe ich mal meiner mangelden Erfahrung zu ;-) >oder nach einem SMPS Shield mit fertiger Lib suchen. Das wäre mir natürlich am liebsten. Ich habe auch schon gesucht, bin aber leider nicht fündig geworden - zumindest nicht in diesem Leistungsbereich. Wenn jemand Bezugsquellen kennt bin ich für jeden Hinweis dankbar. >Diese primitive Regelung hat noch einen Haken: > >NACHDEM erkannt wurde, dass die Ausgangsspannung zu hoch ist, wird die >Pulsweite angepasst. Dies zeigt VERZÖGERT Wirkung, weil Spule und >Kondensator ja ein Tiefpass sind. > >Dass heisst, der Mikrocontroller wird trotz Anpassung der PWM weiterhin >eine gewisse Zeit lang die Information "Spannung zu hoch" erhalten und >demzufolge die Pulsweite zu sehr ändern. > >Das wiederrum hat zur Folge, dass die Ausgangssapnnug zu weit absinkt. >Bis der Controller das merkt, ist die Pulsweite schon viel niedriger, >als sie sein sollte. > >So entsteht eine Schwingung. > >Lies dich mal zum Thema PID Regler ein. Diese Regler arbeiten mit drei >Komponenten (statt nur einer, wie dein Regler) und sie sind durch >Faktoren einstellbar. Bei richtiger Einstellung entsteht keine >Schwingung. Sowas hatte ich befürchtet. Darum hatte ich zu Beginn gefragt ob dieses Projekt so überhaupt realisierbar ist. In diesem Fall brauche ich wohl nicht weiter zu machen, denn mir das dafür notwendige Fachwissen anzueignen lässt sich leider nicht mit meinem Zeitbudget und vor allem mit dem meiner Kinder in Einklang bringen ;-) >Der Arduino auf Basis 328 ist und bleibt ein stinknormaler µC von der >fa. Atmel. Dieser kann (siehe Datenblatt) 67,5 kHz rausbringen. >Wie? > >byte DeineGewuenschtePWM=0; >#define TIMER_CLK_DIV1 0x01 > >void setup() >{ > pinMode(11,OUTPUT); > TCCR2A = _BV(COM2A1) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20); > TCCR2B = _BV(TIMER_CLK_DIV1); > >} >void loop(){ > OCR2A = DeineGewuenschtePWM; >} > >Achtung: Code ungeprüft, müsste aber so funzen. > > >Deine Regelung: Im Ansatz richtig, leider aber untauglich. Der Regler >benötigt eine logarithmische NAchregelung, d.h. kleine Regelabweichung, >kleine Korrektur Deiner PWM-Breite, große Abweichung= große Korrektur. >Weiterhin solltest Du eine Totzeit einbauen. Da der Arduino nur 0-255 >kann wirst Du immer eine bleibende Regelabweichung behalten. > >Dein Projekt: Du musst mehr probieren, gerade (muss ich leider sagen) in >diesem Forum sind nur wenige bereit, Anfängern geduldig über den Weg zu >helfen. >Im Gegenzug solltest Du so viel wie möglich versuchen selber zu >ergründen. >Hier wissen einige Leute viel, wollen aber auch nicht für Dich >"entwickeln" >um Dir dieses Stück unseres Hobbies abzunehmen. Vielen Dank für diesen Hinweis. Ich denke das mit der logarithmische Nachregelung würde ich mit etwas probieren irgendwann hinbekommen. Aber wenn ich die von stefan us beschriebenen Schwierigkeiten nicht in den Griff bekomme hilft mir das nun auch nicht weiter. Ich finde, dass einem in diesem Forum zumindest im Vergleich zu vielen anderen Foren sehr gut geholfen wird. Zumindest hat mich noch keiner verurteilt weil ich einen Arduino verwende ;-) Ich glaube auch nicht, dass es der Sinn eines Forums sein sollte sich Arbeit abnehmen zu lassen aber manchmal komme ich eben bei meinen einfach Projekten nicht weiter und da ist es sehr hilfreich auf das Wissen von anderen zurückgreifen zu können. In diesem Fall war es mir vor allem wichtig erts mal zu klären ob meine Idee überhaupt umsetzbar ist. Ich werde wohl auf einen fertigen Regler zurückzugreifen auch wenn man da nicht immer das perfekt passende findet (insbesondere bei einem so großen Enigangsspannungsbereich). Wenn noch jemand einen Tipp für ein Schaltregler Shield hat wäre ich wie gesagt auch sehr dankbar. Danke für Eure Hilfe.
Es gäbe noch die Möglichkeit einen fertigen Schaltregler zu nehmen und die Referenzspannungsberechnung von einem µP vornehmen zu lassen. Diese wird dann via PWM dem Regler als Sollwert zugeführt. So bekommst Du die Regelgeschwindigkeit eines fertigen Schaltreglers plus der Variabilität der Ausgangsspannung.
Amateur schrieb: > Es gäbe noch die Möglichkeit einen fertigen Schaltregler zu nehmen und > die Referenzspannungsberechnung von einem µP vornehmen zu lassen. > Diese wird dann via PWM dem Regler als Sollwert zugeführt. > So bekommst Du die Regelgeschwindigkeit eines fertigen Schaltreglers > plus der Variabilität der Ausgangsspannung. Soetwas habe ich mal mit einem LM2675-Adj. aufgebaut und am Spannungsteiler des Feedbackeingangs über einen weiteren Widerstand eine variable GLATTE Gleichspannung angelegt und kann damit alle Ausgangsspannungen von 1.25V bis ca. 13V per PWM (in 255 Schritten) einstellen. (Habe quasi den einen Widerstand des Spannungsteiler variabel gemacht) Aber auch hierzu war ein Tiefpassfilter mit OpAmp notwendig, um eine saubere Umwandlung des PWM-Signals in eine Gleichspannung vorzunehmen. Vermutlich würde es auch genügen PWM Signal->Widerstand->Kondensator gegen GND->Widerstand->Spannungsteiler am Feedbackeingang des Reglers zu verwenden, habe das aber nie ausprobiert. (Ich glaube ein Schaltplan wäre jetzt besser ;-)) @Tim: Wie hast du den Elko angeschlossen? Wie ist der Elko dimensioniert? Wie ist Dein Spannungsteiler zur Spannungsmessung dimensioniert? Probier mal, ob Deine Messung besser wird, wenn Du den Elko zwischen Spannungsteilerausgang und GND schaltest. Poste am besten mal einen Schaltplan.
:
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.