Forum: Mikrocontroller und Digitale Elektronik PWM Störung durch 1-Wire


von F. S. (de0_board)


Angehängte Dateien:

Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von F. S. (de0_board)


Lesenswert?

@ 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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

> 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.

von F. S. (de0_board)


Lesenswert?

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...

von spess53 (Gast)


Lesenswert?

Hi

>Ich habe es jetzt so probiert:

>int main(void)
>{
>    DDRA=0xFF;

OC2 liegt an PinD7.

MfG Spess

von F. S. (de0_board)


Angehängte Dateien:

Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

Hi

>Was soll eigentlich der ganze Quatsch mit einer eigenen ISR.

Wahrscheinlich resettet jetzt sein Programm deshalb ständig.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

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%

von Karl H. (kbuchegg)


Lesenswert?

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.

von F. S. (de0_board)


Lesenswert?

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
Noch kein Account? Hier anmelden.