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?
@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.
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.
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.
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
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.
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.
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)
@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.
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?
@ 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
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.
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!
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.
> 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
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!
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?
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)
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.