Forum: Mikrocontroller und Digitale Elektronik Geht das mit einem Atmega8? (Regelkreis)


von Andy (Gast)


Lesenswert?

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

von Alexander L. (lippi2000)


Lesenswert?

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

von Andy (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Alexander L. (lippi2000)


Lesenswert?

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.

von abba (Gast)


Lesenswert?

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.

von OliverSo (Gast)


Lesenswert?

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

von Matthias Kölling (Gast)


Lesenswert?

Welches Blinklichtprogramm braucht 2.4k? Unter Windows wäre das mehr als 
schlank, aber auf einem Atmega8 sollten das nur ein paar Bytes sein!

von Olaf (Gast)


Lesenswert?

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.

von Andy (Gast)


Lesenswert?

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.

von Thilo M. (Gast)


Lesenswert?

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.

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.