Problemstellung: Mit einem Mikrocontrollersystem soll ein Motor mittels PWM drehzahlgesteuert werden. Dazu ist eine Leistungsstufe mit H-Brückenschaltung zu entwerfen. Die Drehzahl steht als Rechtecksignal am Eingang des µC zur Verfügung. Der Sollwert wird über einen ADC-Eingang des µC eingelesen und mittels Potentiometers eingestellt. Als Regelalgortithmus soll eine Differentialgleichung eines PI-Reglers eingesetzt werden. Die Leistungsstufe mit der H-Brücke war kein Problem...nur steh ch grad total unter Druck und bekomm deshalb das einlesen des Potis und der PID-Regelung nicht auf die Reihe obwohl ich weiss das da nicht viel dahinter steckt. Ich wollte deshalb fragen: Ist es sinnvoll das Poti über den ADC einzulesen wobei ich einen Wert zwischen 0...255 bekomme...ebenso das vorhandene PWM Singal und das dann durch denn Regler schicke und mit dem erhaltenen Wert ein neues PWM generiere? mfg tom
>Ist es sinnvoll das Poti über den ADC >einzulesen Ja >wobei ich einen Wert zwischen 0...255 bekomme... Wenn das nicht anders geht, ja. Etwas mehr Auflösung würde aber nicht schaden, falls verfügbar. >ebenso das vorhandene PWM Singal Ein PPM-Signal über einen ADC einlesen ist suboptimal. Du schreibst ja nichts über die Frequenz, und über den verwendetetn Controller, aber für sowas nimmt man irgendwas mit Timer. Falls es ein AVR ist, am einfachsten die Input-Capture-Funktion. >und das dann durch denn Regler schicke und mit dem erhaltenen Wert ein neues PWM >generiere? So sollte der Regler funktionieren. Oliver
hm zu meiner schande bin ich nicht wirklich gut mit µC-programmierung vertraut. ich verwende einen atmega16. ich hab mittlerweile mein poti eingelesen und die diffgleichung vom pi-regler auch her geleitet...kannst du noch näher auf die input-caputre funktion eingehen? mfg tom
Thomas Klampfer schrieb: > pi-regler auch her geleitet...kannst du noch näher auf die input-caputre > funktion eingehen? Datenblatt: Timer entsprechend auf Input Capture konfigurieren. Timer laufen lassen. Bei jedem Input Capture Ereignis (Flankenwechsel am Eingang) wird der momentante Zählerstand vom Timer von der Hardware in einem Register zwischengespeichert und ein Interrupt ausgelöst. In der ISR nimmt man die Differnz vom momentanten Capture Ereignis zum Wert vom vorhergehenden Capture-ISR Ereignis und hat damit die Anzahl der Timerticks, die der Timer von einer Flanke zur nächsten zählen konnte. Mit der Geschwindigkeit des Timers kann man daraus die Frequenz des Signals und damit die Drehzahl des Motors ermitteln. Sinnvollerweise lässt man den Timer so schnell laufen, dass man bei der Berechnung der Differenz Overflows des Timers nicht berücksichtigen muss. Bei unsigned Rechnerei braucht man dann nur die Zählerstände voneinander abziehen und kriegt immer das richtige Ergebnis.
Ob die dafür geeignet ist, hängt von der Art des Signals ab. Was für eine PWM kommt denn da rein? Beim Input-Capture-Mode läuft Timer 1 vor sich hin. Dazu gibt es einen Eingangspin und ein spezielles Register. Bei einem Pegelwechsel (parametrierbar low-high oder umgekehrt) am Pin wird der aktuelle Zählerstand in das Register übertragen, und dann ein Interrupt ausgelöst. Damit hast du ein einfaches Mittel, die Zeit seit dem letzten Pegelwechsel zu bestimmen, und damit dann auch die Frequenz, das Tastverhältnis, oder was auch immer da ein Maß für die Drehzahl des Motors ist. Etwas Vorsorge muß man beim Timerüberlauf treffen, ebenso, falls bei Drehzahl Null die Impulse ganz ausbleiben sollten. Oliver
der motor is ein nornmaler lüfter...also die pwm sieht so aus das ich eine amplitude von 5 V habe und eine frequenz von 50 Hz...
>...also die pwm sieht so aus das ich >eine amplitude von 5 V habe und eine frequenz von 50 Hz... Geht es etwas genauer? Wie groß ist die minimale Drehzahl, und wie sieht da das PWM-Signal aus? dito für maximale Drehzahl. Oliver
@oliver...die drehzahl ist unbekannt...die drehzahl wird durch die frequenz des pwm bestimmt...mit dem poti stell ich den sollwert ein...und vom lüfter bekomm ich den istwert als pwm...zb 50 hz...und dieser soll via pid-regler dann nachregeln... @tom...nein ged leider nicht...die klausur ist teil meiner matura und alle dinge sind vorgegeben...
Thomas Klampfer schrieb:
> und vom lüfter bekomm ich den istwert als pwm...
Sicher?
Nicht als Rechtecksignal, dessen Frequenz der Drehzahl entspricht?
(Ist im Grunde auch egal. Das Capturing funktioniert gleich nur die
Auswertung der Capture-Werte ist anders)
ja tschuldigung falsch ausgedrückt...es ist ein normales rechtecksignal...und dessen frequenz entspricht der drehzahl
>es ist ein normales >rechtecksignal...und dessen frequenz entspricht der drehzahl Na, dann ist das jetzt klar. Bei der Auswertung musst du da halt einen untere Schwelle für dich festlegen, ab wann Stillstand Stillstand ist. Alle 10 Minuten eine Flanke ist ja sicherlich nicht mehr im Regelbereich. Ebenso wäre es immer noch hinlfreich, die Maximalfrequenz zu kennen, die auftreten kann, zur Bestimmung eines sinnvollen Timertakts. Oliver
so danke mal an euch das ihr mir gehlfen habt...ged alles soweit... hab nur eine detail frage zum pi-regler: meine funktion sieht so aus:
1 | uint16_t PI_REGLER(uint16_t pi_istwert, uint16_t pi_sollwert) |
2 | {
|
3 | .
|
4 | .reglelalgorithmus |
5 | .
|
6 | return y; |
7 | }
|
hier wird eine 16 bit variable zurückgeliefert... ich möchte die aber in eine 8 bit vatriable umschreiben...da ich mit einem 8 bit counter ein pwm erzeugen muss...ged das so?:
1 | uint8_t stellgroesse = (uint8_t)PI_REGLER(istwert, poti_result); |
mfg tom
Warum schreibst du die Funktion nicht so, dass sie dir gleich den 8-Bit Wert zurückgibt?
Thomas Klampfer schrieb: > einem 8 bit counter ein pwm erzeugen muss...ged das so?: > >
1 | uint8_t stellgroesse = (uint8_t)PI_REGLER(istwert, poti_result); |
Im Grunde: Ja, das ist eine Möglichkeit. Sie kann aber auch zu völlig falschen Ergebnissen führen :-) Du musst dich im Grunde fragen auf welche art und weise du 65536 Socken in 256 Schachteln unterbringen willst: Gibst du die ersten 256 in Schachtel 0, die nächsten 256 in Schachtel 1 usw. Oder gibst du Socke 0 in Schachtel 0, Socke 1 in Schachtel 1, ... Socke 256 wieder in Schachtel 0, Socke 257 in Schachtel 1, etc. Je nachdeml wie du das machst landen unterschiedliche Socken in den einzelnen Schachteln. Oder um in deinem Beispiel zu bleiben. Wenn das Ergebnis deines Regelalgorithmuses die Zahl 312 ist (welches nicht mehr in 8 Bit passt), was ist dann das richtige 8-Bit Ergebnis dazu? 312 / 8 oder 312 % 8
problem bereits gelöst...danke für die hilfreichen beiträge... aber µC programmieren wäre nicht lustig hätte ich nicht schon das nächste problem:
1 | uint16_t x = pi_sollwert - pi_istwert; |
2 | uint16_t YP = x * P_FAKTOR; |
1. problem ich weiss nicht wie groß ich den P_FAKTOR wählen soll. 2. problem: weiss jemand wie ich den integrier-anteil coden soll? mfg tom
Ich habe bei Atmel vor einiger zeit mal ein AN für einen PID Regler gesehen. Schau dir das doch mal an.
Thomas Klampfer schrieb: > problem bereits gelöst...danke für die hilfreichen beiträge... > > aber µC programmieren wäre nicht lustig hätte ich nicht schon das > nächste problem: > >
1 | uint16_t x = pi_sollwert - pi_istwert; |
2 | > uint16_t YP = x * P_FAKTOR; |
3 | >
|
> > 1. problem ich weiss nicht wie groß ich den P_FAKTOR wählen soll. So, dass deine Reglung nicht schwingt :-) > 2. problem: weiss jemand wie ich den integrier-anteil coden soll? Durch aufsummieren? Oft gibt man auch noch eine Begrenzung dazu, damit diese Summe nicht zu groß bzw. zu klein werden kann. Es dauert sonst extrem lange, bis sich der integrierte Fehler wieder auf 0 einpegelt (= ausgeregelt)
Ich finde diesen Artikel sehr interessant. http://www.rn-wissen.de/index.php/Regelungstechnik Weiter unten auch Beispiele für Drehzahlreglung.
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.