Motorregelung für Klausurprojekt

OP #1423142
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
Gast #1423168
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
OP #1423176
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
#1423198
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.
Gast #1423206
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
Gast #1423229
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
OP #1423264
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...
Gast #1423386
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
OP #1424226
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
#1424241
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
OP #1424317
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
#1424365
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)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren