Liebe Forenuser, ich habe ein Problem bei dem ich nicht mehr weiterkomme. Ich arbeite mit der Bibliothek von peter dannegger mit dem ich einen 1-Wire Temp. Sensor ansteuere. Dieser dient mir zur Digitalisierung von dem momentanen Wert der Temperatur. Ich implementiere einen Regler, wo ich den y-Wert der Reglergleichung in das OCR0 Register schreibe. Nun zum Problem: Jedes mal wenn ich einen Wert aus dem Sensor lese, kippt das PWM Signal. Also jedes mal wenn ich einen Wert auslese, springt das PWM Ausgangssignal vom non-inverting zum inverting mode. Und ich weiß nicht wieso das so ist. Ich habe neben meinem vollständigen Code auch noch 2 screenschots angehängt. Ich habe gestern Stunden damit verbracht nach dem Fehler zu suchen, aber ich sehe keine Verbindung zwischen der Bilbiothek vom peter dannegger und dem PORTA an dem ich das PWM Signal ausgebe. Wenn ich die Konvertierung, also Zeilen 63-67 auskommentiere und nur eine laufvariable in das Register schreibe funktioniert es auch nur halbwegs. Ich habe das in der pwm.c versucht. Ich habe den Timer2 auf non-inverting Mode gestellt und manchmal ändert er auch das tastverhältnis vom inverting mode...??? Irgendwas mache ich da mit der konfiguration des timers falsch... Ich bitte höfflich um hilfe... F.S.
Hi >volatile unsigned int y; > else if(y<0) Wie soll ein unsigned int kleiner als Null werden. Bei 16 Bit z.B. kann es nur die Werte von 0..65535 annehmen. MfG Spess
@ spess53. das ist mir sehr peinlich. ja, natürlich hast du recht und das habe ich schon ausgebessert. Aber bei dem reinen PWM beispiel (pwm.c) hat das eh keine wuswirkung, da ja mit 'j' raufgezählt wird. Danke für Deinen Hinweis.
Das mag schon sein. Aber
1 | j=j+10; |
2 | if(j==255) |
3 | j=1; |
wenn du j bei 10 beginnen lässt und immer 10 dazu zählst, dann wird das garantiert niemals den Wert 255 ergeben. Das RAR-File hab ich mir noch nicht angesehen, weil der Download und das Öffnen von RAR-Files hier bei mir immer so eine umständliche Sache ist.
> Ich habe den Timer2 auf non-inverting Mode gestellt und manchmal > ändert er auch das tastverhältnis vom inverting mode...??? OK. Jetzt mit dem RAR File Bereinige doch bitte erst mal deinen Code. Da ist Kraut und Rüben durcheinander und ich hab jetzt ehrlich gesagt nicht wirklich Lust da erst mal rauszusortieren, was davon alles relevant ist und was nicht. Brauchst du für einen PWM Test (bzw. Timer Test) einen PID Regler? Nein, brauchst du nicht. Lies einfach den Sensor aus, gib den Wert meinetwegen an die UART aus und schreib ihn geeignet skaliert ins OCR Register. Bereinige deinen Code demenstrechend, so dass nur noch das da drinnen enthalten ist und nicht mehr. Ich geh mal davon aus, dass dein 1-Wire Sensor ein DS1820 ist. Dann berührst du denn eben und erwärmst ihn auf diese Art und siehst dir an, was die zugehörige PWM macht. Aber so ist das viel zu viel Trash rund um das eigentliche Problem.
Hallo Karl Heinz Buchegger, Karl Heinz Buchegger schrieb: > Das mag schon sein. > > Aber j=j+10; > if(j==255) > j=1; > > wenn du j bei 10 beginnen lässt und immer 10 dazu zählst, dann wird das > garantiert niemals den Wert 255 ergeben. Ich habe es jetzt so probiert:
1 | int main(void) |
2 | {
|
3 | DDRA=0xFF; |
4 | |
5 | TCCR2=(1<<WGM21)|(1<<WGM20)|(1<<COM21)|(0<<COM20)|(0<<CS22)|(1<<CS21)|(1<<CS20); |
6 | TIMSK|=(1<<OCIE2); |
7 | |
8 | sei(); //Global Interrupt enable aktivieren |
9 | |
10 | while(1) |
11 | {
|
12 | // j++;
|
13 | // if(j>255)
|
14 | // j=0;
|
15 | // OCR2 = (j-1); //Übergabe Stellgröße
|
16 | OCR2 = 20; |
17 | _delay_ms(10); |
18 | }
|
19 | return 0; |
20 | }
|
Ich habe gesehen das ich den falschen Modus verwende. Der Phase Correct Modus zählt dann wieder runter und das bewirkt dann das Kippen, da sich das ganze nun umdreht. Wenn ich aber den Fast PWM Mode benutze zählt der nur bis 128. Ich habe zur Zeit nur 20 eingegeben. Aber ich messe am Oszi ein 50%tiges Tastverhältnis.Ich verstehe das nicht so ganz...
Hi >Ich habe es jetzt so probiert: >int main(void) >{ > DDRA=0xFF; OC2 liegt an PinD7. MfG Spess
spess53 schrieb: > Hi > >>Ich habe es jetzt so probiert: > >>int main(void) >>{ >> DDRA=0xFF; > > OC2 liegt an PinD7. > > MfG Spess Ja, aber ich apreche das OCR2 an. Das ist ja nur ein 8 Bit breites Register. Im Prinzip verstehe ich einfach nicht warum der Fast PWM mode kein duty cicle mit dem wert 20/255 hat... laut datenblatt des ATmega32 steht: COM21 COM20 Description 0 0 Normal port operation, OC2 disconnected. 0 1 Reserved 1 0 Clear OC2 on compare match, set OC2 at BOTTOM, (non-inverting mode) 1 1 Set OC2 on compare match, clear OC2 at BOTTOM, (inverting mode) Ich habe bei COM21 '1' und bei COM20 '0' eingegeben. Dadruch müsste der Timer2 doch bis zum Wert 20 (OCR2 = 20) raufzählen und wieder bei BOTTOM, also 0 wieder anfangen, so habe ich das jetzt vestanden. Ich habe den Screen wieder angehängt.
Hi >Ja, aber ich apreche das OCR2 an. Das ist ja nur ein 8 Bit breites >Register. Was hat das damit zu tun, das du PD7 nicht als Ausgang setzt? Wo misst du eigentlich? Ich habe mit deinen Initialisierungswerten den Timer2 von einem ATMega16 gefüttert und es wird, wie erwartet, ein Tastverhältnis von 20:235 angezeigt. MfG Spess
F. S. schrieb: >> OC2 liegt an PinD7. >> >> MfG Spess > > Ja, aber ich apreche das OCR2 an. Das ändert aber nichts daran, dass die vom Timer 2 generierte PWM am Pin OC2 rauskommt. Was soll eigentlich der ganze Quatsch mit einer eigenen ISR? Entweder du lässt den Timer die PWM generieren oder du machst eine Softw-PWM selber, in dem du den Timer ganz normal laufen lässt und dich selber im Compare-Match bzw Overflow um die ganzen Details der PWM kümmerst. Entweder, oder. Aber nicht ein Teil von da und ein Teil von dort.
Hi
>Was soll eigentlich der ganze Quatsch mit einer eigenen ISR.
Wahrscheinlich resettet jetzt sein Programm deshalb ständig.
MfG Spess
Schön langsam ist mir auch klar, was da passiert.
Du erwartest irgendwie magisch, dass dein A-Pin irgendwie die
PWM-Einstellungen wiederspiegelt.
Nö. Das tut er selbstverständlich nicht. Der hat mit der PWM nichts zu
tun.
Und wenn dann zwischendruch mal die Interrupts gesperrt werden, dann
verpasst du ein paar Compare-Matches und da du in der ISR den Pin
toggelst, dreht sich dann irgend wann mal die Polarität um.
> Aber ich messe am Oszi ein 50%tiges Tastverhältnis.
Auch logisch. Denn der Zähler zählt immer 256 Takte ab, bis dann der
nächste Compare Match kommt. Und das ist unabhängig davon, bei welchem
Compare Match die ISR dann tatsächlich angesprungen wird. Wenn du eine
Referenzfrequenz an einem Pin hättest, würde sich deine 'PWM' in der
Phase zu dieser Referenz mit dem OCR Wert verschieben. Aber das
Tastverhältnis bleibt dasselbe. Nämlich 50%
Und so wie ich das sehe, hast du ohnehin keine andere Wahl, als komplett auf Hardware-PWM zu gehen. Denn bei einer Software-PWM ist es unabdingbar, dass kein einziger Interrupt verloren geht und exakt (na ja) zum richtigen Zeitpunkt kommt. Das geht aber bei dir wieder nicht, weil die 1-Wire Routinen aus Timing-Gründen die Interrupts kurzzeitig mal sperren müssen. Und damit hast du keine stabile Software-PWM mehr. Also: umdisponieren. Was immer du an diesem Pin am Port A hängen hast, muss an den OC2 Ausgang am Port D. Wenn deine Platine schon fertig ist, dann hast du Pech gehabt. Dann gibt es nur noch den Griff zum Teppichmesser, die Bahn durchschneiden, mit Draht eine neue Verbindung zu diesem OC2 Pin ziehen und die Platinenversion von 1.0 auf 0.9 zu ändern. Wenn du noch am Steckbrett bist, dann ist das ja kein Thema. Dann zeichnet man eben den Schaltplan um und alles ist wieder in Butter, wenn es dann zum Layouten kommt.
Hallo, danke euch beiden, Karl Heinz Buchegger und spess53. Ihr habt mir sehe geholfen und ich hab auch einiges dazugelernt. Ich belasse es bei der Hardware PWM, das macht mir vieles einfacher. Danke euch beiden. Dieses Forum hat mir wieder einmal sehr geholfen. lg F.S.
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.