Forum: Mikrocontroller und Digitale Elektronik Atmega1284, Phase and Frequency Correct PWM nicht wirklich Phasenrichtig


von Micha A. (miwes)


Angehängte Dateien:

Lesenswert?

Hallo Hallo,
es ist grad ein wenig zum Haare raufen.

Das Datenblatt hab ich mittlerweile x-mal gelesen und den Debugger 
gequält. Viel schlauer werd ich aber derzeit nimmer.

Daher schilder ich mal was ich mach und das Problem. Vll sieht ja jmd. 
meinen Fehler

Ich betreibe Timer 1 und 3 im Phase And Freq. correct PWM mit ICRn als 
TOP.
Im Interrupt von Timer 3 setze ich PD7 high und low um die Dauer der ISR 
mit Oszi zu messen. OCRn setze ich im ISR auf einen (derzeit) festen 
Wert.

Resultat:

- PD7 wird zweimal, anstatt nur einmal, in einer Periode der PWM 
getoggelt
- phasenkorrekter aufruf des ISR: nein

hier die code-Teile die ich habe.
1
#define F_CPU                         16000000
2
#define PWM_FREQ                      10000
3
#define PWM_CORRECTION                1
4
#define PWM_RESOLUTION                (F_CPU/PWM_FREQ)>>PWM_CORRECTION
5
#define TCCR1A_COMA                   (1<<COM1A1)
6
#define TCCR1A_COMB                   (1<<COM1B1)
7
#define TCCR1B_WGM_CLK                (1<<WGM13)|(1<<CS10)
8
#define TCCR1A_WGM_CLK                (1<<WGM13)|(1<<CS10)
9
10
#define TCCR3A_COMA                   (1<<COM3A1)
11
#define TCCR3B_WGM_CLK                (1<<WGM13)|(1<<CS10)
12
13
int main(){
14
15
    ICR1 = PWM_RESOLUTION;
16
    ICR3 = PWM_RESOLUTION;
17
    TCCR1A|=TCCR1A_COMA|TCCR1A_COMB;
18
    TCCR3A|=TCCR3A_COMA;
19
    TIMSK3|=TIMSK3_OCIE3A;
20
    TCCR1B=TCCR1B_WGM_CLK;
21
    TCCR3B=TCCR3B_WGM_CLK;
22
    OCR3A=dc;
23
    OCR1B=dc;
24
    OCR1A=dc
25
    sei();
26
    
27
    while(1){
28
    }
29
}
30
31
 ISR(TIMER3_COMPA_vect)
32
 {
33
    ioport_set_pin_level(TPD7,IOPORT_PIN_LEVEL_HIGH);
34
    TIFR3|=(1<<OCIE3A);
35
    ioport_set_pin_level(TPD7,IOPORT_PIN_LEVEL_LOW);
36
    //ADC_Read(gui8_ADC_channel);
37
        OCR3A=dc;
38
        OCR1B=dc;
39
        OCR1A=dc;
40
 }

Auf dem angehängten Bild sollte man trotz Lichtquelle die PWM mit dem DC 
von 0.75 erkennen und die beiden beieinander liegenden toggles.

von c-hater (Gast)


Lesenswert?

Micha Arl schrieb:

> Das Datenblatt hab ich mittlerweile x-mal gelesen

...aber offensichtlich nicht verstanden.

Genauer: dir fehlt es vollständig am Verständnis der Funktionsweise der 
"fortgeschrittenen" PWM-Modi, du kannst dich nicht von den primitiven 
Denkmustern des Fast-PWM lösen.

Sozusagen als Folgeschaden dieses grundsätzlichen Unverständnisses bist 
du auch nicht in der Lage, eine geeignete Testumgebung aufzusetzen. Das 
zeigt sich ganz eklatant in der Wahl der Interruptquelle für deine 
"Synchronpulse", anhand derer du die Phasenkorrektheit prüfen willst...

...

Also: Sowohl der PhaseCorrect- als auch der Phase&FrequencyCorrect-Modus 
sind "dual slope" Modi. Das ist der springende Punkt! Und d.h.: 
innerhalb eines PWM-Zyklus wird einmal von BOTTOM bis TOP gezählt und 
dann wieder herunter von TOP bis BOTTOM.

Dieser Sachverhalt impliziert, daß es für jeden beliebigen Wert in den 
OCR-Registern (mit Ausnahme von BOTTOM und TOP) zwei Matches während 
eines PWM-Zyklus geben muss und darüber hinaus, daß deren 
Phasenwinkel zueinander unmöglich konstant sein kann. Tatsächlich ist 
die Existenz der zwei Sonderfälle OCR=BOTTOM und OCR=TOP der Tatsache 
geschuldet, daß der Phasenwinkel der beiden Matches dann 0 bzw. 2*Pi 
beträgt, weshalb sie im PWM-Zyklus schlicht auf den gleichen Moment von 
dessen Periode fallen.

Wenn man das soweit erstmal kapiert hat, wird sofort klar, daß die 
"Phasenkorrektheit" oder "Frequenzkorrektheit" in den Namen der PWM-Modi 
sich unmöglich auf die Lage des/der Compare-Matches beziehen kann.

Sie beziehen sich natürlich vielmehr auf die Zeitpunkte, in denen der 
Zähler BOTTOM oder TOP erreicht (PhaseCorrect-Modus) oder sogar nur auf 
den Zeitpunkt, wenn der Zähler BOTTOM erreicht 
(Phase&FrequencyCorrect-Modus).

Deine einzige Möglichkeit für einen sinnvollen Test des 
Phase&FrequencyCorrect-Modus ist also einen Interrupt zur Erzeugung des 
Synchronsignals zu benutzen, der in dem Moment ausgelöst wird, wenn der 
Zähler den BOTTOM-Wert erreicht. Nun ist (sicher nicht ganz zufällig :o) 
die Sache so, daß ausgerechnet in diesen fortgeschrittenen PWM-Modi der 
Overflow-Interrupt des Timers just in diesem Moment ausgelöst wird...

Der Sinn dieser Sache ist aber eigentlich nicht, dir ein schickes 
Oszi-Bild liefern zu können (obwohl das auch geht... :o), sondern du 
sollst deine verfickten OCR- und ICR-Register in dieser ISR mit einem 
neuen Wert versehen!
Nix anderes steckt nämlich hinter diesem hochtrabendenden Gelalle von 
Phasen- und Frequenzkorrektheit. Der Moment der Übernahme der Änderungen 
der Registerwerte in den Zählbetrieb.
Und nun glaub ja nicht, daß Änderungen in der ISR unverzüglich dorthin 
übernommen werden. Nein, tatsächlich ist es so, daß im Moment der 
Auslösung des Interrupts (etliche Takte vor Eintritt in die ISR) die 
zuletzt davor gesetzen Werte gerade erst für den aktuellen PWM-Zyklus 
wirksam wurden.
Die ISR stellt also nur die früheste zuverlässige Möglichkeit dar, denn 
nächsten PWM-Zyklus (u.U. noch weit in der Zukunft!) nach eigenen 
Wünschen zu modifizieren. Der gerade laufende ist in diesem Moment 
bereits unwiederbringlich abgehakt.

Wichtig ist dieser Sachverhalt insbesondere für Regler. Das ist nämlich 
eine "schicke" Extra-Totzeit von einem vollen PWM-Zyklus, also bei 
Phase&FrequencyCorrect sogar variabel. Das kann bei bestimmten 
Anwendungen schon mal extrem störend sein. Vor allem, wenn man beim 
Reglerdesign blöderweise nicht berücksichtigt, daß sie existiert...

von Micha A. (miwes)


Lesenswert?

Wow, danke für die ausführliche Erklärung. Auch wenn ich ein totales 
Unverständnis mir nicht unterstelle, sind da echt erhellende Momente 
bei. Wie genau der ISR platziert ist schau ich mir morgen gründlich an.

Dual Slope war mir bekannt. Nur das der Interrupt zweimal ausgelöst 
wird,  war dem Datenblatt nicht EINDEUTIG (da gibts sone Skizze, in der 
der Interrupt NUR bei top ausgeöst wird) zu entnehmen.

Aber nochmal danke dir. Ich vermute ganz stark du hast recht und das 
hilft mir weiter. ;)

Im Reglerentwurf hab ich zumindest an die Totzeit schonmal gedacht. Also 
gut das du das bestätigst.

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.