Forum: Mikrocontroller und Digitale Elektronik Algorithmus für Motorregelung gesucht


von Rangi J. (rangi)


Angehängte Dateien:

Lesenswert?

Hallo Forum,
ich habe die Aufgabe eine kleinen 3 pol. DC-Motor (12V) zu regeln. Dabei 
habe ich eine MOSFET als PWM-Treiber eingesetzt und einen ATtiny45 als 
Controller. Ich lese die Generatorspannung zurück und kann in etwa die 
Drehzahl über den ADC zurück lesen.
Jetzt hab ich das Problem, dass sich der Algorithmus zum Steuern der PWM 
noch nicht so funktioniert wie er sollte.
Ich suche also eine Anleitung oder einen Beispielcode zum Steuern der 
PWM.
Aktuell verwende eine PWM von f=122Hz mit max 90%. In jeder Pause warte 
ich das Abbauen des induktiven Stroms ab und messe dann die 
Generatorspannung. Die ist aber nicht konstant und schwankt stark, je 
nachdem wo der Schleifer gerade steht.
Ich hab eine Variante, die ganz gut schon funktioniert: den Mittelwert 
über 2 Meßwerte und die PWM jeweils um 1 erhöhen oder 1 verringern. Wenn 
der Motor einmal läuft geht das ganz gut, aber beim loslaufen tourt er 
zu hoch und regelt dann zu langsam runter. Wenn ich mehr Meßwerte 
verwende schwingt es sich auf zu einem "stop and go".
Wie macht ihr das? Gibts da irgend eine Anleitung?
Danke

von Rami Gupta (Gast)


Lesenswert?

Wie wäre es wenn DU mal Deinen Quelltext offenlegst?

von Bork (Gast)


Lesenswert?

PWM, 122Hz  auf einen DC Motor ... ja, ist gut ..

Ich denk, das wird so nichts. Die Frequenz ist viel zu tief.

von Kopfschüttel (Gast)


Lesenswert?

Bork schrieb:
> Die Frequenz ist viel zu tief.

Seltsam, also dürften die Millionen Phasenanschnitt-gesteuerten 
Allstrommotore in praktisch allen Elektro-Kleinmaschinen, Staubsaugern 
etc. gar nicht funktionieren.
Die haben nämlich nur 100 Hz.

von Rangi J. (rangi)


Lesenswert?

und was soll das helfen? aber hier, bitte:
1
u16 adc_ist, dc_act;
2
u8 adc_flag;
3
4
ISR(TIM0_COMPA_vect)
5
{
6
  ADCSRA |= (1<<ADSC);   /*ADC starten*/
7
}
8
9
ISR(TIM0_COMPB_vect)
10
{
11
}
12
13
ISR(TIM0_OVF_vect)
14
{
15
}
16
17
ISR(ADC_vect)
18
{
19
  adc_ist=ADC;
20
  adc_flag=1;
21
}
22
23
void adc_init(void)
24
{
25
  ADCSRA = (1<<ADEN);   /*enable*/
26
  DIDR0 |= (1<<ADC1D)|(1<<ADC3D);
27
  ADCSRA = (1<<ADEN)|(0<<ADSC)|(0<<ADATE)|(0<<ADIF)|(1<<ADIE)|(0<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
28
  ADCSRB = 0;
29
  ADMUX = 1;
30
31
  IO_PIN_PD_OUT(A,7);
32
  IO_PIN_EN(A,7);
33
  TCCR0A = (1<<COM0B1)|(1<<COM0B0)|(1<<WGM01)|(1<<WGM00);
34
  TCCR0B = (1<<CS02)|(0<<CS01)|(0<<CS00);
35
  OCR0A = 0x18;
36
  OCR0B = 0xD0;
37
38
  TIMSK0 = (1<<OCIE0A);
39
}
40
41
void dc_main(void)
42
{
43
  if(dc_act)
44
  {
45
    if(adc_ist > dc_act)
46
    {
47
      if(OCR0B<0xF0) OCR0B++;
48
    }
49
    else if(adc_ist < dc_act)
50
    {
51
      if(OCR0B>0x40) OCR0B--;
52
    }
53
  }
54
  else
55
  {
56
    OCR0B=0xFF;
57
  }
58
}
59
60
void main(void)
61
{
62
  adc_init();
63
  while(1)
64
  {
65
    if(adc_flag)
66
    {
67
      adc_flag=0;
68
      dc_main();
69
    }
70
  }
71
}
!Eingekürzt und Module zusammengelegt, sonst wirds echt zu 
unübersichtlich

von Kopfschüttel (Gast)


Lesenswert?

Rangi, statt hier irgendwie ohne es zu verstehen Code zu kopieren rate 
ich dir das Ganze etwas systematischer anzugehen.
Schau dir das mal an:
https://rn-wissen.de/wiki/index.php/Regelungstechnik

Für den Anfang tuts ein P Regler, danach kannst du ein I Anteil 
dazupacken.

Ansonsten findest du hunderttausende Links zu PID-Regler, aber oft sind 
die zu theoretisch oder mathematisch.

von m.n. (Gast)


Lesenswert?

Bork schrieb:
> PWM, 122Hz  auf einen DC Motor ... ja, ist gut ..
>
> Ich denk, das wird so nichts. Die Frequenz ist viel zu tief.

Ganz im Gegenteil. Viel höher darf sie garnicht sein.

Beitrag "Drehzahlregler für DC-Motor, ATmega48-328"

von Stephan (Gast)


Lesenswert?

@Michael,

naja in den Modellbaureglern (Steller) haben sich sich bis zu 4kHz 
durchgesetzt.

von Udo S. (urschmitt)


Lesenswert?

Stephan schrieb:
> (Steller)

Es geht hier aber explizit um eine Regelung mit Messen der Gegen-EMK

von Berater (Gast)


Lesenswert?

Rangi J. schrieb:
> In jeder Pause warte
> ich das Abbauen des induktiven Stroms ab und messe dann die
> Generatorspannung. Die ist aber nicht konstant und schwankt stark, je
> nachdem wo der Schleifer gerade steht.

Dann musst Du Filtern: Analog, sowohl auch Digital.

Das einfachste ist es, da Du ja offensichtlich Zugang zu einem Oszi 
hast, verschiedene Kondensatoren parallel zum Motor ausprobieren.

In Deinem Programm misst Du dann öfters, damit Du mehr Werte hast, 
natürlich nur während der Generatorspannung. Als Filter dürfte ein 
Median-Filter recht brauchbare Ergebnisse liefern.


> Ich hab eine Variante, die ganz gut schon funktioniert: den Mittelwert
> über 2 Meßwerte und die PWM jeweils um 1 erhöhen oder 1 verringern. Wenn
> der Motor einmal läuft geht das ganz gut, aber beim loslaufen tourt er
> zu hoch und regelt dann zu langsam runter. Wenn ich mehr Meßwerte
> verwende schwingt es sich auf zu einem "stop and go".

Das ist ein Zweites Problemfeld. Dein(e) Regler(schleife) ist nicht 
stabil. Effektiv hast Du einen reinen I-Regler gebaut. Du brauchst aber 
einen PI-Regler oder einen PID.

Beginne mit einem reinen P-Regler, bis der sauber und stabil in allen 
Situationen läuft.

Es gibt noch viele weitere Verbesserungen bis zu einem guten Regler. 
Fange klein an und lerne...

von m.n. (Gast)


Lesenswert?

Stephan schrieb:
> naja in den Modellbaureglern (Steller) haben sich sich bis zu 4kHz
> durchgesetzt.

Bei reinen Stellern ist eine Frequenz oberhalb des Hörbereiches 
sinnvoll: piepst einem nicht die Ohren voll ;-)
Oder man nimmt zum Reglen einen Tachogenerator.

Berater schrieb:
> verschiedene Kondensatoren parallel zum Motor ausprobieren.

Du meinst 1000 µF oder so?
Bloß nicht!

von Berater (Gast)


Lesenswert?

m.n. schrieb:
> Du meinst 1000 µF oder so?
> Bloß nicht!

Oh man. Kontext! Es geht um die Back-EMF-Phase!

Nein, keine µF, sondern nF. Die Back-EMF soll stabilisiert werden...

von m.n. (Gast)


Lesenswert?

Berater schrieb:
> Nein, keine µF, sondern nF. Die Back-EMF soll stabilisiert werden...

Zum Szabilisieren kann man doch ne Zenerdiode nehmen.

von Karli (Gast)


Lesenswert?

Udo S. schrieb:
> Es geht hier aber explizit um eine Regelung mit Messen der Gegen-EMK

wo steht das?

von m.n. (Gast)


Lesenswert?

Rangi J. schrieb:
> Ich lese die Generatorspannung zurück und kann in etwa die
> Drehzahl über den ADC zurück lesen.

Hier.

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


Lesenswert?

Wie immer sollte man schrittweise vorgehen. Zuerst muss sichergestellt 
werden, das die Nummer mit der Gegen-EMK Leserei auch wirklich 
funktioniert. Also Motor mit Poti steuern und dabei die ADC Werte auf 
die Konsole werfen und den Motor mal abbremsen, mal freilaufen lassen 
usw.

Als nächstes ist es für einen Regler wichtig, das er in gleichmässigen 
Intervallen aufgerufen wird. Dazu kann man z.B. die OC ISR benutzen und 
nach z.B. 200 Durchläufen den Regler aufrufen. Und er funktioniert am 
besten, wenn Soll- und Istwerte einigermassen auf gleiche Werte skaliert 
sind.
Dazu kann man z.B. den PID Regler aus AVR221 (heute AN2558 von 
Microchip) implementieren und sowohl I als auch D Werte erstmal auf 0 
drehen.
https://www.microchip.com/wwwAppNotes/AppNotes.aspx?appnote=en591227

Auch hier macht sich eine Konsoleneingabe gut und trägt erheblich zum 
Lerneffekt bei. Alsdann kann man mit den Parametern experimentieren.

Hat man brauchbare Werte, ist es z.B. sinnvoll, diese ins EEPROM oder 
meinetwegen auch in den Code zu fixieren.

: Bearbeitet durch User
von Anja (Gast)


Lesenswert?

Rangi J. schrieb im Beitrag #5885072
:
> Wie macht ihr das? Gibts da irgend eine Anleitung?

Willkommen in der Realität.

Ich kenne in der Praxis kaum einen klassischen (PID) Regler.

- Im einfachsten Fall hat man verschiedene Regelparametersätze.
  Große Verstärkung für große Regelabweichungen. (eventuell ohne 
I-Anteil)
  kleine Verstärkung auf der "Zielgeraden". (dafür mit I-Anteil).

- Wenn man schnell regeln will gibt es meist eine andere Strategie.
  Man modelliert die Last und verwendet für dynamische Vorgänge eine
  reine Steuerung des Ausgangs.
  In deinem Fall würde man eine PWM einstellen die der EMK entspricht.
  (also EMK + innenwiderstand des Motors x Strom durch den Motor)
  Im Idealfall wird der Strom gemessen. (kann auch geschätzt werden).
  Der temperaturabhängige Innnenwiderstand wird dann im Stationärbetrieb
  mit einem überlagerten Regler abgeglichen.

- Zusätzlich gibt es auch noch verschiedene Reglerzustände
  in denen einzelne Regelparameter "eingefroren" werden. (Anti-Windup)
  Wenn die Endstufe am Anschlag ist (z.B. im Start) nützt es nichts wenn
  der I-Regler weiterintegriert und dann später für einen
  Überschwinger sorgt.
  Nach längerer Pause kann es sinnvoll sein den I-Anteil auf einen
  Default-Wert zu setzen.

Gruß Anja

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.