Forum: Mikrocontroller und Digitale Elektronik Suche µC mit 4 bis 8 PWM-Kanälen, mind. 12Bit


von GeraldW (Gast)


Lesenswert?

Hallo,

ich suche einen Mikrocontroller, der 4 bis 8 PWM-Kanäle besitzt, die 
alle mindestens eine Auflösung von 12 Bit haben sollen.

Die PWM-Frequenz soll dabei mind. 200Hz betragen.

Gibt es einen AVR, der das leisten kann?

Wenn nein, welche Mikrocontroller-Typen kämen in Frage?

von Frank K. (fchk)


Lesenswert?

Der dsPIC33FJ256GP506A hat 8 Kanäle mit 16 Bit Auflösung.
http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en546062

Der dsPIC33EP512MC806 hat 16 Kanäle mit 16 Bit Auflösung und 8.32 ns PWM 
Resolution.
http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en557367

In den jeweiligen Produktfamilien gibts auch größere und kleinere 
Versionen. Siehe Datenblatt.

fchk

von Falk B. (falk)


Lesenswert?

@GeraldW (Gast)

>ich suche einen Mikrocontroller, der 4 bis 8 PWM-Kanäle besitzt, die
>alle mindestens eine Auflösung von 12 Bit haben sollen.

>Die PWM-Frequenz soll dabei mind. 200Hz betragen.

12 Bit PWM bei 200 Hz macht 819,2 kHz PWM Takt. Bei 20 MHz CPU Takt 
bleiben da nur ~ 24 Takt / PWM-Takt. Reicht nicht für Soft-PWM, muss 
wohl ein schnellerer Controller oder einer mit paasener PWM-Generierung 
in Hardware her. Oder man missbraucht einen TLC5940 als PWM Generator.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Meine Empfehlung:
Der STM32F103, der packt das locker. Hat jede menge Timer drin und je 
Timer bis zu 4 PWM Ausgänge. Somit sind bis zu 32 PWM möglich.
Siehe Artikel: STM32

Damit hatte ich auch schon ein Signal mit 10KHz und 12Bit Auflösung 
erzeugt.

von W.Sprengel (Gast)


Lesenswert?

Schau Dir mal die Piccolos von TI mit High Resolution PWM (HRPWM) an.

von Fabian O. (xfr)


Lesenswert?

Die XMEGA AVRs haben auch einige Timer. Der 16/32/64/128A4(U) besitzt 
beispielsweise fünf 16-Bit-Timer mit ingesamt 16 Output-Kanälen, die man 
für PWM benutzen kann.

von Fabian O. (xfr)


Lesenswert?

Ach ja, wenn 4 Kanäle reichen, vielleicht der ATmega1284p. Der hat zwei 
16-Bit-Timer mit je zwei Kanälen.

von Christoph S. (mixer) Benutzerseite


Lesenswert?

W.Sprengel schrieb:
> Schau Dir mal die Piccolos von TI mit High Resolution PWM (HRPWM) an.

Aber nicht mit so vielen Kanaelen (zumindest die die ich bis jetzt 
hatte)

wenn du schon die Cortexe von ST anschaust kannst du auch bei NXP, TI, 
usw. vorbeischauen. Da sollten viele fuer deine Anforderungen dabei 
sein.

Gruss

von W.Sprengel (Gast)


Lesenswert?

Christoph S. schrieb:
> W.Sprengel schrieb:
>> Schau Dir mal die Piccolos von TI mit High Resolution PWM (HRPWM) an.
>
> Aber nicht mit so vielen Kanaelen (zumindest die die ich bis jetzt
> hatte)

Datenblatt:
16 PWM Kanäle bis zu 8 mit HRPWM.

von Horst (Gast)


Lesenswert?

Vielleicht ist der PCA9685 per I2C mit 16 Kanälen  12 Bit  40-1000Hz 
für dich interessant. Der kostet unter 3€ und es gibt auch ein 
Breakoutboard für kleines Geld z.B. bei Exp Tech.
Dann bist du mit der Controllerwahl frei.

von Udo S. (urschmitt)


Lesenswert?

Wetten dass damit wieder Leds gedimmt werden sollen...

von Arc N. (arc)


Lesenswert?

Udo Schmitt schrieb:
> Wetten dass damit wieder Leds gedimmt werden sollen...

Dann z.B. die SiM3U von SiLabs... die hätten noch IOs mit einstellbarer 
Strombegrenzung (bis 300 mA, Sink bzw. 150 mA Source und separate 
Spannungsversorgung bis 6 V)

von Jo (Gast)


Lesenswert?

Was ist denn mit BCM statt PWM. Das spart Zeit. Mit nem Mega32 hab ich 
damit 30 LEDs ohne Probleme gedimmt und noch DMX-Empfang dabei gemacht.

von Sebastian S. (sebastian_s50)


Lesenswert?

@GeraldW

Für meine Meinung zu A/D-Wandlern in Mikrocontrollern müsste man mich 
eigentlich verhaften.

>16 Kanäle mit 16 Bit Auflösung und 8.32 ns PWM - klingt unheimlich toll.

Wie kommt das nur, dass ich so etwas nicht glaube?
Wahrscheinlich lautet das Schlüsselwort: "Auflösung".

Insbesondere in einer PWM-Umgebung dürften da ehrliche 12 Bit oder nur 
zehn besser sein. Allerdings: Glauben ist aber keine strafbare Handlung.

von GeraldW (Gast)


Lesenswert?

Hallo,

Danke für die vielen Antworten!!!

Jo schrieb:
> Was ist denn mit BCM statt PWM.

Was versteht man unter BCM?

von flo (Gast)


Lesenswert?

Jo schrieb:
> Was ist denn mit BCM statt PWM. Das spart Zeit. Mit nem Mega32 hab ich
> damit 30 LEDs ohne Probleme gedimmt und noch DMX-Empfang dabei gemacht.

kannst du das mal näher erklären, wie das gehen soll?

von Jo D. (Firma: Jo) (discovery)


Lesenswert?

stm32 --> soviele PWMs wie IO-Pins verfügbar sind.

von Falk B. (falk)


Lesenswert?

@  flo (Gast)

>> Was ist denn mit BCM statt PWM. Das spart Zeit. Mit nem Mega32 hab ich
>> damit 30 LEDs ohne Probleme gedimmt und noch DMX-Empfang dabei gemacht.

LEDs dimmen und nebenbei DMX empfangen ist niht soo wild, wenn man nicht 
gleich 12 Bit PWM macht, Soft-PWM mit 8-10 Bit ist OK. Been there, 
done that.

>kannst du das mal näher erklären, wie das gehen soll?

BCM ist wahrscheinlich Binary Code Modulation.

http://www.mikrocontroller.net/articles/Soft-PWM#Maximale_PWM-Aufl.C3.B6sung_bei_einer_LED-Matrix

von c-hater (Gast)


Lesenswert?

Falk Brunner schrieb:

> LEDs dimmen und nebenbei DMX empfangen ist niht soo wild, wenn man nicht
> gleich 12 Bit PWM macht

Was zum LED-dimmen wohl sowieso völliger Blödsinn ist.

> Soft-PWM mit 8-10 Bit ist OK.

12Bit geht auch. Bei vier Kanälen schafft man sogar recht problemlos die 
geforderten 200Hz cycles. Eine schöne Aufgabe für einen ATtiny84. Da ist 
der viele Flash dieser Teile endlich mal zu was nütze: Schleifen 
ausrollen.

Damit schafft man dann bei vier Kanälen rund 220Hz Zyklus und hat 
trotzdem effektiv noch knapp 10 Prozent der Rechenzeit frei z.B. für die 
Kommunikation mit der Außenwelt. Irgendwoher müssen ja die PWM-Werte 
kommen, die das Ding ausgeben soll...

Geht auch mit den kleineren Tinys der Baureihe, dann sinkt aber 
natürlich die Zahl der Takte, die nicht für die PWM selber gebraucht 
werden, weil man die innere Schleife nicht mehr so stark ausrollen kann.

Dürfte aber immer noch locker genug sein, um während eines PWM-Zyklus 
einen kompletten Satz neuer PWM-Werte für die vier Kanäle z.B. per SPI 
zu beziehen. Und mehr braucht's ja eigentlich auch nicht.

von flo (Gast)


Lesenswert?

c-hater schrieb:
> 12Bit geht auch. Bei vier Kanälen schafft man sogar recht problemlos die
> geforderten 200Hz cycles. Eine schöne Aufgabe für einen ATtiny84. Da ist
> der viele Flash dieser Teile endlich mal zu was nütze: Schleifen
> ausrollen.
>
> Damit schafft man dann bei vier Kanälen rund 220Hz Zyklus und hat
> trotzdem effektiv noch knapp 10 Prozent der Rechenzeit frei z.B. für die
> Kommunikation mit der Außenwelt. Irgendwoher müssen ja die PWM-Werte
> kommen, die das Ding ausgeben soll...

wie jetzt, was speicherst du da genau im flash?
würde mich brennend interessieren, wie das funktioniert!

von c-hater (Gast)


Lesenswert?

GeraldW schrieb:

> ich suche einen Mikrocontroller, der 4 bis 8 PWM-Kanäle besitzt, die
> alle mindestens eine Auflösung von 12 Bit haben sollen.
>
> Die PWM-Frequenz soll dabei mind. 200Hz betragen.
>
> Gibt es einen AVR, der das leisten kann?

Viele.

Alle, die mit 20MHz laufen können und dabei noch mindestens 5 Pins frei 
haben (4 für PWM-Ausgabe, min. 1 für Kommunikation zwecks Einfüllung von 
PWM-Werten). Der kleinste und billigste wäre damit wohl der Tiny24.

Damit schafft man allerdings nur vier 12Bit-Kanäle bei der geforderten 
Zykluszeit (mit Software-PWM).

Acht  solcher Kanäle wären erst mit einem Mega1284 oder 1284P möglich. 
Vier in Hardware, vier in Software.

Einfacher und deutlich billiger wäre aber wohl, dann einfach 2x Tiny24 
zu verwenden, um auf die gewünschten acht Kanäle zu kommen.

von flo (Gast)


Lesenswert?

> Eine schöne Aufgabe für einen ATtiny84. Da ist
>> der viele Flash dieser Teile endlich mal zu was nütze: Schleifen
>> ausrollen.

was meinst du denn jetzt mit schleife ausrollen?

software-pwm würde ich über timer-irq machen

von c-hater (Gast)


Lesenswert?

flo schrieb:

> wie jetzt, was speicherst du da genau im flash?

Code.

> würde mich brennend interessieren, wie das funktioniert!

Ganz einfach: Jede Schleife, die keine Endlosschleife sein soll, braucht 
die Prüfung auf eine Abbruchbedingung und den Rücksprung zum Anfang. Das 
kostet bei einem AVR typisch drei Takte.

Einfaches (natürlich weitgehend sinnfreies) Beispiel: Eine Schleife soll 
immer wieder ein Portbit togglen, um am entsprechenden Pin genau 128 mal 
eine H/L-Folge auszugeben. Also:

 ldi cnt,0
 in tmp,port

loop:
 eor tmp,togglemask ;1
 out tmp,port       ;1
 dec cnt            ;1
 brne loop          ;2

Die Schleife braucht also 5 Takte pro Durchlauf, 256*5-1=1279 Takte 
insgesamt und läßt keinerlei Rechenzeit für andere Sachen frei. Nun habe 
ich die Aufgabe, die diese Funktionalität zu erhalten, muß aber nebenbei 
noch was tun, während die Schleife läuft. Geht nicht? Doch geht. Der 
Trick ist: loop unrolling. Schleifen ausrollen. Also die erste Iteration 
der Sache:

 ldi cnt,128
 in tmp,port

loop:
 eor tmp,togglemask ;1
 out tmp,port       ;1
 nop                ;1
 nop                ;1
 nop                ;1
 eor tmp,togglemask ;1
 out tmp,port       ;1
 dec cnt            ;1
 brne loop          ;2

Die Schleife ist jetzt doppelt so lang, nämlich zehn Takte, wird aber 
nur noch halb so oft durchlaufen. An der Funktionalität und der 
Gesamtlaufzeit ändert sich nix.

Aber ich habe 128*3=384 Takte, um noch was anderes zu tun, denn statt 
der drei NOPs könnte auch nützlicher Code stehen.

Das kann man nun weiter treiben, solange der Flash (und die Schleife) 
reicht. Die nächste Stufe wäre also:

 ldi cnt,64
 in tmp,port

loop:
 eor tmp,togglemask ;1
 out tmp,port       ;1
 nop                ;1
 nop                ;1
 nop                ;1
 eor tmp,togglemask ;1
 out tmp,port       ;1
 nop                ;1
 nop                ;1
 nop                ;1
 eor tmp,togglemask ;1
 out tmp,port       ;1
 nop                ;1
 nop                ;1
 nop                ;1
 eor tmp,togglemask ;1
 out tmp,port       ;1
 dec cnt            ;1
 brne loop          ;2

Jetzt habe ich schon 64*9=576 Takte, um was sinnvolles nebenbei zu tun. 
Und es wird obendrein deutlich einfacher, tatsächlich etwas sinnvolles 
darin zu tun.

Wenn man das nun immer so weiter treibt, ergibt sich letztlich etwas, 
was 256 mal größer ist als der ursprüngliche Code, keine Schleife mehr 
ist, aber dieselbe Funktionalität und Laufzeit wie die ursprüngliche 
Schleife hat. Nebenbei bleiben dann aber 768 Takte, um in der Zeit was 
sinnvolles nebenbei zu tun.

Prinzip kapiert? Dann happy loop unrolling!

von flo (Gast)


Lesenswert?

dank für die ausführliche erklärung!!!

habs noch nicht ganz begriffen, muss erst mal drüber schlafen.

klingt auf jeden fall genial!!!

prinzip selber ausgedacht?

von c-hater (Gast)


Lesenswert?

flo schrieb:

> prinzip selber ausgedacht?

Natürlich nicht. Selbst als ich vor ca. 30 Jahren die ersten Schritte in 
Assembler gemacht habe (mit 'nem 6502), war die Idee schon ziemlich 
betagt.

Ich hätte schon pränatal programmieren müssen, um diesbezüglich der 
erste sein zu können. ;o)

von Fallobst (Gast)


Lesenswert?

Falk Brunner schrieb:
> 24 Takt / PWM-Takt. Reicht nicht für Soft-PWM

Vieles geht in Assembler, auch wenn es oft für unmöglich gehalten wird. 
Die Idee basiert auf der Soft-PWM Methode, allerdings Asm-optimiert mit 
Beachtung des Sonderfalls das die Routine im nächsten PWM-Zyklus 
nochmals angesprungen wird; ungetest:
1
TIM1COMPB:
2
  push r16
3
  push XL
4
  push XH
5
  lds XL, pointer
6
  lds XH, pointer+1
7
0:
8
  ld r16, X+
9
  out PORT, r16
10
  ld r16, X+
11
  sbrc r16, 7
12
  rjmp 2
13
1:
14
  out OCR1BH, r16
15
  ld r16, X+
16
  out OCR1BL, r16
17
  sts pointer, XL
18
  sts pointer+1, XH
19
  pop XH
20
  pop XL
21
  pop r16
22
  reti
23
2:  //14 Takte warten
24
  rcall 3 //7 Takte
25
  rcall 3 //7 Takte
26
  rjmp 0
27
3:
28
  ret
29
30
TIM1COMPA:
31
  push r16
32
  push XL
33
  push XH
34
  lds XL, next_pointer
35
  lds XH, next_pointer+1
36
  ldi r16, 0
37
  nop
38
  out PORT, r16
39
  ld r16, X+
40
  sbic r16, 7
41
  rjmp 2
42
  rjmp 1
(SFR_IO-Sachen sind aus bequemlichkeit weggelassen. Die Routine muss für 
Xmega und TinyCore geändert werden, da dort die Warteschleife 
(rcall+ret) nicht mehr stimmt).

Das benötigte Array enthält abwechelnd zuerst den nächsten Compare-, 
danach den Port-Wert. Sollte zwischen 2 Comparewerten nur ein PWM-Zyklus 
liegen, besteht der Comparewert nur aus einem Byte indem das MSB gesetzt 
ist.

Verrückte Sachen wie Schleifen ausrollen, sollten erst kommen wenn man 
alles andere ausgeschöpft hat. Mit Ausrollen dürfte man hier bis auf 8 
Takte kommen.

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.