Hallo, ich versuche eine Leistung zu messen und sie dann per pwm zu erhöhen. Aber es passiert nichts. Könnte es sein dass es an den Datentypen hängt? Hätte jemand eine Idee wo es liegen könnte? float I_z; // Die Initialisierung von den Datentypen am Anfang long double P; long double P_alt; double U_zelle; P_alt= 0; //wird oben als startwert definiert while(1) { messung(); // Strom und spannung gemessen und immer wieder aufgerufen P= U_z*I_z; // Meine Berechnete Spannung delay(2000); if(P> P_alt) // Der Vergleich { OCR0=OCR0+5; delay(2000); } else if (P< P_alt) { OCR0=OCR0-5; delay(2000); } else if(P == P_alt) { } P_alt = P //Neue wert in dem P_alt gespeichert }
Pikard schrieb: > ich versuche eine Leistung zu messen und sie dann per pwm zu erhöhen. Soso, ein MPP Solarregler also... > ich versuche eine Leistung zu messen und sie dann per pwm zu erhöhen. > Aber es passiert nichts. Was erwartest du? Und was passiert nicht? > Könnte es sein dass es an den Datentypen hängt? Ich vermute, dass dein Compiler sowas gar nicht umsetzt: long double > Hätte jemand eine Idee wo es liegen könnte? Du beschreibst nicht: Welcher uC, welcher Compiler, was geht und was nicht... Kannst du die PWM überhaupt irgendwie verstellen? Ändert diese Verstellung was in der Leistung? Stimmt die errechnete Leistung?
>> ich versuche eine Leistung zu messen und sie dann per pwm zu erhöhen. >Soso, ein MPP Solarregler also... Jep :) >> ich versuche eine Leistung zu messen und sie dann per pwm zu erhöhen. >> Aber es passiert nichts. >Was erwartest du? Und was passiert nicht? Ich habe ein Oszi und kann den PWM sehen, er soll entweder höher oder niedriger werden angesichts der If schleife. Aber beim Oszi bleibt er auf null. TCCR0 = (1 << WGM01)| (1 << WGM00)|(1 << CS00)|(1 << COM01); //Fast Pwm-Modus, Teiler auf 1 OCR0 = 0; >> Könnte es sein dass es an den Datentypen hängt? >Ich vermute, dass dein Compiler sowas gar nicht umsetzt: long double Habe alles auf double umgestellt >> Hätte jemand eine Idee wo es liegen könnte? >Du beschreibst nicht: Tut mir leid mein Fehler. :) >Welcher uC, welcher Compiler, was geht und was nicht... ATMega32L , AVR Studio 4.14 >Kannst du die PWM überhaupt irgendwie verstellen? Ja könnte ich machen. Ich habe die am Anfang initialisiert und drangehängt. >Ändert diese Verstellung was in der Leistung? Ja sie verstellt die Leistung. >Stimmt die errechnete Leistung? Ja die Leistung stimmt. Also ich messe U_z und I_z, die Werte stimmen. Sie werden als Gleitkommazahlen gespeichert. Mein U_z beträgt den wert von 17 V und der Strom den wert 0.5 A.
Ich lach mich scheckig, ne 8Bit-PWM in "long double" ausrechnen. Da reicht uint16_t dicke aus. Abgesehen davon ist beim AVR-GCC: long double = double = float = 4 Byte Peter
Ich habe das delay auf 0,5 sek gestellt. Er kommt jetzt rein in die schleife. Aber der erste schritt ist er erhöht einmal und sofort geht er den schritt zurück. Habe bei der if abfrage nur das erhöhen drin gelassen um zu sehen ob er überhaupt das richtigt macht. Aber er bleibt nur beim 1 schritt vor und dann sofort zurück.
Pikard schrieb: > angesichts der If schleife. http://www.if-schleife.de Pikard schrieb: > er erhöht einmal und sofort geht er den schritt zurück. Mach mal dein Delay (wenn schon) nach die Umstellung bzw. vor die Messung, damit ein geänderter PWM-Wert sich erst mal auswirken kann...
Pikard schrieb: > ich versuche eine Leistung zu messen und sie dann per pwm zu erhöhen. Erhoehen ? Bis wohin ? > Aber es passiert nichts. Könnte es sein dass es an den Datentypen hängt? > Hätte jemand eine Idee wo es liegen könnte? Liegt sicher an deinem "Algorithmus", nicht an den Datentypen. Was soll die Schleife denn machen ? Ich nehme an, die Leistung soll auf einen Sollwert geregelt werden. Allerdings gibt es nirgens einen Sollwert. Es wird nur verglichen wie die Leistung sich entwickelt hat (gestiegen / gefallen). Je nachdem wir die Leistung erhoeht / gesenkt. So taugt das eher als Oszillator ! Versuch doch was in diese Richtung: P_ist = U_z * I_z; if (P_ist > P_soll) // PWM kleiner machen else if (P_ist > P_soll) // PWM groesser machen "Schwingen" wird das ganze auch noch, da es keine Hysterese gibt, und es eher unwahrscheinlich ist dass P_ist einmal genau P_soll ist. Will man das Schwingen vermeiden muss man besser eine richtige Regelstrecke aufbauen.
verwirrt schrieb: > "Schwingen" wird das ganze auch noch, da es keine Hysterese gibt, und es > eher unwahrscheinlich ist dass P_ist einmal genau P_soll ist. Urigerweise wird das Ganze durchaus funktionieren, sowas habe ich vor zig Jahren schon mal gebaut. Das "Schwingen" hängt ja von der Verzögerungszeit ab, und da wird dann eben immer 1 Schritt hin+her gesprungen...
1 | if(P> P_alt) // Der Vergleich |
2 | {
|
3 | OCR0=OCR0+5; |
4 | delay(2000); |
5 | }
|
Ich würde aber sagen, da sollte mal noch eine Abfrage rein, ob die folgende Berechnung noch sinnvoll ist:
1 | if(P>P_alt) { |
2 | if(OCR0<=250) OCR0=OCR0+5; |
3 | }
|
4 | else { |
5 | if(OCR0>=5) OCR0=OCR0-5; |
6 | }
|
7 | delay(2000); |
>Erhoehen ? Bis wohin ? Der Algorithmus soll die berechnete Leistung mit der Alte vergleichen und eventuell den maximalen Punkt irgenwann erreichen. >Was soll die Schleife denn machen ? Ich nehme an, die Leistung soll auf >einen Sollwert geregelt werden. Allerdings gibt es nirgens einen >Sollwert. Ich gebe P_alt als nullwert an. Der ertse Schritt soll so oder so gemacht werde. Dann speichert er den P wert in P_alt und misst nochmal. Die PWM ändert die Leistung und somit wird eine höhere Leistung gemessen. >Es wird nur verglichen wie die Leistung sich entwickelt hat (gestiegen / >gefallen). Je nachdem wir die Leistung erhoeht / gesenkt. So taugt das >eher als Oszillator ! Ich möchte sehen, dass das ganz funktioniert. Will ja den maximalen Punkt durch der If abfrage finden und nicht vordefinieren.
Vielleicht ist die Bedingung if(P> P_alt) // Der Vergleich einfach nur beim 1. mal gegeben und dann nicht mehr :-) --> Er wird das ganze nur 1 mal machen Das könnte man debuggen und du siehst sofort, wo er hinspringt.
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.