Hallo! Mein Problem ist, dass ich eine Regelung mit einem ATMega8 realisieren soll, aber nicht genau weiß wie ich dies realisieren soll. Ich habe auch schon gegoogelt, aber eine Regelung in Assembler hab ich nicht gefunden. Ich will konkret ein analoges Signal einlesen, dass mir von einer Lambdasonde geliefert wird, und muss über eine Regelung ein Ventil per PWM ansteuern. Was ich nicht verstehe, wenn ich mit mehreren 8bit- Zahlen ein paar mathematische Operationen ausführe (Reglerimplementierung), hab ich doch dann insgesamt mehr als 8bit, oder? Vielen Dank für eure Mühe!!!!!
>Was ich nicht verstehe, wenn ich mit mehreren 8bit-Zahlen ein paar >mathematische
Operationen ausführe (Reglerimplementierung), hab ich doch >dann insgesamt mehr
als 8bit
Jaein
-,/ = nein
+,* = ja
hast du schon die Übertragungsfunktion aufgestellt??
muss das in Assembler sein? Ich denke nicht das dein System so schnell
ist das die optimierung in Assembler nötig ist...
ja, Assembler wäre schon besser, da ich mit Assembler schon öfter gearbeitet habe. Übertragungsfunktion: // Regelabweichung e_k berechnen: e_k = v_soll - v_ist; Spannung von der Lambdasonde // Stellgröße u_k berechnen: u_k = u_k_alt + k_p*(e_k*(1+t_0/t_i)-e_k_alt); // Stellgrößenbegrenzung: if (u_k > 5.0) u_k = 5.0; else if (u_k < 0.0) u_k = 0.0; Das ist aber in Assembler ganz schön umfangreich, oder? Ich muss ja jede Rechenoperation einzeln ausführen, und nicht wie in c in einer Formel.
> Ich muss ja jede Rechenoperation einzeln ausführen, und nicht wie in c in >
einer Formel.
Richtig. C macht das auch so
Eine alternative ist es vielleicht für dich die Funktion in C zu
schreiben und nachher den erzeugten Assembler code zu übernehmen. Viel
besser als ein guter Compieler das macht wird es eh nicht.
und du musst die Funktion so bauen das sie mit Fixkomma auskommt, sonst
wird es sowieso langsam :)
solche Konstanten vorher berechnen t_0/t_i, das spart massig Zeit.
Danke erstmal für die schnelle Antwort. Wie mache ich das denn genau, den Code in Assembler auslesen den mir der Compiler liefert?
Du kannst dir ein Listfile erzeugen lassen, da steht der Code dann drinn. Auserdem ist es sinnvoll die Variablen als register anzulegen. Dann lädt der Compiler diese nicht aus/in den Ram, sondern legt sie in Registern an. z.B.: register uint8_t v_soll,v_ist; register int16_t e_k; usw... aber besser ist es alles in C oder Assembler zu machen. Oder die Funktion als lib zu erstellen.
Wenn du noch Infos über die Regelung (digital oder analog) brauchst, dann wäre dieser Link vielleicht was für dich: http://www.roboternetz.de/wissen/index.php/Regelungstechnik Da wird das ganze relativ verständlich erklärt. So ein PI-Regler ist Software-mäßig relativ schnell programmiert. Ich würde mit C-programmieren. Für das bisschen brauchst du keine großen C-Kenntnisse - die Gleichungen sind mit C ratz fatz programmiert. Der GCC Compiler sollte daraus einen recht kopakten Code machen.
>So ein PI-Regler ist Software-mäßig relativ schnell programmiert. >... >die Gleichungen sind mit C ratz fatz programmiert. Trotzdem sollte man wissen was man tut.
Natürlich, aber ich denke, dass man bei der Formel in Assembler wesentlich mehr Fehler machen kann als in C. Wer einen Taschenrechner richtig bedienen kann, der sollte auch die Formel in C richtig schreiben können. Wollte mit meinem Post nicht signalisieren, das C idiotensicher ist.
>dass man bei der Formel in Assembler...
Ich meinte das aus regelungstechnischer Sicht!
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.