Timer-Überlauf bei Hardware PWM

OP #4027719
Lesenswert?
• ▲
▼
Hallo,

Ich habe mittels Hardware PWM einen verstellbaren Frequenzgenerator 
programiert. Da der Timer beim verstellen manchmal übergelaufen ist und 
die Frequenz versaut hat habe ich folgendes gemacht:
1
int frequenz(int y)
2
{
3
if(TCNT3>=y)          // Prüfung ob neuer Top-Wert gleich oder niedriger als die aktuelle Timerposition ist
4
{
5
TCNT3 = 0 + (TCNT3 - y);      // Wenn ja dann wird der Timer auf 0 + den bereits überschrittenen Wert gesetzt
6
}
7

8
ICR3 = y;          // Top-Wert wird festgelegt
9
OCR3A = 127;          // Anzeit 50%
10

11
return 0;
12
}

Der µC ist ein ATMega1284P mit exteren Oszillator 7,3728 Mhz
Hier noch der Timer init:
1
void timer_init(void)
2
{
3
TCCR3A = (1<<COM3A1) | (1<<WGM31);
4
TCCR3B = (1<<WGM33) | (1<<WGM32) | (1<<CS32); // Vorteiler 256 Takt 7,3728 Mhz 
5
}

Szenario:

Timer ist bei 32765 von max 32767.
Aktueller Topwert ist bei 32766 und wird auf 32000 geändert.
In der Bearbeitunszeit von if(TCNT3>=y) und TCNT3 = 0 + (TCNT3 - y); ist 
der Timer wieder bei 0.
0-32000=-32000?

Meine Frage ist ob der Befehl TCNT3 = 0 + (TCNT3 - y); so ok ist und wie 
lange der µC für dies Operation braucht bzw ob es auch eleganter zu 
lösen geht?

MFG
LED_PI
#4027777
Lesenswert?
• ▲
▼
T. P. schrieb:
> TCNT3 = 0 + (TCNT3 - y)

Das ist doch Unsinn.  Stell das mal um (Kommutativgesetz):
1
TCNT3 = (TCNT3 -y) + 0;

Daraus wird dann:
1
TCNT3 = TCNT3 -y;

Oder schön griffig in C:
1
TCNT3 -= y;

Das Schöne dabei ist, dass der Compiler sich auf diesen Quatsch nicht 
einlässt und alle Varianten gleich lange dauern. Im *.lss kannst du dir 
angucken, was er daraus macht und nachzählen, wie viele Takte das 
dauert.

mfg.
Gast #4027828
Lesenswert?
• ▲
▼
T. P. schrieb:

> Ich habe mittels Hardware PWM einen verstellbaren Frequenzgenerator
> programiert. Da der Timer beim verstellen manchmal übergelaufen ist und
> die Frequenz versaut hat

Dann hast du schlicht den FALSCHEN (für deinen Zweck ungeeigneten) 
PWM-Modus verwendet.

Phase&FrequencyCorrect wäre der richtige gewesen, da kümmert sich 
nämlich die Hardware selber auch um dieses Problem, da werden nämlich 
auch Zugriffe auf das die Frequenz bestimmende Register automatisch 
synchronisiert.

Das ist auch bitter nötig, denn eine vollständige Lösung des Problems in 
Software ist nicht bzw. nur für einen nach oben weit unter die 
Möglichkeiten des Timers selber eingeschränkten Frequenzbereich möglich.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.