Forum: Mikrocontroller und Digitale Elektronik PWM Rechnung


von Katerina V. (katerina24)


Lesenswert?

Hallo Leute :)

Ich habe viele Fragen zum Thema Timerberechnung und PVM.

Wie würde so eine Timerberechnung für PVM in der Praxis aussehen (STM32) 
?
Was ist dabei zu beachten?

Mein jetziger Wissensstand:
_______________________________________________________________

1)
Man besitzt einen Zähler (PIN) der im umprogrammierten Zustand mit der 
Taktfrequenz des Mikrocontrollers arbeitet. Es stellt sich dabei ein 
Problem, da der Mikrocontroller mit einer sehr hohen Taktfrequenz 
betrieben wird. (Z.B. 24 MHz) mit dieser Frequenz wird das Zählermaximum 
viel zu schnell erreicht.

2)
Um dies zum Umgehen muss ein sogenannter „Vorteiler (Prescaler)“ 
eingebaut werden.
Oft hat man Faktoren von 1, 8, 64 ,256 oder 1024.
Beispiel: Bei einem Zähler mit einem Prescaler von 256, führt nur jeder 
256te Eingangsimpuls zur Erhöhung des Zählers um einen Zähler.


3)
Es gibt zwei verschiedene Arten von Zählern: Einmal den 8-bit Timer und 
den 16-bit Timer.
8-bit Timer:
2^8=256 Zähl-schritte (0…256)
16-bit Timer:
2^16=65536 Zähl-schritte (0…65536)

Außerdem Modus:
- Normalmodus
- CTC
- PWM


4)
Der Zähler zählt solange bis er den Maximalwert erreicht.
Bsp. 16bit Zähler: 2^16-1= 65535 (minus eins, da mit Null angefangen 
wird zu Zählen), wenn er den Maximal Wert erreicht springt er auf Null 
und fängt von vorne.


5)
 Overflow des Zählers ist abhängig von:
- Taktfrequenz des Controllers
- dem eingestellten Prescaler-Wert
- Timerauflösung

6)
Da gibt es noch diesen Vorladewert ???? Wozu er da ist :/
Ich stelle mir den als "Start Wert". Ab dann wird begonnen zu zählen.

7)
Wieso und wie man den Prescaler berechnet. Das ist mir noch nicht 
bekannt.

von Achim M. (minifloat)


Lesenswert?

Katerina V. schrieb:
> 6)
> Da gibt es noch diesen Vorladewert ???? Wozu er da ist :/
> Ich stelle mir den als "Start Wert". Ab dann wird begonnen zu zählen.

Richtig :)
Das hat man früher mal so gemacht, als Timermodule (als integrierte 
µC-Peripherie) noch keinen "clear on compare match" / "Zähle-bis"-Modus 
besaßen. Dazu musste im Overflow-Interrupt der Timer-Zählwert, den es 
als Register gibt, mit einem Wert vorgeladen werden. Der Timer zählt 
dann ab diesem Wert bis zum Überlauf(nächster overflow-interrupt). Damit 
waren dann fast beliebige Frequenzen möglich. Nachteil ist, dass das 
Timing von Software abhängt und man den Timer nicht beliebig schnell 
laufen lassen kann(interrupt latency, code-Ausführungszeit für Vorladen, 
...)

Heutzutage kann man einen "Zähle-bis"-Modus verwenden. Da gibt es dann 
ein Register, wo du den maximalen Timer-Zählwert ("Auflösung") 
einstellst. Der Timer Zählt von 0 bis zu dem eingestellten Wert und wird 
von der Hardware des Timermoduls zurückgesetzt.

Katerina V. schrieb:
> 7)
> Wieso und wie man den Prescaler berechnet. Das ist mir noch nicht
> bekannt.

F_CPU / (F_PWM * N_Prescaler) <= N_Timerticks

Fallbeispiel:
Wenn du z.B. eine PWM-Frequenz von 8kHz brauchst, dein Prozessor aber 
mit 72MHz rennt und du dich für einen 8bit-Timer entschieden hast.

F_CPU = 72E6
F_PWM =  8E3
N_Prescaler = ??
N_Timerticks = 255 ("Auflösung")

So, und jetzt bist du dran.

mfg mf

: Bearbeitet durch User
von Achim M. (minifloat)


Lesenswert?

Katerina V. schrieb:
> 3)
> [...]
> Außerdem Modus:
> - Normalmodus
> - CTC
> - PWM

Normalmodus - 0...Auflösung_Max

CTC         - *C*lear *T*imer on *C*ompare match ("Zähle-Bis-X"-Modus)
Manche bezeichnen das CTC-Nmax-Register als Vorladewert, was mmN. 
Quatsch ist, aber ist (siehe vorheriger Post) aus den Köpfen wohl nicht 
heraus zu bekommen.

PWM
- PWM-Generator "Sägezahn" - Timer zählt wie Normalmodus oder CTC
- PWM-Generator "Center-Aligned" - Timer zählt hoch bis Auflösung oder 
CTC-Registerwert und dann wieder runter (!!) auf 0

Center-Aligned ist zur Dreiphasen-PWM-Erzeugung für 
3-Phasen-Drehstrommotoren nützlich.

mfg mf

von Holger (Gast)


Lesenswert?

Was genau stand davon NICHT im reference manual???

kopfschüttel

von Veit D. (devil-elec)


Lesenswert?

Hallo,

mit Vorladewert bzw. Vorladeregister meinst du sicherlich den 
Compare-Match Wert.

Der Normal- und CTC Mode zählt immer bis Max.TOP.
Mit dem Vorlade/Compare-Match Register verkürzt man den Zählumfang des 
Timers bis er seinen Overflow erreicht.

Im PWM Modus stellt man mit einem, dem TOP, die Taktfrequenz ein und mit 
einem zweiten Compare-Match den Duty Cycle dessen ein.

Der Prescaler bestimmt wie langsam oder schnell der Timer generell 
zählen soll. Mit 1 wird mit jedem Takt am Timereingang sein Counter 1:1 
mitgezählt.

Mit Prescaler 8 zählt sein Timercounter nur bei jeden 8 Pegelwechsel am 
Eingang eins hoch. Der Prescaler ist im Grunde ein Taktvorteiler für den 
Timer.

Formeln stehen sicherlich im Datenblatt.

von Stromverdichter (Gast)


Lesenswert?

Holger schrieb:
> Was genau stand davon NICHT im reference manual???
>
> kopfschüttel

Hallo Holger,
nicht jeder ist so eine Leuchte wie du und versteht alles im Manual. Da 
zähle ich mich auch dazu. Für mich waren ein paar Sachen hier auch 
erhellend, daher danke ich dem TO für die Frage und den anderen für 
deren Antworten.
>lbonk Holger

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Jetzt kommts.
Die Zähler/Timer im STM32 unterscheiden sich in einigen Punkten von 
'klassischen', die sonst in MCs eingebaut sind.
1. Sie werden nicht direkt von der Taktfrequenz angetrieben, sondern von 
einer der 'Peripheral Clocks'(AHB,APB), die schon vorgeteilt sind - 
meistens mit 1/2 oder 1/4 der Taktfrequenz des STM32.
2. Sie haben eine einstellbare Periode, bis zu der sie zählen als 
Maximalwert. Im Gegensatz zu einem klassischen 16-bit Timer kann man sie 
also z.B. bis 10000 oder 13768 laufen lassen.

Hier gibts einige interessante Dinge zur STM32 Familie mit Tipps und 
Tricks:
http://measure.fel.cvut.cz/system/files/files/cs/vyuka/predmety/A4M38AVS/2014/materialy/Hitex_STM32_Insider_Guide.pdf

von Veit D. (devil-elec)


Lesenswert?

Hallo,

Ergänzung, nicht das wir uns falsch verstehen. In der Regel gibt es 
verschiedene Timer-Modi. Ich habe bis jetzt nur AVRs in den Fingern 
gehabt. Also es gibt nicht nur den Fixed-TOP sondern auch den Max-TOP. 
Fixed TOP sind die festen Werte, 8Bit 255 und 16Bit 65535, und im Modi 
mit Max-TOP kann ich den Zählumfang nach oben selbst 
einstellen/begrenzen. Damit stellt man zum Bsp. im CTC/PWM Modi die 
Taktfrequenz ein unter Berücksichtigung vom Prescaler natürlich.

Die grundlegende Funktion und Einstellung der Timer dürfte Architektur 
übergreifend immer gleich sein, nehme ich an.

Nochmal wegen dem Compare-Matchwert bzw. Vorladeregister.
Wenn man den Compare Match einstellt zum Bsp. im CTC Mode, dann stellt 
man damit den Max-TOP ein. Dann zählt er nur von 0 bis Max-TOP.

Im CTC Mode oder Normal-Mode mit Fixed-TOP, gibt es nur die Möglichkeit 
den Wert des Timercounters selbst vorab zu ändern. Nur den muss man dann 
ständig nach Overflow wieder neu setzen, sonst fängt er nach der ersten 
Runde bei 0 an. Wird eigentlich nicht gemacht. TOP einstellen ist 
besser.

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.