Forum: Mikrocontroller und Digitale Elektronik PI-Regler mit GEGEN EMK


von Mr. EEPROM (Gast)


Lesenswert?

Hallo Leute,

ich habe eine Schaltung mit AVR MEGA644P und H-Brücke (diskret).
Per Poti gebe ich 1:1 den PWM-Sollwert für den Motor vor.
In der Software wird dann darauf gefahren mittels voreingestellten 
Incrementierungszeiten des OCR-Registers, sodass der Motor langsam 
beschleunigt/abbremst.

Jetzt möchte ich noch eine Regelung haben. Das ist wichtig.
Ich kann bereits die Gegen EMK messen, ich erhalte hier Werte zwischen 0 
- ca. 350. (0 = stillstand, 350 = vollgas, OCR = 255).

Wenn ich den Motor drehen lasse, und mit der Hand festhalte, sehe ich 
auch, dass die Werte hoch gehen, bzw. runter wenn er schneller dreht als 
eingestellt (quasi bergab rollt, ich ihn zzgl. von außen beschleunige).


Ich habe auch einen Regler programmiert

1
inline void set_regler_soll(uint16_t _w)
2
{
3
  w = _w;
4
}
5
6
inline uint8_t pi_regler(uint16_t _x)
7
{  
8
  e = w - _x;                        //Vergleich
9
  esum = esum + e;                    //Integration I-Anteil
10
11
  if (esum < -400) esum = -400;              //Begrenzung I-Anteil
12
  if (esum > 400) esum = 400;
13
14
  y = (uint16_t)(kp * e) + (uint16_t)(ki * 0.1 * esum);  //Reglergleichung
15
16
  return (y);                        //Übergabe Stellgröße
17
}


Ich habe allerdings 0 wirklich NULL Bezug zum ganzen. Ich weiß nicht wie 
ich das anstellen soll.

Als Sollwert hätte ich jetzt die Vorgabe vom Poti, also den PWM-Soll 
genommen!? Dann habe ich aber Probleme, den Rest zu verarbeiten, da ich 
0 Bezug habe zwischen Soll-Wert und Gegen-EMK Wert.


Ich würde mich sehr freuen wenn mir jmd. echt helfen könnte.
Später soll das einfach so laufen, dass ich einen PWM-Wert am Poti 
einstelle (wie jetzt auch), er darauf den Motor dreht, und wenn ich ihn 
belaste soll er "schneller" werden, wenn ich ihn per Hand zzgl. 
schneller drehe, soll er "langsamer" werden.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Wenn du die Skalierung der EMK oder des Potis erstmal weglässt, wäre der 
Vorversuch, die IST Grösse, nämlich die Höhe der Gegen EMK, auf den 
Sollwert, nämlich den Wert vom Poti, zu regeln.

Also z.B. Poti = 128, und die Gegen EMK wird auf 128 geregelt.
1
inline void set_regler_soll(uint16_t _w)
2
{
3
  w = _w;
4
}
Wofür mag das sein?
Als Tipp schau dir mal Application Note AVR221 bei Microchip an, das ist 
ein netter kleiner PID Regler in C.

: Bearbeitet durch User
von Mr. EEPROM (Gast)


Lesenswert?

Matthias S. schrieb:
> Wenn du die Skalierung der EMK oder des Potis erstmal weglässt,
> wäre der
> Vorversuch, die IST Grösse, nämlich die Höhe der Gegen EMK, auf den
> Sollwert, nämlich den Wert vom Poti, zu regeln.
>
> Also z.B. Poti = 128, und die Gegen EMK wird auf 128 geregelt.inline
> void set_regler_soll(uint16_t _w)
> {
>   w = _w;
> }
> Wofür mag das sein?
> Als Tipp schau dir mal Application Note AVR221 bei Microchip an, das ist
> ein netter kleiner PID Regler in C.


Die EMK ist nicht skaliert, dass ist der reine Wert mit 5V Reference vom 
ADC. Das ist nur invertiert (1024 - ADCW), sodass das bei 0 anfängt und 
größer wird und nicht bei 1024 anfängt und kleiner wird. Poti ist /4 
gerechnet um 0-255 zu haben.


Ich verstehe leider tzd. den Zusammenhang nicht. Die 
Grundgeschwindigkeit gebe ich mit dem Poti vor, die ändert sich auch 
öfters (wird später dann digital über i2c gesendet vom master 
controller). Damit habe ich meinen Sollwert, oder nicht?

Dann habe ich den Gegen EMK-Wert, womit ich 0 anfangen kann da mir jeder 
Bezug dazu fehlt. Auf den Wert regeln macht doch keinen Sinn, oder? Ich 
kann ja nicht sagen, dass wenn ich Poti = 128 habe das der gegen EMK von 
128 entspricht. Das tut es ja nicht. Wenn ich belaste wird der Wert 
größer, also muss mehr Gas gegeben werden, das ist ja auch invertiert 
dann quasi wie ich das sehe?!

Ich bin einfach aktuell noch planlos. Die Note schaue ich mir an.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Es ist einfach: Wenn du die Geschwindikeit des Motors regeln möchtest, 
musst du diese messen. Ohne jede Rückmeldung vom Motor wirds nichts, 
denn wie du ja schon bemerkt hast, ist die Gegen EMK kein geeigneter 
Messwert dafür. Du solltest also überlegen, wie du die Geschwindigkeit 
messen kannst (Sensor etc.) und damit einen Timer toren.

Einen Timer brauchst du sowieso, denn ein PID Regler muss regelmässig 
aufgerufen werden, damit er richtig und stetig regeln kann.
Bau also erstmal eine Geschwindigkeitsmessung ein und bring die zum 
Laufen.

von Mr. EEPROM (Gast)


Lesenswert?

Matthias S. schrieb:
> Es ist einfach: Wenn du die Geschwindikeit des Motors regeln
> möchtest,
> musst du diese messen. Ohne jede Rückmeldung vom Motor wirds nichts,
> denn wie du ja schon bemerkt hast, ist die Gegen EMK kein geeigneter
> Messwert dafür. Du solltest also überlegen, wie du die Geschwindigkeit
> messen kannst (Sensor etc.) und damit einen Timer toren.
>
> Einen Timer brauchst du sowieso, denn ein PID Regler muss regelmässig
> aufgerufen werden, damit er richtig und stetig regeln kann.
> Bau also erstmal eine Geschwindigkeitsmessung ein und bring die zum
> Laufen.

Hallo,

Time habe ich bereits, alle x ms wird der Regler aufgerufen.
Das soll später für eine Modellbahnsteuerung sein. Da ist es nicht 
möglich, eineen Geschwindigkeitsmesser einzubauen. Das mache andere 
Decoder ja auch das diese eine Lastregelung drin haben. Ich verstehe 
leider den Bezug noch nicht.

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.