Forum: Mikrocontroller und Digitale Elektronik Ergebnis ist falsch


von Pikard (Gast)


Lesenswert?

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

}

von Pikard (Gast)


Lesenswert?

Es soll obern U_z heissen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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?

von Pikard (Gast)


Lesenswert?

>> 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.

von Peter D. (peda)


Lesenswert?

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

von Pikard (Gast)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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...

von verwirrt (Gast)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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);

von Pikard (Gast)


Lesenswert?

>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.

von Sepp (Gast)


Lesenswert?

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.

von Sepp (Gast)


Lesenswert?

1
if(P> P_alt)      // Der Vergleich

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.