mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Ergebnis ist falsch


Autor: Pikard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

}

Autor: Pikard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es soll obern U_z heissen.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Pikard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Pikard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: verwirrt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

  if(P> P_alt)      // Der Vergleich
  {
     OCR0=OCR0+5;
     delay(2000);
  }
Ich würde aber sagen, da sollte mal noch eine Abfrage rein, ob die 
folgende Berechnung noch sinnvoll ist:
  if(P>P_alt) {
     if(OCR0<=250) OCR0=OCR0+5;
  }
  else {
     if(OCR0>=5)   OCR0=OCR0-5;
  }
  delay(2000);

Autor: Pikard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sepp (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sepp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if(P> P_alt)      // Der Vergleich

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.