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:
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?
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? :-)
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.
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
4bis31HzPWMFrequenz->Prescaler64
2
32bis244HzPWMFrequenz->Prescaler8
3
245HzbismehrerekHzPWMFrequenz->Prescaler1
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:
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?