Hallo liebe Forumsuser, ich möchte zwischen 4 und 12 8Bit PWM Signale erzeugen. Die PWM Frequenz sollte größer als 20 kHz sein. Am besten mit einem dezidierten IC an denen ich nur noch das Puls Pause Verhältnis der einzelnen PWMs übertrage. Auf der Suche bin ich dann über den TLC 5940 gestolpert. Leider gibts diesen IC nicht bei reichelt oder beim großen C. Gibts es dazu Alternativen? mfg noobuntu
Hallo, das IC TLC 5940 gibt es z.B. bei "Mouser.com" zu kaufen. Gruß
es gibt mehrer mikrocontroller von z.B. Microchip oder Atmel welche Hardware PWM generatoren besitzen. Da musste nur noch das Pulsverhältnis ins passende Register schieben und schon haste deine PWM-Signale. Man kann da auch die Frequenz etc einstellen (zumindest bei den PICs, z.B. PIC18F4331)
Watcher schrieb: > das IC TLC 5940 gibts sowas auch mit 8bit-PWM? die 12bit sind ein wenig unhandlich, wenn man eigentlich nur 8bit braucht.
Vlad Tepesch schrieb: > Watcher schrieb: >> das IC TLC 5940 > > gibts sowas auch mit 8bit-PWM? die 12bit sind ein wenig unhandlich, wenn > man eigentlich nur 8bit braucht. Du kannst ha auf dem µC alles in 8 Bit abwickeln. Bei der Übertragung knallst du ein ganzes Byte so wie du es hast raus und dann einfach noch 4 0-Bits hinten nach.
Karl heinz Buchegger schrieb: > Du kannst ha auf dem µC alles in 8 Bit abwickeln. Bei der Übertragung > knallst du ein ganzes Byte so wie du es hast raus und dann einfach noch > 4 0-Bits hinten nach. Ich will die ja aber per SPI anbinden und da muss man die unteren 4bit des einen und die oberen 4bit des nächsten verwursten. edit: da kommt dann so eine Konvertierung bei raus:
1 | void tlc5940_compress16(Tlc5940Data* o_data12, uint16_t i_data16[TLC5940_CHANNELS]) |
2 | {
|
3 | uint8_t outInd = 0; |
4 | uint8_t inInd = TLC5940_CHANNELS-1; |
5 | |
6 | for(; inInd<TLC5940_CHANNELS; inInd -= 2) |
7 | {
|
8 | o_data12->data[outInd++] = ((uint8_t)(i_data16[inInd]>>4)); // put high 8 bits in one byte |
9 | o_data12->data[outInd++] = (((uint8_t)i_data16[inInd])<<4) // the lower 4 bits in upper nibble |
10 | | ((uint8_t)(i_data16[inInd-1]>>8)); // and the higher 4 bits of next val in the lower nibble of the 2nd byte |
11 | o_data12->data[outInd++] = (uint8_t)(i_data16[inInd-1]); // the low 8bits of next val in the 3rd databyte |
12 | }
|
13 | }
|
Vlad Tepesch schrieb: > Karl heinz Buchegger schrieb: >> Du kannst ha auf dem µC alles in 8 Bit abwickeln. Bei der Übertragung >> knallst du ein ganzes Byte so wie du es hast raus und dann einfach noch >> 4 0-Bits hinten nach. > > Ich will die ja aber per SPI anbinden OK. Das hab ich nicht bedacht. Hardware SPI ist natürlich dann eher ungemütlich, aber beherschbar. Ich würde mir eine Funktion bauen, die einen Nibbel 'ausgibt'. Die Funktion wartet immer 2 Nibbles ab, setzt sie zusammen und gibt das resultierende byte aus. in etwa so
1 | void spi_nibble( uint8_t nibble ) |
2 | {
|
3 | static uint8_t synthByte = 0; |
4 | static uint8_t evenOdd = 0; |
5 | |
6 | if( evenOdd == 0 ) |
7 | synthByte = nibble << 4; |
8 | else { |
9 | synthByte |= nibble; |
10 | SPDR = synthByte; |
11 | }
|
12 | |
13 | evenOdd = !evenOdd; |
14 | }
|
15 | |
16 | void tlc5940_out( uint8_t data[TLC5940_CHANNELS] ) |
17 | {
|
18 | for( i = 0; i < TLC5940_CHANNELS; ++i ) |
19 | spi_nibble( data >> 4 ); |
20 | spi_nibble( data & 0x0F ); |
21 | spi_nibble( 0x00 ); |
22 | }
|
23 | }
|
aufpassen muss man noch, dass das letzte Datennibble noch mit ausgegeben wird. Je nach TLC5940_CHANNELS müsste man dann noch ein Dummy 0x00 nachschieben.
Watcher schrieb: > das IC TLC 5940 gibt es z.B. bei "Mouser.com" zu kaufen. Habs gefunden. Der TLC ist dort sogar um die Hälfte billiger als Farnell. Danke. Michael K. schrieb: > oder ein STM32. damit kannst du 16 PWM Signale mit 4 Timern realisieren. Das klingt natürlich interessant. Vor allem weil ich mich ehe schon mal längst in die 32 Bit Geschichte einarbeiten wollte. A.K. schrieb: > es gibt mehrer mikrocontroller von z.B. Microchip oder Atmel welche > Hardware PWM generatoren besitzen. Ich weis ^^. Leider nicht genug. Zuerst wurde es mit einem Atmega32 versucht. Leider führte dort kein Weg an Software PWMs vorbei, was ich eigentlich vermeiden möchte. Vlad Tepesch schrieb: > gibts sowas auch mit 8bit-PWM? die 12bit sind ein wenig unhandlich, wenn > man eigentlich nur 8bit braucht. Ob 8 oder 12 Bit ist eigentlich egal. Hauptsache die PWM Frequenz liegt überhalb von 20kHz. Die 8 Bit Lösung via SPI ist dann eher unschön. Noch eine Frage zum TLC. Woher bekommt der eingentlich seinen Takt zur PWM Erzeugung. Benutzt er den SPI Takt oder erzeugt der IC intern einen Takt?
@ noobuntu (Gast) >Noch eine Frage zum TLC. Woher bekommt der eingentlich seinen Takt zur >PWM Erzeugung. Datenblatt? Der Takt kommt von aussen. MFG Falk P S Und wozu glaubst du 20 kHz PWM zu brauchen?
Falk Brunner schrieb: > Datenblatt? Der Takt kommt von aussen. Danke für die Info. Dann hab ich mich nicht verlesen. Die PWMs sollen mehrere Lüfter stufenlos reglen. Beim Probeaufbau trat das Problem auf, dass die Lüfter summten/brummten und zwar ungefähr mit der PWM Frequenz von damals ca. 4 kHz. Deshalb die 20 kHz+. Lieg ich da mit meiner Überlegung falsch?
noobuntu schrieb: > Noch eine Frage zum TLC. Woher bekommt der eingentlich seinen Takt zur > PWM Erzeugung. Benutzt er den SPI Takt oder erzeugt der IC intern einen > Takt? weder noch. Den Takt musst du anlegen. außerdem zählt der nur hoch und bleibt dann stehen. den blank musst du auch manuell ausführen. Das hat den Nachteil, dass du da mitzählen musst, aber den Vorteil, dass du das neuladen von neuen Daten gut synchronisieren kannst. Ich hab das ganze so gelöst: ein 8Bit-Timer generiert den Takt (F_CPU/2). (man könnte hier auch CKOut benutzen, falls unterstützt) Der 16bit-Timer ist auf externen Takt gestellt und zählt die Pulse (eventuell kann man auch den Output des 8bit-Timers auf den selben Pin legen, wie den Inputpin für den 16bit-Timer-> so spart man einen Pin) Der Timer ist in einen Modus gestellt, wo er bis ICR läuft, was auf 12288 (3*4096) eingestellt ist OCR1A auf 4096 und OCR1B auf 8192 (2*4096) In den ISRs für OCR1 A und B wird nur einmal am Blank gewackelt. Die Overflow-ISR latcht die neuen Daten, welche in ruhe in der Mainloop geladen werden und wackelt am Blank, außerdem wird das Flag für das Laden der nächsten Daten gesetzt.
@ noobuntu (Gast) >Die PWMs sollen mehrere Lüfter stufenlos reglen. DIE TOP-Anwendung der heutigen Zeit, dicht gefolgt von LEDs ;-) > Beim Probeaufbau trat >das Problem auf, dass die Lüfter summten/brummten und zwar ungefähr mit >der PWM Frequenz von damals ca. 4 kHz. Deshalb die 20 kHz+. Lieg ich da >mit meiner Überlegung falsch? Ja. Nimm einen Lüfter mit PWM-Eingang. Oder steuere sie mit einer linearen Endstufe an. Die meisten Lüfter ohne PWM Eingang vertragen keine PWM. Die Suche im Forum leifert dazu Dutzende Threads. Dann tuts auch eine Soft PWM mit 100 Hz. MFG Falk
Falk Brunner schrieb: > DIE TOP-Anwendung der heutigen Zeit, dicht gefolgt von LEDs ;-) Irgendwas muss man ja steuern oder regeln! Falk Brunner schrieb: > Ja. Nimm einen Lüfter mit PWM-Eingang. Oder steuere sie mit einer > linearen Endstufe an. Die meisten Lüfter ohne PWM Eingang vertragen > keine PWM. Die Suche im Forum leifert dazu Dutzende Threads. Dann tuts > auch eine Soft PWM mit 100 Hz. Wie würde das dann mit einer linearen Endstufe aussehen? Man glättet das PWM Signal über einen Kondensator und speist dies dann in eine Endstufe ein, die mir dann meinen Lüfter treibt? Das Tachosignal sieht ein bisschen komisch aus, wenn man den Lüfter via PWM regelt, aber das bekommt man gefiltert. Ansonsten sieht alles ganz normal aus? Was wäre den das Worst Case Szenario? Geht der Lüfter mit der Zeit kaputt? mfg noobuntu
noobuntu schrieb: > Falk Brunner schrieb: >> DIE TOP-Anwendung der heutigen Zeit, dicht gefolgt von LEDs ;-) > > Irgendwas muss man ja steuern oder regeln! > > Falk Brunner schrieb: >> Ja. Nimm einen Lüfter mit PWM-Eingang. Oder steuere sie mit einer >> linearen Endstufe an. Die meisten Lüfter ohne PWM Eingang vertragen >> keine PWM. Die Suche im Forum leifert dazu Dutzende Threads. Dann tuts >> auch eine Soft PWM mit 100 Hz. > > Wie würde das dann mit einer linearen Endstufe aussehen? Man glättet das > PWM Signal über einen Kondensator und speist dies dann in eine Endstufe > ein, die mir dann meinen Lüfter treibt? Du benötigst noch einen Widerstand (oder Spule) zwischen PWM Signal und Kondensator. Ansonsten wird Falk vermutlich genau das gemeint haben. Alternativ kann man das auch als Schaltwandler aufbauen. Also PWM Signal auf einen Endstufe geben, mit Spule auf einen Kondensator auskoppeln (Freilaufdiode nicht vergessen). Dann hat man hinten auch (fast) Gleichspannung aber nicht so hohe Verluste in der Endstufe. > Das Tachosignal sieht ein bisschen komisch aus, wenn man den Lüfter via > PWM regelt, aber das bekommt man gefiltert. Das liegt einfach daran, dass du vermutlich den Lüfter Lowside-PWM'st, der Tacho-Ausgang aber GND als Referenz benutzt (Open Drain, Open Collector). Wenn du dem dann das GND unterm Arsch wegziehst, ist es kein Wunder ;-) > Ansonsten sieht alles ganz > normal aus? Was wäre den das Worst Case Szenario? Geht der Lüfter mit > der Zeit kaputt? Schwer zu sagen. Keine Ahnung. Fakt ist AFAIK, dass Brushless Lüfter (ohne PWM Eingang) nicht für PWM geeignet sind.
@ noobuntu (Gast) >Wie würde das dann mit einer linearen Endstufe aussehen? Man glättet das >PWM Signal über einen Kondensator und speist dies dann in eine Endstufe >ein, die mir dann meinen Lüfter treibt? Ja. Siehe http://www.mikrocontroller.net/articles/Pulsweitenmodulation#DA-Wandlung_mit_PWM >Das Tachosignal sieht ein bisschen komisch aus, wenn man den Lüfter via >PWM regelt, Logisch, weil du der Elektronik dauernd den Saft abdrehst. > aber das bekommt man gefiltert. gemurkst. >normal aus? Was wäre den das Worst Case Szenario? Geht der Lüfter mit >der Zeit kaputt? Kann sein. MFG Falk
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.