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
PWM, 122Hz auf einen DC Motor ... ja, ist gut .. Ich denk, das wird so nichts. Die Frequenz ist viel zu tief.
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.
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
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.
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"
@Michael, naja in den Modellbaureglern (Steller) haben sich sich bis zu 4kHz durchgesetzt.
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...
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!
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...
Berater schrieb: > Nein, keine µF, sondern nF. Die Back-EMF soll stabilisiert werden... Zum Szabilisieren kann man doch ne Zenerdiode nehmen.
Udo S. schrieb: > Es geht hier aber explizit um eine Regelung mit Messen der Gegen-EMK wo steht das?
Rangi J. schrieb: > Ich lese die Generatorspannung zurück und kann in etwa die > Drehzahl über den ADC zurück lesen. Hier.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.