???????Zitat:
Zitat von wkrug
Sei bitte so nett und erklär mal Deinen Rechenweg.
Ich komm bei nem Prescaler von 8 und einer Quantisierung von 8 Bit bei 16Mhz Taktfrequenz auf 325,5Hz wenn man 12 Kanäle haben möchte.
Druckbare Version
???????Zitat:
Zitat von wkrug
Sei bitte so nett und erklär mal Deinen Rechenweg.
Ich komm bei nem Prescaler von 8 und einer Quantisierung von 8 Bit bei 16Mhz Taktfrequenz auf 325,5Hz wenn man 12 Kanäle haben möchte.
Erklär ich dir gerne.Zitat:
Ich komm bei nem Prescaler von 8 und einer Quantisierung von 8 Bit bei 16Mhz Taktfrequenz auf 325,5Hz wenn man 12 Kanäle haben möchte.
16MHz / 8 (Prescaler) / 256 (TCNT Zyklen bis Timer Überlauf) = 7812,5 Hz
Die PWM soll 8 Bit Auflösung haben, also sind nochmal 256 Überläufe für einen Zyklus nötig. 7812,5 / 256 = 30,52 also ~30Hz.
Klar kann man das entsprechende TCNT Register auch mit einem Preload Wert versehen und damit die PWM Frequenz erhöhen, allerdings wird dadurch die Anzahl der ausführbaren Kommandos zwischen 2 Timer Overflow Interrupts verkürzt.
Wenn noch Luft in den Ausführungszeiten ist kann und sollte man das natürlich machen.
Jesses, na da hab ich mich ja auch etwas eingelassen :).Zitat:
Zitat von wkrug
Naja, ich werde trotzdem einmal versuchen es anhand eines Beispiels mit 4 Kanälen zu erklären. Nehmen wir weiter an, diese Kanäle sind alle an einem Port an den Pins 0-3.
Datenaufbereitung
Die jeweiligen Helligkeitwerte der einzelnen Kanäle kommen seriell Kanal für Kanal über die serielle Schnittstelle in den Mikrocontroller.
Also Kanal 1, Kanal 2, Kanal 3, Kanal 4.
Diese Daten werden im RAM zwischengespeichert.
Wurde der letzte Kanal empfangen wird erst einmal überprüft ob es sich tatsächlich um neue Werte handelt oder ob diese mit den alten indentisch sind.
Sind es neue Daten wird ein Backup dieser gefahren (zu Vergleichszwecken). Sind es keine neue Daten wird solange gewartet bis wieder ein paar Daten im Speicher stehen.
Anschließend wird der Jeweiligen Helligkeit ein Kanal in Form eines Bitmusters zugeordnet.
Das sieht dann im Speicher wie folgt aus:
Kanal 1 = 83,
Kanal 2 = 43,
Kanal 3 = 154,
Kanal 4 = 3
Anschließend werden diese Daten nach dem Helligkeitwert sortiert.Code:83, 0b00000001
43, 0b00000010
154, 0b00000100
3, 0b00001000
Das Ergebniss sieht im Speicher wie folgt aus.
Nun wird, fals nicht vorhanden eine Helligkeit 0 hinzugefügt und die bei dieser Helligkeit aktiven LED's berechnet.Code:3, 0b00001000
43, 0b00000010
83, 0b00000001
154, 0b00000100
das sieht dann so aus:
Diese Daten werden anschließend gepackt, also die Kanäle mit gleicher Helligkeit zusammengefasst.Code:0, 0b00001111
3, 0b00001000
43, 0b00000010
83, 0b00000001
154, 0b00000100
Zum Schluss werden diese Daten in einen Ausgabepuffer geschrieben und stehen damit der PWM Erzeugung zur Verfügung.
PWM Erzeugung
In einer Timer Interrupt Routine, welche alle 125 Takte aufgerufen wird passiert das folgende:
1. wird ein vorhandener Zählerwert mit der nächsten Helligkeit verglichen. Stimmen diese überein wird die jeweilige Kanalmatrix aus dem Speicher geholt und ausgegeben, sowie die nächste Helligkeit als Vergleichswert geladen.
2. der Zähler wird um eins erhöht.
3. ist der Zählerwert = 255 so wird der Zähler Resetet und der Vergleichswert auf 0 gesetzt.
----------------------------------------------------------------------------
So .. ich hoffe das war jetzt so halbwegs verständlich erklärt.
Grüße,
Hanni
hmmm... Warum soll da nochmal durch 256mal geteilt werden?Zitat:
Zitat von wkrug
Geht es dabei darum mögliche Fehler, die durch gleiche Werte bei der PWM entstehen weitestgehend zu minimieren weil der µC ja nicht Multitaskingfähig ist?
Nein es geht dabei nicht um Fehler.Zitat:
Geht es dabei darum mögliche Fehler, die durch gleiche Werte bei der PWM entstehen weitestgehend zu minimieren weil der µC ja nicht Multitaskingfähig ist?
Ein Timer erzeugt einen Timer Overflow Interrupt wenn der Zählerstand von 255 auf 0 wechselt - der Timer also überläuft.
Da ich wegen der 12 Kanäle das nicht mit einem Comparematch Register realisieren würde, muss ein "externer Zäher", also ein Register oder RAM Speicherplatz in der Interruproutine hochgezählt und mit den gewünschten Comparematch Werten verglichen werden.
Da eine Auflösung von 8 Bit also 256 Stufen gewünscht ist braucht auch dieser externe Zähler nochmal 256 Overflow Interruptroutinen für seine Funktion.
Eine Beschleunigung dieses Prozesses wäre durch Laden des TCNT Registers mit einem Preload Wert (z.B. 127) während des Interrupts möglich, oder durch eine Verringerung der Auflösung.
Der Preload Wert darf aber nicht zu hoch werden, sonst kann der Interrupt bis zum Auftreten des nächsten Interrupts nicht vollständig abgearbeitet werden und der Controller wird dadurch Interrupts verschlucken.
Ausserdem muss zur Abarbeitung der SPI Kommandos auch noch etwas Prozessorleistung zur Verfügung stehen.
@hanni
Ich glaub ich versteh schon wie Du das gemacht hast.
Ich hatte auch so eine ähnliche Idee.
Das Problem dabei ist nur, das wenn viele Werte nah beieinander liegen, aber nicht gleich sind, die Abarbeitungszeit während des Interrupts zu kurz werden könnte, und auch da Interrupts verloren werden könnten.
Aus diesem Grund hab ich diese Idee wieder verworfen.
Also im schlechtesten aller Fälle dauert meine ISR ca. 50 Takte (von 125 verfügbaren). Daher kann ich das Problem nicht wirklich nachvollziehen ...Zitat:
Zitat von wkrug
Ursprünglich war das ganze übrigens für eine 10 Bit PWM mit maximal 250 Hz ausgelegt ... daher weiss ich, das bei 8Bit mit 500 Hz genügend Reserven vorhanden sind.
Grüße,
Hanni