Forum: Mikrocontroller und Digitale Elektronik 16 bit Timer im Mode 15: Prescaler Kompromiss für PWM und Input Capture


von Friedrich (Gast)


Lesenswert?

Hallo Forum,

ich habe gerade einen Knoten im Gehirn...

Wie schon geschrieben, möchte ich einen 16 bit Timer auf einem 
AT90CANxxx @ 16MHz im Mode 15 (OCRnA als TOP) sowohl für PWM (OCnB und 
OCnC) als auch für den Input Capture an ICPn nutzen.

Dabei soll meine PWM Frequenz einstellbar sein (ca. 100 bis 400 Hz).
Das bedeutet unter Umständen verschiedene Prescaler und auf jeden Fall 
unterschiedliche TOP Werte. Das wirkt sich dann ja auch auf den Input 
Capture aus.

Mein gewünschter Duty Cycle kommt aus dem Programm als normierter Wert 
zwischen 0 und 1000 (=100,0%) und wird dann so umgerechnet:
1
OCR3B=(u16) (((s32)PWMTopVal_T3*(s32)pwmDuty)/1000);

Das heißt mir reicht prinzipiell ein TOP von 1000 aus.

Aber was ist jetzt für den Input Capture zu bevorzugen?
Ich möchte von 1 Hz bis ca. 7kHz messen können. Die Frequenzauflösung 
hängt dann doch nur vom Prescaler ab, oder?
Also brauche ich einen niedriger Prescaler um möglichst kleine 
Zeitschritte zu erhalten, richtig?
Das heißt dann aber auch viele Interrupts...
Wie sieht es mit dem TOP Wert aus?
Wenn der zu klein ist, dann bekomme ich viele Overflows, die ich dann 
bei niedrigen Frequenzen am Input Capture alle zählen muss und bekomme 
evtl. dann wegen der großen Zahlen auch Überläufe in nachfolgenden 
Berechnungen.

Also irgendwie muss ich da einen Kompromiss eingehen.
Mir ist aber gerade nicht klar, was mein Ziel sein sollte.
Kleiner Prescaler und großes TOP?

von Rudolph (Gast)


Lesenswert?

Hmm, naja, 400Hz und 1000 Schritte sind 400kHz, 100Hz dann 100kHz.
16MHz / 400kHz = 40
16MHz / 100kHz = 160

Haut also schonmal nicht mit dem Prescaler hin.
Die Prescaler in den AVR Timern sind ja ohnehin sehr grob.

16MHz / 8 = 2 MHz, 2MHz / 400Hz = 5000, 2MHz / 100Hz = 20000
Also ein Prescaler, unterschiedliche TOP Werte.
Und anders herum ergibt sich 2Mhz / 1000 = 2kHz Max, 2MHz/65500 = 30Hz 
Min

PWM ist so kein Problem und die Auflösung ja schon recht fein mit 
mindestens 0,1%.

Damit noch Input-Capture von 1Hz bis ca 7kHz gleichzeitig?

Nach unten geht das auch mit Variablem TOP Wert, der Timer läuft 
ziemlich häufig über, was man berücksichtigen muss.
Bei 1Hz und TOP=5000 läuft der Zähler 500 Mal über...
Richtig wild wird es wenn man berücksichtigen muss, dass sich TOP 
während der Erfassung ändern kann.

Bei 2MHz Timer-Takt sind 7kHz nur noch 286 Ticks, eine Periode sind nur 
142µs, das sind nur 2290 Befehls-Zyklen.
Wenn dann noch PWM erfasst werden soll, also mit Flanken-Wechsel im ICP 
Interrupt und bisschen was berechnen wird das richtig eng.
Vor allem wenn der Controller auch noch was anderes machen soll, so CAN 
Botschaften empfangen, ADC einlesen etc.

Und die 90CANxx haben ja zwei 16-Bit Timer, den anderen willst Du wohl 
auch noch benutzen?

Ich mag die AVR ja auch, aber die haben eben Ihre Grenzen, mehr Takt um 
die zeitliche Auflösung zu verbessern wäre toll, genauso wie etwas 
verbesserte Peripherie mit ein wenig mehr Möglichkeiten.
Das wäre vielleicht eine Gelegenheit, sich die AVR32UC3C genauer 
anzusehen? :-)

von Karl H. (kbuchegg)


Lesenswert?

Tja.
So wie ich das sehe musst du sich entscheiden zwischen einer feinen 
Auflösung der PWM bzw. der Messgenauigkeit beim Input Capture.

Wobei die Frequenz der PWM in den meisten Fällen von untergeordneter 
Bedeutung ist. Der entscheidende Punkt in einer PWM ist ja normalerweise 
nicht die genaue PWM-Frequenz sondern in wieviele Abstufungen man den 
Duty Cycle der PWM auflösen können will. Wobei bei einer Hardware PWM 
wieder die untere Grenze dieser Abstufungen die wichtigere Zahl ist. 
Kann die PWM 500 Abstufungen, werden aber nur 200 benötigt, dann ist es 
ja kein Problem bestimmte Duty-Cycle Einstellungen auch auszulassen und 
die 200 benötigten Werte auf die 500 abzubilden.

d.h. ich würde mich jetzt erst mal am Input Capture orientieren und den 
mal durchrechnen. Daraus ergeben sich dann Timer-Einstellungen. Mit 
denen rechne ich dann in der umgekehrten Richtung durch, was das für die 
PWM bedeuten wird. Wenn sich daraus eine akzeptable PWM-Frequenz ergibt, 
dann ist das in Ordnung.

Aber eine Frage kann ich mir nicht verkneifen. Bei deinem µC hast du 
eine Vielzahl an Timern. Kannst du die beiden Funktionalitäten nicht auf 
andere Timer aufteilen? Gerade eine PWM lässt sich ja in andere 
Timer-Funktionen eigentlich recht gut integrieren (wobei: leg da nicht 
zuviel Augenmerk auf die Einstellbarkeit der PWM-Frequenz. Wenn die hoch 
genug ist, dann reicht das). Wohingegen Input Capture eher unangenehm 
ist, vor allen Dingen dann, wenn der Timer nicht den vollen 16 Bit 
Zählbereich durchlaufen kann.

von Friedrich (Gast)


Lesenswert?

Also die Anwendung sieht so aus, dass über ein Tool eine PWM Frequenz 
eingestellt werden können soll. Zur Programmlaufzeit ist die dann 
konstant. Da soll nicht ständig die Frequenz geändert werden.
Typisch sind eigentlich so 300Hz für eine Ventilansteuerung.

Bisher wurde ein 16 bit Timer für 3 PWM genutzt und der andere 16 bit 
Timer für Input Capture.
Es fehlte aber immer sowohl eine 4. PWM als auch ein zweiter 
vernünftiger Input Capture.

Die Idee war jetzt mit den beiden 16 bit Timern 4 PWM und 2 Input 
Capture zu machen. Was ja theoretisch auch möglich ist, aber eben nicht 
ganz unabhängig voneinander...

Ich habe mir ausgerechnet, ab welcher PWM Frequenz ich zum 
nächstkleineren Prescaler wechseln kann, so dass der TOP Wert in 16 bit 
passt.
Mit 16MHz Quarz:
1
4 bis 31 Hz PWM Frequenz -> Prescaler 64
2
32 bis 244 Hz PWM Frequenz -> Prescaler 8
3
245 Hz bis mehrere kHz PWM Frequenz -> Prescaler 1
Am Anfang des Intervalls ist der TOP Wert nahe an 65535 und am Ende des 
Intervalls um die 8000 (letztes Intervall bei 2 kHz).

Also ist eigentlich nur der Prescaler 8 und 1 interessant.

Mein bisheriger Weg sah so aus, dass ich mir also anhand der gewünschten 
PWM Frequenz einen Prescaler suche und damit dann den TOP Wert berechne.

Als Abschätzung zur maximalen Anzahl der Overflows für 1Hz Input Capture 
habe ich dann folgendes gerechnet:
1
Je kleiner der Prescaler und je kleiner der TOP Wert, desto mehr Overflows gibt es bei 1Hz
2
@16MHz
3
PWMFreq    4 to   31 Hz -> Prescaler 64 -> minimum TOP =  8063 -> ~ 8000 -> Overflow alle (1/(16MHz/64))*8000  =  32ms -> bei 1Hz ergibt das Overflows: 31,25
4
PWMFreq   32 to  244 Hz -> Prescaler  8 -> minimum TOP =  8195 -> ~ 8000 -> Overflow alle (1/(16MHz/ 8))*8000  =   4ms -> bei 1Hz ergibt das Overflows: 250
5
PWMFreq  245 to 1000 Hz -> Prescaler  1 -> minimum TOP = 15999 -> ~15900 -> Overflow alle (1/(16MHz/ 1))*15900 = 993us -> bei 1Hz ergibt das Overflows: 1006,29
6
PWMFreq 1001 to 2000 Hz -> Prescaler  1 -> minimum TOP =  7999 -> ~ 7900 -> Overflow alle (1/(16MHz/ 1))*7900  = 493us -> bei 1Hz ergibt das Overflows: 2028,4

Am Input Capture hängt meist ein Speedpickup der x Pulse pro Umdrehung 
(von irgendwas) liefert.
D.h. die Pulse/Umdrehung dürfen nicht zu wenige und nicht zu viele sein, 
so dass eine langsame Drehung noch gut erkannt werden kann, aber bei 
hoher Drehzahl die Frequenz nicht zu groß wird...

Also im Moment zäume ich das Pferd von der PWM Seite her auf.
Da habe ich aber immer noch den Freiheitsgrad bei z.B. 300 Hz PWM 
Frequenz auf den Prescaler 8 zu gehen (TOP = 6687) oder mit Prescaler 1 
(TOP = 53332) zu arbeiten.
Was ist da geschickter?

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.