Hallo,
ich bin Student an einer Hochschule im 6. Semester und studiere
Mechatronik. Im vorigen Semester konnte ich während meiner Studienarbeit
erste Mikrocontrollererfahrungen sammmeln. Jetzt folgt in diesem
Semester ebenfalls eine Studienarbeit in der ein Regelkreis aufgebaut
werden soll. Keine Angst, Ihr sollt das Problem nicht für mich lösen :)
Vielleicht kurz zu dem RK:
Angetrieben wird das ganze durch einen Motor aus dem R/C Bereich. Als
Stellglied kommt ein FahrtRegler ebenfalls aus dem Modellbau zum
Einsatz. Dieser Fahrtenregler wird durch ein PWM angestuert. Als
Störgröße habe ich mir eine Wirbelstrombremse besorgt die ich in der
Bremswirkung beliegig (durch Strombegrenzung mit Poti) steuern kann. An
der Bremse ist der Anschluss für einen Drehgeber von Sick (DGS60 mit 500
Schritten pro Umdrehung) vorgesehen.
Der Aufbau soll ein Laborversuch werden an dem man per Labview die
Parameter ändern kann.
Jetzt habe ich mir von myavr ein Testboard (Ver.1.5 mit LPT) besorgt auf
dem ein Atmega 8 aufgesteckt ist. Die Bedingung ist, dass ich den
Controller mit C programmieren kann.
Nochmal kurz was der Controller alles machen soll:
- Werte vom PC aus Labview per RS232 empfangen. (z.B.Sollwert Drehzahl)
- Drehzahl erfassen (Drehgeber)
- Drehzahl per RS232 ans Labview senden (Ist-Drehzahl)
- PWM Regeln (PID/P/I-Regler) Berechnung der Parameter erfolgt im
Controller
- Ausgabe der Soll/Istwerte an ein LCD Display
Soviel zur Einführung.
Jetzt kommt die eigentliche Frage:
Kann das ein Atmega8 oder sollte ich da schon etwas größeres nehmen?
Wenn ja, kann ich den Atmega8 einfach ausstecken und ein 32 einsetzten?
(Klar passt der von den Beinen nicht, aber da kann man ja ggf
adpatieren...)
Denn was ich brauche ist ein Timer mit Interrupt für die
Drehzahlerfassung. Initialisierung der Ports bzw. Counter und UART. Dann
noch ggf. eine case Anweisung wo der Reglertyp ausgewertet wird. Und
noch die LCD Ausgabe.
Ich hoffe, dass mir jemand bei meinem Problem behilflich ist. Für
weitere Fragen stehe ich gerne zu Verfügung. Gerne werde ich euch auf
dem laufenden halten - sofern gewünscht - wenn ich das Projekt beginne.
Gruß Andreas
Hi,
errechne dir mal die Frequenz des PID-Reglers, mit der ein Timer laufen
muss. Anschließend weißt du wieviel Zeit für Berechnung der Regelung
noch verbleibt. Überliege dir dann wieviele Multiplikationen und
additionen du mit welchen Zahlengrößen du benötigst --> wieder Zeit
bestimmen.
Dies muss alles passieren, bevor dein Timer abläuft. Wenn jetzt noch
Zeit übrig ist, kannst noch Ausgaben etc. machen.
Für genaues zeitkritisches Timing würde ich aber definitiv Assembler
machen. Die Initialisierung und Vorgaben zu Beginn können ja in C sein.
Gruß Alexander
Hallo,
danke für die schnelle Antwort. Jedoch verstehe ich nicht so ganz was du
mit der Berechnung der Zeiten meinst.
Was ich noch vergessen habe ist, dass die maximale Drehzahl am Drehgeber
auf 10000 min-1 beschränkt ist. D.H. ich habe ~167Hz. Bei 500 Strichen
pro Umdrehung wären dies 8333 Pulse pro Sekunde. Richtig? Meine
Mindestdrehzahl, welche regelbar ist, soll auf 500 1/min begrenzt sein.
Auf dem Board ist ein Quarz mit 3,6864Mhz aufgelötet. Das sollte soweit
klappen, oder irre ich mich?
Was mein Hauptproblem sein wird ist, dass der Flash Speicher beim
Atmega8 sehr klein ist. Ich habe mal ein Blinklich-Programm aufgespielt
und da waren dann schon 30% voll. Wenn dann noch Berechnungen, sowie
Ausgabe hinzukommt, ist das wahrscheinlich sehr knapp.
Andy wrote:
> Bei 500 Strichen> pro Umdrehung wären dies 8333 Pulse pro Sekunde.
Jetzt rechne mal etwas weiter.
Die Frage ist, wieviele Prozessortakte hast du daher zwischen
2 Pulsen zur Verarbeitung zur Verfügung. Damit kannst du dann
abschätzen ob das reichen wird.
Drehzahlmessung verbraucht ja nicht allzuviel Prozessorzeit.
Und der PID Regler wird ja wahrscheinlich auch nicht nach jedem
Puls deinen Motor nachregeln müssen. Abschätzen wieviele
Regeldruchgänge du pro Sekunde haben willst und was sich
daraus für die dazu benötigten Prozessortakte ergibt.
Das sind deine kritischen Berechnungspfade.
Die PWM macht die Hardware ja von alleine und das LCD ist
sicher nicht kritisch. Ob die Zahl am LCD nun eine hunderstel
Sekunde frfüher oder später aktualisiert wird, spielt sicher keine
Rolle.
> Was mein Hauptproblem sein wird ist, dass der Flash Speicher beim> Atmega8 sehr klein ist. Ich habe mal ein Blinklich-Programm aufgespielt> und da waren dann schon 30% voll.
Dann hast du irgendwas falsch gemacht.
30% bei einem Mega8 ist viel Holz. Besonders für ein Blinklicht.
Da wahr höchst wahrscheinlich der Optimizer nicht eingeschaltet.
167Hz und 500 Pulse/Umdrehung ergibt bei mir schon mal 83500
Impulse/Sekunde!!!
Das bedeutet du hast zwischen jeden Impuls ca. 12us Zeit Berechnungen
und Steuerungen durchzuführen. Bei einem Quarz mit 3,6864MHz beträgt die
Periodendauer T = 271,27ns.
Also folgt nun: Du hast genau 12us/271,27ns = 44 Takte zur Verfügung.
Ein Assemblerbefehl benötigt 1-2 Takte --> ca. 20...30 Befehle
Da sieht es doch sehr mau aus. (Bei 16MHz sinds 192 Takte)
Du siehst also, es geht so einfach nicht. Und wenn du mit C
programmierst, kannst du auf Anhieb überhaupt nicht sagen, wie viele
Zeilen Programm du in der Zeit ausführen kannst.
Du solltest, wie es schon Karl Heinz geschrieben hat, einige
grundlegende Sachen zu deiner Regelung überlegen.
Der PID-Regler muss sicher NICHT zwischen jedem Puls gerechnet werden.
Vielmehr würde ich in einem festen Raster gucken wieviele Pulse gekommen
sind und daraus die DRZ berechnen. Da du ja eine Mindestdrz planst
sollte das auch gut klappen.
Nur, weil der Inkrementalgeber 83kHz liefert, heisst das noch lange
nicht, daß auch eine Drehzahlregelung im 83kHz-Takt gerechnet werden
muss. Es soll ja nur ein Modellbaufahrtenregler per PWM angesteuert
werden, und die in Fernsteuerungen üblichen Ansteuerpulse sind mit 20ms
PWM-Takt doch eher (schnarch-)langsam.
Das Inkrementalgebersignal extern als Takt auf den 16 bit Timer, den per
zweiten Timer regelmäßig ausgelesen, ergibt die Drehzahl. Den dritten
Timer für die PWM zum Fahrtenregler. Falls dessen 8 bit nicht
ausreichen, dann den Inkrementalzähler per externem Interrupt und ISR
auswerten (nur zählen, mehr nicht), zur Not die paar Zeilen in
Assembler, wobei ich da doch eher den Quartz umlöten würde.
Und sollte wieder erwarten das Flash des Mega8 doch nicht ausreichen,
gibt es pinkompatible Modelle mit mehr Flash. Die sind dann mit 20MHz
noch auch noch schneller.
Alles machbar.
Oliver
Ich hab eine Lageregelung (Kaskadenregler) mit maximal 4000upm und 16er
Lochscheibe mit RS232 fuer Befehlsaustausch und I2C-Bus fuer ein LCD
problemlos im Mega8 laufen.
Laeuft bei mir aber mit 16Mhz Quarztakt und es waren noch einiges an
Reserven da.
Olaf
p.s: Wenn du das laufen hast, dann hast du einiges ueber
Regelungstechnik
gelernt. :-P
p.s2: Ausserdem kannst du danach auch behaupten mit AVRs umgehen zu
koennen.
Leider sind die naemlich fuer so eine Aufgabe nicht so gut geeignet weil
du keine Interruptprioritaeten vergeben kannst, aber machbar ist es
schon.
Hallo,
erstmal vielen Dank für die reichlichen Antworten. Die haben mich schon
sehr viel weiter gebracht.
Vielleicht kurz zu Assembler. Ich komme damit irgendwie nicht klar, dass
man einem Prozessor echt alles sagen muss, da finde ich C doch
wesentlich einfacher. Aber wenn es garnicht anders zu lösen ist, dann
muss ich das eben machen. Ansonsten würde ich den "bequemen" Weg
vorziehen ;)
Das mit den Pulsen ist bei 83kHz korrekt, da hatte ich mich beim Ablesen
des Rechners vertan. Nur ist das denke ich nicht notwendig jeden Puls
auszuwerten, da wie OliverSo sagte, das PWM mit 20ms getaktet ist.
Wenn ich das also richtig verstehe, dann könnte ich mir doch dadurch
Zeit erschleichen, wenn ich langsamer Abtaste bzw. Ausgebe, oder?
Das Auslöten des Quarzes stellt denke ich mal kein Problem dar. Wenn
16MHz benötigt werden, dann wird das entsprechende Quarz eingebaut.
Hi Andy,
ich hatte eine (bzw. mehrere) Regelung(en) auf einem mega32@16MHz
laufen, war eine Lüfter-Drehzahlregelung mit optischem Aufnehmer.
In der Codesammlung unter Beitrag "PID-Regler mit anti-Windup"
ist die Regelung in C beschrieben.