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?
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
@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.
Schau Dir mal die Piccolos von TI mit High Resolution PWM (HRPWM) an.
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.
Ach ja, wenn 4 Kanäle reichen, vielleicht der ATmega1284p. Der hat zwei 16-Bit-Timer mit je zwei Kanälen.
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.
Wetten dass damit wieder Leds gedimmt werden sollen...
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)
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.
@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.
Hallo, Danke für die vielen Antworten!!! Jo schrieb: > Was ist denn mit BCM statt PWM. Was versteht man unter BCM?
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?
stm32 --> soviele PWMs wie IO-Pins verfügbar sind.
@ 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.
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.