Forum: Mikrocontroller und Digitale Elektronik Stm32F4 - Timer Offset


von Johannes W. (johwi)


Lesenswert?

Hallo uC - Community,


ich habe da mal eine Frage, da ich weder hier noch im www bisher fündig 
geworden bin.

Ich möchte einen Sinus über zwei Timer ausgeben, welche um einen Wert x 
in ihren Zählregistern verschoben sind.
Soll heißen der Timer 1 zählt von 0-10000, der Timer 2 von 10000-20000, 
jedoch beide mit der gleichen Frequenz.

Ist es möglich einem Timer einen Offset mitzugeben, dass dieser z.B. von 
10000 bis 20000, und nicht von 0 bis 20000 zählt?

Ich habe es bisher über einen define auf das Register Tim1_Cnt 
versucht(sozusagen als preload der counter value), jedoch fängt er 
sobald er den Overflow erreicht hat immer wieder von 0 an zu zählen.

Mein aktuelles Board ist ein STM32F4 - Discovery.


Viele Grüße
Johannes

von Peter K. (Gast)


Lesenswert?

Du kannst in der Overflow Interrupt ISR immer den Tim1_Cnt auf den 
Preloadvalue setzten.

Im Datenblatt unter Timer steht auch dass die Timer TIM2 TIM3 TIM4 TIM5 
über einen Autoreload verfügen, dann musst du das oben genannte nicht 
machen und den Timer einfach in den Autoreloadmodus versetzen und deinen 
gewünschten Reloadwert in ein Register schreiben.

von Johannes W. (johwi)


Lesenswert?

Hallo,

erstmal danke für die Antwort.

Ich habe mich vielleicht etwas unglücklich ausgedrückt.
Ich sollte wohl dazu sagen, das ich die Timer in Center-aligned 
betreibe.

Dieser zählt also von sagen wir Cnt 10000 bis zur ARR von 20000 und 
wieder zurück. Nun stoppt er aber nicht bei "10000" sondern zählt weiter 
hinunter bis 0 und gibt das cnt underflow.

Ich versuche wie gesagt mithilfe von 2 Timern(Tim1&8) einen Sinus 
auszugeben. Sobald der Wert der Sinustabelle 10000 überschreitet, soll 
der "untere" Timer(0-10000) dauerhaft Signal geben und der "obere" 
Timer(10000-20000) übernehmen den Sinus zu takten.

Funktioniert soweit ganz gut, jedoch schaffe ich es nicht, dass der 
obere Timer quasi seinen "Endwert" bei 10000 und nicht bei 0 hat.

Meine nächste Idee wäre durch das Capture/Compare des oberen Timers 
einen DMA auszulösen, der die CNT_value um 10000 decrementiert.

Sozusagen zählt der Timer dann von "0+10000" bis 20000.
Und zurück von 20000 bis zum CC-10000, also wieder auf 0.
Ich benötige ja nur die beiden CC um den Sinus zu takten.

Diese Lösung, sofern das funktionieren kann?!?, scheint mir zwar alles 
andere als elegant, aber ich versuche es einfach mal ;)

Gruß
Johannes

von Peter K. (Gast)


Lesenswert?

Naja dann fällt mir dazu auch nichts ein als das im Capture Compare zu 
lösen, ich kenne ein paar µC die haben einen CaptureCompareReload, nur 
ich weis jetzt nicht ob der STM32 das auch kann.

Aber wozu brauchst du für den Sinus zwei Timer?
Du kannst es ja auf einem Timer machen bei der hälfte CaptureCompare 
Event und einfach nur den Ausgang umschalten, anstatt einen ganzen 
Timer, beim Overflow schaltest du wieder zurück

von Johannes W. (johwi)


Lesenswert?

Hey,


ich benötige zwei Timer, da ich eine 3-level Ansteuerung machen möchte 
und da brauch ich danke den 12 IGBTs auch 12 PWMs.

Für interresierte, ich habs mittlerweile gelöst.

Ob es mit Timer Offset geht weis ich nicht(funktioniert bestimmt, 
allerdings dann nur über Interrupt oder DMA denk ich mal).
Ich habe anstatt den Timer "hochzusetzen" einfach den Sinus 
"runtergezogen" sobald er einen Wert über x hat.

Jetz hab ich so lange überlegt für eine so banale Lösung :/

Viele Grüße
Johannes

: Bearbeitet durch User
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.