Hallo , Zur Zeit arbeite ich mit einem ATtiny26 und versuche ich ein PWM Signal mit einstellbaren Frequenz erzeugen. Ich soll einen Tiefsetzsteller entwerfen, Eingangspannung 12V, die Ausgangsspannung ist 0 bis 12V. Schaltplan und Board habe ich mit Software Eagle gemacht. Ich habe eine einfachen Code geschreiben um die Platine zu testet, jetzt ist meine Hardware alles in Ordnung. Aber Programmierung klappt leider nicht. Hier brauche ich 2 AD Kanäle, ein ist Soll-Wert, der andere ist Ist-Wert. Eigentlich soll ist auch einen PI Regler entwerfen, aber zuerst möchte icht eine andere einfachere Methode bunutzen. Mein Code ist auf Assembler. Ich habe die Schaltplan hochgelanden,es gibt ein fehler, dass R6 soll weg sein. ich bin eine außlandische Studentin, deswegen mein Deutsch ist nicht so gut.Ich hoffe ich habe schon gut erklärt. Wäre schön, wenn mir jemand einen hilfreichen Tipp geben kann. Danke und Gruß. Di
Das Programm ist noch sehr verbesserungswürdig, aber der Hauptfehler ist, dass nach dem Starten der AD-Wandlung nicht auf dessen Ende gewartet wird:
1 | sbi ADCSR,ADSC ;ADC lesen hier wird die AD-Wandlung gestartet |
2 | sbic ADCSR,ADSC |
3 | rjmp pc-1 ; warten bis fertig! |
4 | in Usoll, ADCH |
5 | . |
6 | . |
7 | . |
8 | sbi ADCSR,ADSC ;ADC lesen hier wird die AD-Wandlung gestartet |
9 | sbic ADCSR,ADSC |
10 | rjmp pc-1 ; warten bis fertig! |
11 | in Uist, ADCH |
Hi Dwang, zum Testen könntest Du Dein Programm in einzelne Module zerlegen: - ADC-Sollwert - ADC-Istwert - PWM Den Tiefsetzsteller könntest Du, sobald die fehlenden Speicherelemente und eine Minimallast angeschlossen sind(Lückbetrieb!) mit einer festen PWM testen (z.B. 50:50). Dann kannst Du mit dem Istwert und dem Sollwert ADC weitermachen. Danach kommt die Regelungsentwicklung. Cheerio, marcus
>Zur Zeit arbeite ich mit einem ATtiny26 und versuche ich ein PWM Signal >mit einstellbaren Frequenz erzeugen. Wozu soll das gut sein? Normalerweise verändert man bei einer PWM das Tastverhältnis um irgendwas einzustellen, und nicht die Frequenz.
holger schrieb: >>Zur Zeit arbeite ich mit einem ATtiny26 und versuche ich ein PWM Signal >>mit einstellbaren Frequenz erzeugen. > > Wozu soll das gut sein? Normalerweise verändert man bei einer > PWM das Tastverhältnis um irgendwas einzustellen, und nicht die > Frequenz. Das ist nicht unüblich. Durch die Anpassung der Frequenz kann man z.B. das Tastverhältnis und damit den Ripple lastabhängig optimieren. Ein (hässlicher) Nebeneffekt ist allerdings die Frequenzvariation des Störspektrums.
:
Bearbeitet durch User
holger schrieb: >>Zur Zeit arbeite ich mit einem ATtiny26 und versuche ich ein PWM Signal >>mit einstellbaren Frequenz erzeugen. > > Wozu soll das gut sein? Normalerweise verändert man bei einer > PWM das Tastverhältnis um irgendwas einzustellen, und nicht die > Frequenz. Genau so steht es ja auch im Programm, TOP der PWM, also OCR1C, ist auf 200 festgenagelt, OCR1B wird zwischen minTein (0) und maxTein (200) variiert.
Vielen dank für deine Antwort! Heute habe ich nur ein AD Kanal benutzt, und der Soll-Wert benutze ich einen Festwert "adcsoll". Jetzt kann ich ein pwm signal bekommen, aber mit verschiedene adcsoll, das PWM Signal andert sich nicht, immer das gleiche Tastgrad. ist mein Code falsch? Grüßen Di
Das Programm scheint richtig zu sein, mit Ausnahme des Kommentars > LDI temp1, (1<<ADLAR) | (1<<MUX2) | (1<<MUX0); Auswählen > von ADC4 und Referenzspannung VCC Wenn ich Uist an ADC5==PA6 (!) anschließe, funktioniert es bei mir.
vielen Dank für deine Antwort. bei dir ist es funktioniert? bei mir ist es leider nicht, mit unterschiede Usoll ist das PWM Singal immer gleich. Tastgrad ist 50%.
Usoll? In f.asm gibt es kein Usoll. Zu meinem Vorgehen: ich übernehme das zuletzt gezeigte Programm (f.asm), assembliere es mit avrasm2 und bringe das Resultat in den ATtiny26. Am Ausgang OC1B==PB3 ist ein RC-Glied angeschlossen, von diesem wird auf ADC5==PA6 rückgekoppelt. Direkt an PB3 hängt ein Oszilloskop, an PA6 ein Zeigermultimeter. Wenn ich nun in f.asm den Parameter adcsoll ändere, so folgt das Multimeter sehr schön dieser Änderung, und auch das Oszillogramm sieht entsprechend aus, der Tastgrad variiert, aber die Tendenz stimmt.
Hier(f.asm) Usoll ist adcsoll, leider dieser Code bei mir geht nicht. Heute habe ich einen PI Regler geschrieben, Kp und Ki habe ich 1 benutzt, ich habe kein Ahnung,wie die Umwandlung von Dezimal in Binärsystem ist. Am Ausgang ist das Ausgangspanung immer 12V, Tastgrad 100%. ich habe gar keine Erfahrungen über Mikrocontroller und Assemblerprogrammierung.Sorry für die dummen fragen. vielen Dank! DI
Ich verstehe nicht, weshalb bei Ihnen das f.asm nicht läuft; mir scheint, dass Programmversionen durcheinander gebracht werden und im ATtiny26 nicht das aktuelle Programm läuft. Vorschlag: lassen Sie dieses Einfachst-PWM-Programm laufen, wenn das klappt, sehen wir weiter:
1 | .include"tn26def.inc" |
2 | ; sysCK = 1 MHz |
3 | .def tmp0 = r16 |
4 | .cseg |
5 | .org 0 |
6 | sbi DDRB,3 ; OC1B |
7 | ldi tmp0,(1<<COM1B0)|(1<<PWM1B) ; PWM -> OC1B |
8 | out TCCR1A,tmp0 |
9 | ldi tmp0,(1<<CS11) ; sysCK/8 |
10 | out TCCR1B,tmp0 |
11 | ldi tmp0,255 |
12 | out OCR1C,tmp0 |
13 | ldi tmp0,32 |
14 | main_loop: |
15 | out OCR1B,tmp0 |
16 | ldi YL,15 |
17 | wait: ; 4 s @ 1 MHz |
18 | sbiw XL,1 |
19 | brne wait |
20 | dec YL |
21 | brne wait |
22 | subi tmp0,-64 |
23 | rjmp main_loop |
Wenn sich Ihr ATtiny26 im Auslieferungszustand befindet, dann läuft er mit einem Systemtakt von 1.0 MHz, damit müsste alle 4 s der Tastgrad weitergeschaltet werden von 1/8..3/8..5/8..7/8.
Also zunächst fehlt bei den DEFS in pi.asm die Definition des "uber", das Programm kann somit nicht fehlerfrei kompiliert werden. Es fehlt: .DEF uber=r20 Grüße Norbert
:
Bearbeitet durch User
Heute bin ich wieder im Labor, gerade habe ich das Einfachst-PWM-Programm, das Sie geschrieben haben,bei mir benutzt. Das bei mir Laüft sehr schön.Ich glaube, mein problem ist AD wandler. Mit PI regler ist das Ergebnis nicht stabil, wenn ich den Sollwert(die Spannung auf dem Schieberegler)einstelle, ist am Ausgang das Ausgangspanung immer 12V. Wahrscheinlich ist mein PI regler fasch.
Vorab: meine Kenntnisse in Regeltechnik sind sehr gering, eigentlich sollte jemand anders weiterhelfen. Sollte aber der Programmteil "pi regler" nicht ungefähr wie folgt aussehen, bezogen auf die zuletzt gezeigte Version 'pi.asm':
1 | ;pi regler |
2 | |
3 | cp Usoll,Uist |
4 | brlo negativ |
5 | positiv: |
6 | sub Usoll,Uist |
7 | mov e,Usoll |
8 | add esum,e |
9 | brcc pc+2 ; Überlauf? |
10 | sub esum,e |
11 | mov Tein,esum |
12 | rjmp main |
13 | |
14 | negativ: |
15 | sub Uist,Usoll |
16 | mov e,Uist |
17 | sub esum,e |
18 | brcc pc+2 ; Überlauf? (eigentlich "Unterlauf") |
19 | add esum,e |
20 | mov Tein,esum |
21 | rjmp main |
oder eher:
1 | positiv: |
2 | .. |
3 | brcc pc+2 ; Überlauf? |
4 | ldi esum,maxTein |
5 | .. |
6 | negativ: |
7 | .. |
8 | brcc pc+2 ; Überlauf? (eigentlich "Unterlauf") |
9 | ldi esum,minTein |
10 | .. |
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.