Forum: Mikrocontroller und Digitale Elektronik Timer CTC, PWM wann genau rücksetzen


von Andreas S. (andi__)


Lesenswert?

Hallo,
ich habe eine kleine Verständnisfrage zum genauen Zeitpunkt des 
Rücksetzens des Timers eines AVR beim CTC-Modus und der fast-PWM 
Betriebsart. Wie beide Betriebsarten funktionieren ist mir klar, wo ich 
allerdings in Büchern und im Internet stark abweichende Angaben finde 
ist der Zeitpunkt des Compare-Matches, des zugehörigen Interrupts und 
des Rücksetzen des Timers:

Hier sind die beiden Varianten, die ich für den CTC-Modus in Büchern bzw 
im Internet gefunden habe:

Variante a): TOP-Wert=3 (OCR0=3)

           TCNT0:  0-1-2-3-0-1-2-3-0-1-2-3
  compMatch(int):        |       |       |


Variante b): TOP-Wert=3 (OCR0=3)

          TCNT0:  0-1-2-3-0-1-2-3-0-1-2-3-0
 compMatch(int):          |       |       |


Wie ihr sehen könnt, wird bei Variante a) der Compare Match direkt 
ausgelöst, wenn der Wert im TCNT0 Register gleich dem im OCR0 Register 
ist, während bei Variante b) der Compare Match erst im darauffolgenden 
Zählschritt, also erst in dem Schritt wo der Zähler wieder auf 0 
zurückgesetzt wird gesetzt wird.

Da mich genau dieser Unterschied dieser beiden Varianten verwirrt hat, 
würde ich gerne von euch wissen welche Variante von beiden denn nun die 
Richtige ist.

Schöne Grüße

von Andreas S. (andi__)


Lesenswert?

Da meine Frage gestern Nacht wohl etwas untergegangen ist, möchte ich 
sie jetzt noch einmal stellen und dabei noch ein wenig erweitern. Was 
ich jetzt zu meinem ersten Post noch zusätzlich gerne wissen würde ist 
das Verhalten der Timer bei der Betriebsart fast PWM (clear on Compare 
Match, Set at TOP).

Was mich hier auch wieder genau interessieren würde ist, ob der Compare 
Match und das Rücksetzen von TOP zu 0 im gleichen oder erst im nächsten 
Takt jeweils ausgelöst werden.

Ich brauche das nämlich zum Verständnis der Formel, die uns mein 
Professor beim Studieren zum Berechnen des duty cycles der fast PWM 
Betriebsart gegeben hat:

duty_cycle= (OCR0/TOP)*100%

Weil irgendwie bin ich mir nicht so ganz sicher ob die Formel überhaupt 
stimmt. Im Datenblatt hab ich auch schon gesucht, da find ich aber 
leider nur Formeln zum Berechnen der Frequenzen für die jeweiligen 
Betriebsarten.

Vielen Dank schon mal im Voraus fürs Helfen

von haach (Gast)


Lesenswert?

sowas steht im Datenblatt. Warum nur wird nie der µC genau genannt?
Würd sagen mit einem Takt wird der OCR Wert erreicht. Mit dem nächsten 
Takt findet der Interrupt statt.

von spess53 (Gast)


Lesenswert?

Hi

>Weil irgendwie bin ich mir nicht so ganz sicher ob die Formel überhaupt
>stimmt. Im Datenblatt hab ich auch schon gesucht, da find ich aber
>leider nur Formeln zum Berechnen der Frequenzen für die jeweiligen
>Betriebsarten.

Es gibt auch noch Application Notes:

http://www.atmel.com/dyn/resources/prod_documents/doc2505.pdf
http://www.atmel.com/dyn/resources/prod_documents/doc2542.pdf

MfG Spess

von Werner (Gast)


Lesenswert?

Andreas S. schrieb:
> Da mich genau dieser Unterschied dieser beiden Varianten verwirrt hat,
> würde ich gerne von euch wissen welche Variante von beiden denn nun die
> Richtige ist.

Du könntest in deiner Entwicklungsumgebung den Simulator starten und dir 
anguck, wann das IF gesetzt wird und wann der Zähler zurückspringt.

von Andreas S. (andi__)


Lesenswert?

haach schrieb:
> sowas steht im Datenblatt. Warum nur wird nie der µC genau genannt?
> Würd sagen mit einem Takt wird der OCR Wert erreicht. Mit dem nächsten
> Takt findet der Interrupt statt.

Es ist ein Atmega 128

spess53 schrieb:
> Es gibt auch noch Application Notes:
>
> http://www.atmel.com/dyn/resources/prod_documents/...
> http://www.atmel.com/dyn/resources/prod_documents/...
>
> MfG Spess

Die kannte ich noch gar nicht. Danke für den Hinweis. Leider haben die 
mir für meine Fragen jetzt aber auch nicht entscheiden weiterhelfen 
können.

Werner schrieb:
> Du könntest in deiner Entwicklungsumgebung den Simulator starten und dir
> anguck, wann das IF gesetzt wird und wann der Zähler zurückspringt.

Das geht leider nicht so gut in meinem Fall. Hab nämlich erst wieder 
Dienstag Praktikum wo ich den Controller programmiere und ich hätte 
gerne heut den Sonntag genutzt um mich auf die theoretische Prüfung in 
diesem Fach vorzubereiten.

Kann denn vielleicht jemand was zu der Formel sagen? Weil mir die 
irgendwie ein bischen falsch vorkommt und ich die nirgends wo im 
Internet oder Datenblatt so finden kann.

Gruß Andi

von Karl H. (kbuchegg)


Lesenswert?

Andreas S. schrieb:

> Das geht leider nicht so gut in meinem Fall. Hab nämlich erst wieder
> Dienstag Praktikum wo ich den Controller programmiere und ich hätte
> gerne heut den Sonntag genutzt um mich auf die theoretische Prüfung in
> diesem Fach vorzubereiten.

Probiers einfach aus.
Mach dir eine PWM mit einem Vorteiler von 1024, setz dir eine ISR auf 
und in der ISR siehst du nach welcher Wert im Count Register steht.

> Kann denn vielleicht jemand was zu der Formel sagen?

Das ist ein Simpler Dreisatz

   256 Äpfel kosten     100 Euro
   wieviel kosten 48 Äpfel

   steht das OCR Register auf dem TOP Wert        hast du 100% PWM
   wieviel % PWM hast du, wenn das OCR Register
   auf einem anderen Wert steht

Dazu brauchst du nicht wissen, wann genau das Rücksetzen ausgelöst wird. 
Den einzigen Unterschied, den dieser Zeitpunkt macht ist, ob bei 0% (bzw 
100%) der Pin überhaupt kurz eingeschaltet wird (bzw. überhaupt kurz 
ausgeschaltet wird). Und das findet sich im Datenblatt.

von spess53 (Gast)


Lesenswert?

Hi

Wann die IR-Flags gesetzt werden ist in den Datenblätter unter 
'Timer/Counter Timing Diagrams' zu finden.

MfG Spess

von Andreas S. (andi__)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Mach dir eine PWM mit einem Vorteiler von 1024, setz dir eine ISR auf
> und in der ISR siehst du nach welcher Wert im Count Register steht.

Genau das hab ich jetzt heute mal gemacht. Ich hab ein kleines Programm 
geschrieben und mir die jeweiligen Werte des TCNT0 Registers zum 
Zeitpunkt des CompareMatches bzw des Overflows angeschaut:
1
//------------------------------------INCLUDES HEADER FILES------------------------------//
2
#include <mega128.h>
3
#include <AUTLib.h>
4
#include <stdio.h>
5
#include <delay.h>
6
7
interrupt[16]compareMatch_timer0(); 
8
interrupt[17]overflow_timer0();   
9
10
char output[24];
11
unsigned char value_cm=0, value_ov=0;   
12
  
13
//------------------------------------------START---------------------------------------//
14
 main()
15
{
16
  //Set Up          
17
  DDRC.0=1;
18
        /*TCCR0=0b00001111;    //CTC,PS=1024
19
        OCR0=100;
20
        TIMSK=0b00000010;  //timer0 compare match interrupt enable
21
       */
22
        
23
        TCCR0=0b01001111;  //fast PWM, PS=1024
24
        OCR0=150; 
25
        TIMSK=0b00000011;  //compare match und overflow interrupt enable
26
  SREG.7=1;  //global interrupt enable
27
   
28
   
29
  //Infinite Loop
30
  while(1)
31
  {
32
    sprintf(output,"value_cm=%d",value_cm);    
33
    array2LCD(0,output);  
34
    
35
    sprintf(output,"value_ov=%d",value_ov);    
36
    array2LCD(1,output);  
37
    
38
  }
39
}
40
41
42
/*interrupt[16]compareMatch_timer0()
43
{     
44
       value_cm=TCNT0;  //der Wert im TCNT0 Register ist im CTC-Modus beim compare match Interrupt immer gleich 0
45
         PORTC.0^=1;
46
}
47
*/
48
 
49
 interrupt[16]compareMatch_timer0()
50
 {
51
   value_cm=TCNT0;    //der Wert im TCNT0 Register ist bei fast PWM beim CM interrupt gleich 151 (immer OCR0+1)
52
   PORTC.0=0;   
53
 }
54
 
55
 interrupt[17]overflow_timer0()
56
 {
57
   value_ov=TCNT0;     //der Wert im TCNT0 Register ist beim fast PWM beim overflow interrupt immer gleich 0
58
   PORTC.0=1;
59
 }

Das Ergebnis des jeweiligen Tests hab ich als Kommentar in den 
jeweiligen Interrupt geschrieben.

Es ist also nun so, dass beim CTC-Modus zum Zeitpunkt des CompareMatches 
das TCNT0 Register 0 ist.
Beim fast PWM Modus besitzt das TCNT0 Register zum Zeitpunkt des 
CompareMatches immer den Wert OCR0+1 und zum Zeitpunkt des Overflows ist 
das TCNT0 Register 0.

Mit diesen Erkenntnissen hab ich jetzt mal für den fast PWM Modus mit 
der Annahme der TOP-Wert des Counters ist 3 und OCR0=2 ein kleines 
Diagram skizziert:

TCNT0-Wert:   0-1-2-3-0-1-2-3-0-1-2-3-
PORT-Zustand: ------__------__------__
(--high,__low)

Wenn ich für das nun die duty-cycle Formel anwende komme ich nun auf:

duty-cycle=(OCR0/TOP)*100%=2/3 *100%= 66.66%

Wenn ich den duty cycle jetzt aber nur durch Anschauen meines 
Timing-Diagramms herauslese komme ich aber auf

duty_cycle=high_counts/period *100%= 3/4 *100%= 75%

Mir ist auch klar, dass der Fehler bei einem größeren TOP-Wert, wie 255, 
und einem größeren OCR0-Wert verschwindend gering wird.

Aber es wäre trotzdem schön, wenn mein Timing-Diagramm die Formel zur 
Berechnung des duty-cycles bestätigen würde.

Gruß

von spess53 (Gast)


Lesenswert?

Hi

Am realen Controller gemessen (ATMega644P) stimmt keine der beiden 
Formeln.

Dort ergibt sich für das Tastverhältnis:

dc=(OCR+1)/(TOP+1).

MfG Spess

von Andreas S. (andi__)


Lesenswert?

spess53 schrieb:
> Hi
>
> Am realen Controller gemessen (ATMega644P) stimmt keine der beiden
> Formeln.
>
> Dort ergibt sich für das Tastverhältnis:
>
> dc=(OCR+1)/(TOP+1).
>
> MfG Spess

Hi Spess, das ist doch genau das was mein Timing Diagramm aussagt. Bei 
dem hab ich ja beispielhalft OCR0=2 und TOP=3 gehabt. Und der duty cycle 
war bei mir ja da 75%, weil ich dc=3/4 *100% , also 
dc=((OCR0+1)/(TOP+1))*100% gerechnet habe.
Das bedeutet dann wohl, dass die allgemein verwendete Formel 
duty_cycle=OCR0/TOP *100% als eine hinreichend genaue Näherung 
betrachtet wird.

Gruß

von spess53 (Gast)


Lesenswert?

Hi

>Das bedeutet dann wohl, dass die allgemein verwendete Formel
>duty_cycle=OCR0/TOP *100% als eine hinreichend genaue Näherung
>betrachtet wird.

Für Phase/Frequency Correct PWM stimmt diese Formel. Bei Fast PWN nicht. 
In der Praxis wird wohl der Fehler vernachlässigt.

MfG Spess

von Andreas S. (andi__)


Lesenswert?

spess53 schrieb:
> Für Phase/Frequency Correct PWM stimmt diese Formel. Bei Fast PWN nicht.
> In der Praxis wird wohl der Fehler vernachlässigt.
>
> MfG Spess

Gut zu wissen. Danke für deine Hilfe

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.