Forum: Mikrocontroller und Digitale Elektronik Mehrere PWM Signale erzeugen


von Sebastian M. (noobuntu)


Lesenswert?

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

von Watcher (Gast)


Lesenswert?

Hallo,

das IC TLC 5940 gibt es z.B. bei "Mouser.com" zu kaufen.

Gruß

von Michael K. (michael007)


Lesenswert?

oder ein STM32. damit kannst du 16 PWM Signale mit 4 Timern realisieren.

von A.K. (Gast)


Lesenswert?

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)

von Vlad T. (vlad_tepesch)


Lesenswert?

Watcher schrieb:
> das IC TLC 5940

gibts sowas auch mit 8bit-PWM? die 12bit sind ein wenig unhandlich, wenn 
man eigentlich nur 8bit braucht.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Vlad T. (vlad_tepesch)


Lesenswert?

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
}

von Karl H. (kbuchegg)


Lesenswert?

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.

von noobuntu (Gast)


Lesenswert?

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?

von Falk B. (falk)


Lesenswert?

@  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?

von noobuntu (Gast)


Lesenswert?

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?

von Vlad T. (vlad_tepesch)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@  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

von noobuntu (Gast)


Lesenswert?

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

von Simon K. (simon) Benutzerseite


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@  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
Noch kein Account? Hier anmelden.