Forum: Compiler & IDEs Motorregelung für Klausurprojekt


von Thomas K. (t0mt0m)


Lesenswert?

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

von Oliver (Gast)


Lesenswert?

>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

von Thomas K. (t0mt0m)


Lesenswert?

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

von STBler (Gast)


Lesenswert?

hört sich für mich nach STB an ;-)

von Karl H. (kbuchegg)


Lesenswert?

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.

von Thomas K. (t0mt0m)


Lesenswert?

STB?

von Oliver (Gast)


Lesenswert?

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

von Thomas K. (t0mt0m)


Lesenswert?

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...

von Oliver (Gast)


Lesenswert?

>...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

von Tom (Gast)


Lesenswert?

muss es wirklich ein uC sein ?  -  sonst wäre TL494 dafür voll 
ausreichend...

von Thomas K. (t0mt0m)


Lesenswert?

@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...

von Karl H. (kbuchegg)


Lesenswert?

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)

von Thomas K. (t0mt0m)


Lesenswert?

ja tschuldigung falsch ausgedrückt...es ist ein normales 
rechtecksignal...und dessen frequenz entspricht der drehzahl

von Oliver (Gast)


Lesenswert?

>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

von Thomas K. (t0mt0m)


Lesenswert?

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

von Gast (Gast)


Lesenswert?

Warum schreibst du die Funktion nicht so, dass sie dir gleich den 8-Bit 
Wert zurückgibt?

von Karl H. (kbuchegg)


Lesenswert?

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

von Thomas K. (t0mt0m)


Lesenswert?

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

von Gast (Gast)


Lesenswert?

Ich habe bei Atmel vor einiger zeit mal ein AN für einen PID Regler 
gesehen. Schau dir das doch mal an.

von Karl H. (kbuchegg)


Lesenswert?

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)

von Frank J. (frajo)


Lesenswert?

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
Noch kein Account? Hier anmelden.