Suche µC mit 4 bis 8 PWM-Kanälen, mind. 12Bit

Gast #3082494
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?
#3082640
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
#3082675
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.
#3082885
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.
#3083210
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
Gast #3083511
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.
Gast #3083540
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!
Gast #3083552
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.
Gast #3083567
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
Gast #3083610
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!
Gast #3083703
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)
Gast #3083705
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren