- 3D-Druck Einstieg und Tipps         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 16 von 16

Thema: 12x PWM + TWI-Slave ... möglich?

  1. #11
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.08.2004
    Ort
    Potsdam
    Beiträge
    190
    Anzeige

    Praxistest und DIY Projekte
    Zitat Zitat von wkrug
    ...Bei 16MHz und einem Taktteiler von 8 komm ich auf eine PWM Frequenz von 30 Hz (...) Bei 16MHz und einem Taktteiler von 1 komm ich auf eine PWM Frequenz von 244 Hz...
    ???????

    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.

  2. #12
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.214
    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.
    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.

  3. #13
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    Zitat Zitat von wkrug
    Kannst Du mal das Verarbeitungsschema posten ?
    Jesses, na da hab ich mich ja auch etwas eingelassen .

    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

    Code:
     83, 0b00000001
     43, 0b00000010
    154, 0b00000100
      3, 0b00001000
    Anschließend werden diese Daten nach dem Helligkeitwert sortiert.

    Das Ergebniss sieht im Speicher wie folgt aus.

    Code:
      3, 0b00001000
     43, 0b00000010
     83, 0b00000001
    154, 0b00000100
    Nun wird, fals nicht vorhanden eine Helligkeit 0 hinzugefügt und die bei dieser Helligkeit aktiven LED's berechnet.

    das sieht dann so aus:

    Code:
      0, 0b00001111
      3, 0b00001000
     43, 0b00000010
     83, 0b00000001
    154, 0b00000100
    Diese Daten werden anschließend gepackt, also die Kanäle mit gleicher Helligkeit zusammengefasst.

    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
    Grundregeln des Forenpostings:
    1. Nutze niemals die Suchfunktion!
    2. Überprüfe niemals die Topics nach Ähnlichkeiten!
    3. Schreibe alles in hellgelb!

  4. #14
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.08.2004
    Ort
    Potsdam
    Beiträge
    190
    Zitat Zitat von wkrug
    ...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....
    hmmm... Warum soll da nochmal durch 256mal geteilt werden?
    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?

  5. #15
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.214
    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.
    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.

  6. #16
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    Zitat Zitat von wkrug
    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 ...
    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
    Grundregeln des Forenpostings:
    1. Nutze niemals die Suchfunktion!
    2. Überprüfe niemals die Topics nach Ähnlichkeiten!
    3. Schreibe alles in hellgelb!

Seite 2 von 2 ErsteErste 12

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests