Angeregt durch: Beitrag "Attiny85 mit 64Mhz PLL mehr als 8 bit Halb-Hardware PWM?" Eine ganz dumme Frage: Warum haben die meisten Microcontroller nur Timer mit PWM-Funktion und keine Sigma-Delta-Einheit? Der Unterschied im Hardwareaufwand ist marginal, der Sigma-Delta Wandler erzeugt aber bei gleichem Takt einen hochfrequentigeren Störanteil. Bei Anwendungen wie der Ansteuerung von LEDS macht sich dieses z.B. durch weniger Flackern bemerkbar. Infineon sind mit dem XMC1000 die Einzigen(?), die hier Alternativen anbieten. Was übersehe ich?
Hallo Tim, der MSP430F2013 von TI hat zumindest einen 16-bit Sigma Delta ADC. http://www.ti.com/product/msp430f2013-ep Gruss Klaus.
Der Hardware Unterschied ist nicht minimal, sowie bei gleicher Output Frequenz muss die OSC Frequenz höher sein. Ev. auch interessant: www.ti.com/lit/an/slyt076/slyt076.pdf
chris schrieb: > Der Hardware Unterschied ist nicht minimal, sowie bei gleicher Output > Frequenz muss die OSC Frequenz höher sein. Ja, beim PWM muss sie höher sein als beim sigma-delta Wandler. Bei der Hardware sehe ich eigentlich kein Problem, das gibt sich nicht viel. PWM: Zähler + Comparator Sigmal-Delta: Register + Addierer > Ev. auch interessant: www.ti.com/lit/an/slyt076/slyt076.pdf Moment, das ist ein ADC und kein DAC...
Die Application Note im erwähnten PDF beschreibt einen Sigma-Delta-DAC... und der Algorithmus müsste sich auch in einem AVR umsetzen lassen. So vom Überfliegen werden 8 Bits für die Ausgabe berechnet und dann per SPI in einem fixen Zeitraster hintereinander ausgegeben. Was für eine Taktrate erzielbar ist müsste man mal ausrechen... (Sorry, ist schon spät und ich bin etwas müde, sonst würde ich das gleich umsetzen)
Ansonsten kannst du es auch in SW machen, hier ein oft kopierter Code, natürlich an sizeof long bzw long long anzupassen. Dieser Code geht auch auf einem little endian cpu wie AVR und Cortex M3, dabe muss aber get[0] anstelle von get[1] verwendet werden. // A 1st-order sigma-delta modulator. This returns a value that // is shifted down by the number of bits in a short int. Note // that this code will only work on a machine that fits two or // more short ints into a long int, and that it assumes // big-endian addressing. typedef union USigDelt { short int get[2]; long int put; } USigDelt; short int sigDelt(long int in; USigDelt * state) { state->get[1] = 0; state->put += in; return get[1]; }
Thomas K. schrieb: > Die Application Note im erwähnten PDF beschreibt einen > Sigma-Delta-DAC... und der Algorithmus müsste sich auch in einem AVR > umsetzen lassen. Stimmt - ich hatte eben den falschen Link angeschaut. > So vom Überfliegen werden 8 Bits für die Ausgabe berechnet und dann per > SPI in einem fixen Zeitraster hintereinander ausgegeben. Was für eine Netter Trick. Das müsste auch auf dem AVR funktionieren. > Taktrate erzielbar ist müsste man mal ausrechen... (Sorry, ist schon > spät und ich bin etwas müde, sonst würde ich das gleich umsetzen) Für das Erzeugen eines 8 Bit Worts benötigt man 16 Taktzyklen. Wahrscheinlich begrenzt der SPI Takt.
1 | ;R0 = Output value |
2 | ;R1 = Accumulator |
3 | ;R2 = sigma-delta bit pattern |
4 | |
5 | ADD R1,R0 |
6 | ROL R2 |
7 | ADD R1,R0 |
8 | ROL R2 |
9 | ADD R1,R0 |
10 | ROL R2 |
11 | ADD R1,R0 |
12 | ROL R2 |
13 | ADD R1,R0 |
14 | ROL R2 |
15 | ADD R1,R0 |
16 | ROL R2 |
17 | ADD R1,R0 |
18 | ROL R2 |
19 | ADD R1,R0 |
20 | ROL R2 |
21 | OUT ... |
chris schrieb: > Ansonsten kannst du es auch in SW machen, hier ein oft kopierter Code, > natürlich an sizeof long bzw long long anzupassen. Ja, nur das kostet natürlich eine Menge CPU-Zeit. Die Frage ist, warum mit viel Aufwand der Timer-Takt hochgetrieben wird, wenn ein Sigma-Delta DAC in Hardware in vielen Fällen eine elegantere Lösung wäre. > Dieser Code geht auch auf einem little endian cpu wie AVR und Cortex M3, > dabe muss aber get[0] anstelle von get[1] verwendet werden. Netter Trick.
Um das Problem zu illustrieren habe ich etwas herumgespielt: http://www.youtube.com/watch?v=4pKUmcIKV0A Sowohl PWM als auch Delta-Sigma Wandler werden mit der gleichen Taktfrequenz betrieben. Wie man sieht, führt PWM zu unansehlichem Flackern, welchen bei dem Delta-Sigma Wandler nur bei sehr geringen Helligkeiten zu sehen ist. In der Realität ist der Effekt noch dramatischer. Warum wird dieses PWM Geflacker der relative einfachen Delta-Sigma-Lösung vorgezogen? Selbst die dedizierten LED-Treiber wie WS2811 können es nicht besser. Gibt es darauf eine rationale Antwort? Wer es selbst nachvollziehen will: Hier ist der Code.
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | #include <avr/sleep.h> |
4 | #include <util/delay.h> |
5 | |
6 | int main(void) |
7 | {
|
8 | uint16_t accu=128; |
9 | uint8_t ctr=0; |
10 | uint8_t brightness=0; |
11 | |
12 | |
13 | TCCR0B=0x2; // timer prescaler=1 |
14 | TIMSK0|=_BV(TOIE0); // overflow interrupt enable |
15 | |
16 | //0x01 16MHz /1 /256 =62.5kHz
|
17 | //0x02 16MHz /8 /256 =7.8kHz
|
18 | //0x03 16MHz /64 /256 =0.122kHz
|
19 | |
20 | set_sleep_mode(SLEEP_MODE_IDLE); |
21 | sei(); |
22 | |
23 | DDRC|=0x0f; |
24 | |
25 | while(1) |
26 | {
|
27 | uint8_t leds; |
28 | sleep_mode(); // wait for timer interrupt |
29 | |
30 | ctr++; // PWM Counter |
31 | |
32 | accu=(accu&0xff)+(uint16_t)brightness; |
33 | |
34 | // error propagation accumulator
|
35 | |
36 | // Note that 16 bit is only needed to capture the overflow to bit 8
|
37 | // this can be easily implemented using flags in assembler
|
38 | // without needing a 16 bit register.
|
39 | |
40 | leds=0; |
41 | |
42 | if (ctr<brightness) leds|=0x01; |
43 | if (accu&0x100) leds|=0x02; |
44 | PORTC=leds; |
45 | |
46 | if (ctr==0) brightness+=2; |
47 | }
|
48 | }
|
49 | |
50 | ISR( TIMER0_OVF_vect ) { |
51 | |
52 | }
|
>Selbst die dedizierten LED-Treiber wie WS2811 können es nicht besser.
Meine LPD8806 z.B. flackern nicht. Und das ist auch nur einfaches PWM.
Allerdings mit 1.2MHz.
holger schrieb: >>Selbst die dedizierten LED-Treiber wie WS2811 können es nicht besser. > > Meine LPD8806 z.B. flackern nicht. Und das ist auch nur einfaches PWM. > Allerdings mit 1.2MHz. Klar, wenn man genug Oversampling betreibt, verschwindet das Flackern. Alerdings handelt man sich damit deutlich höheren Energieverbrauch ein und erzeugt unnötige Störfrequenzen.
Tim . schrieb: > Um das Problem zu illustrieren habe ich etwas herumgespielt: > > http://www.youtube.com/watch?v=4pKUmcIKV0A Aha. Und was willst du damit belegen? Daß 7800Hz/256 = 30.5Hz PWM-Frequenz flackert? Daß es noch mehr flackert, wenn es mit einer Handy-Cam mit 30Hz Bildwiederholfrequenz aufgenommen wird? Nimm eine PWM-Frequenz oberhalb 100Hz und da flackert nix mehr. Das macht ein AVR @ 8MHz noch für 8 LED in Software nebenher. > Warum wird dieses PWM Geflacker der relative einfachen > Delta-Sigma-Lösung vorgezogen? Weil das ständige Ein- und Ausschalten zu höheren Schaltverlusten führt? Weil die höheren Frequenzen auf Kabeln (nicht nur zur LED, auch vom Netzteil) zu mehr Störstrahlung führt? XL
@Axel Schwenke (a-za-z0-9) >Weil das ständige Ein- und Ausschalten zu höheren Schaltverlusten führt? >Weil die höheren Frequenzen auf Kabeln (nicht nur zur LED, auch vom >Netzteil) zu mehr Störstrahlung führt? Im Prinzip ja, aber man muss nicht immer den Teufel an die Wand malen. Für kleine Leistungen und Verbraucher wie LEDs, DAC etc. ist Sigma Delta schon sehr vorteilhaft. Dass man keine großen Motoren etc. damit betreibt ist klar.
Axel Schwenke schrieb: > Tim . schrieb: >> Um das Problem zu illustrieren habe ich etwas herumgespielt: >> >> http://www.youtube.com/watch?v=4pKUmcIKV0A > > Aha. Und was willst du damit belegen? Daß 7800Hz/256 = 30.5Hz > PWM-Frequenz flackert? Daß es noch mehr flackert, wenn es mit einer > Handy-Cam mit 30Hz Bildwiederholfrequenz aufgenommen wird? Dass ein Delta-Sigma Converter bei gleichem Takt deutlich überlegen ist. > Nimm eine PWM-Frequenz oberhalb 100Hz und da flackert nix mehr. Das > macht ein AVR @ 8MHz noch für 8 LED in Software nebenher. Das Argument ist unverständlich. Es gibt genug Anwendungen, bei denen 100 Hz noch nicht ausreichen. Bei LEDS m.M. nach auch nicht - bei 100Hz sieht man das Flackern bei jeder Bewegung. >> Warum wird dieses PWM Geflacker der relative einfachen >> Delta-Sigma-Lösung vorgezogen? > > Weil das ständige Ein- und Ausschalten zu höheren Schaltverlusten führt? Das mag sicherlich vom Verbraucher abhängen. z.B. LEDs haben eine niedrige Kapazität und einen niedrigen Innenwiederstand, so dass sich die Schaltverluste in Grenzen halten. Bei einem Motor wird das durch die hohe Induktivität anders aussehen. > Weil die höheren Frequenzen auf Kabeln (nicht nur zur LED, auch vom > Netzteil) zu mehr Störstrahlung führt? Die Argumentation ist mir nicht ganz klar. Man wird den Wandler immer so anpassen, dass das Frequenzspektrum am Ausgabepin nach den gegebenen Kriterien optimiert ist. Der Vorteil beim Sigma-Delta Wandler ist in dem Fall, dass man für die gleiche Ausgabefrequenz intern einen deutlich geringeren Takt benötigt.
Hier übrigens die Produktseite von Infineons XMC1100/1200. Die Microcontroller haben einen Delta-Sigma Wandler mit vorgeschalteter Gamma-Korrektur zur Ansteuerung von LEDs integriert. http://www.infineon.com/cms/en/product/microcontrollers/32-bit-industrial-microcontrollers-based-on-arm-registered-cortex-tm-m/32-bit-xmc1000-industrial-microcontrollers-arm-registered-cortex-tm-m0/channel.html?channel=db3a30433c1a8752013c1aa35a6a0029&tab=2
Tim . schrieb: > Axel Schwenke schrieb: >> >> .. was willst du damit belegen? Daß 7800Hz/256 = 30.5Hz >> PWM-Frequenz flackert? Daß es noch mehr flackert, wenn es mit einer >> Handy-Cam mit 30Hz Bildwiederholfrequenz aufgenommen wird? > > Dass ein Delta-Sigma Converter bei gleichem Takt deutlich überlegen ist. Überlegen bezüglich welcher Metrik? Wenn die PWM-Periode kurz genug gewählt wird (was du wohlweislich nicht getan hast) dann ist in der Praxis kein Unterschied. >> Nimm eine PWM-Frequenz oberhalb 100Hz und da flackert nix mehr. Das >> macht ein AVR @ 8MHz noch für 8 LED in Software nebenher. > > Das Argument ist unverständlich. Es gibt genug Anwendungen, bei denen > 100 Hz noch nicht ausreichen. Dann nimm halt 200Hz. Oder 500. Du hast ja noch nicht mal Anforderungen spezifiziert, sondern einfach einen Test bei 30.5Hz gemacht. Was nach jeder Spezifikation zu wenig ist. Und genau deswegen hat dein Experiment keinerlei Aussagekraft. Genau genommen löst du ein "Problem" das gar nicht existiert. >>> Warum wird dieses PWM Geflacker der relative einfachen >>> Delta-Sigma-Lösung vorgezogen? >> >> Weil das ständige Ein- und Ausschalten zu höheren Schaltverlusten führt? > > Das mag sicherlich vom Verbraucher abhängen. z.B. LEDs haben eine > niedrige Kapazität und einen niedrigen Innenwiederstand, so dass sich > die Schaltverluste in Grenzen halten. Die Schaltverluste entstehen nicht an der LED (allein). Wenn die LED über einen FET angeschaltet wird (heute wahrscheinlicher als alles andere) dann ist jeder Schaltvorgang eine Umladung der Gate-Kapazität und damit ein Verlust. >> Weil die höheren Frequenzen auf Kabeln (nicht nur zur LED, auch vom >> Netzteil) zu mehr Störstrahlung führt? > > Die Argumentation ist mir nicht ganz klar. Man wird den Wandler immer so > anpassen, dass das Frequenzspektrum am Ausgabepin nach den gegebenen > Kriterien optimiert ist. Der Vorteil beim Sigma-Delta Wandler ist in dem > Fall, dass man für die gleiche Ausgabefrequenz intern einen deutlich > geringeren Takt benötigt. Wen interessiert denn der interne Takt? Mit Leistung versehen und auf einer zumindest potentiell langen Leitung ist nur das Ausgangssignal. Und da macht der dS Wandler keine so tolle Figur. Beispiel mit 8 Bit Auflösung und 10kHz (=100µs) Basistakt: 1/256 -> PWM 1 Impuls 100µs, dS 1 Impuls 100µs 2/256 -> PWM 1 Impuls 200µs, dS 2 Impulse 100µs 3/256 -> PWM 1 Impuls 300µs, dS ~3 Impulse 100µs ... Das Oberwellenspektrum ist bei 1/256 noch gleich. Danach wird es für die PWM freundlicher. Ganz extrem ist es bei 128/256 wo die PWM ein Rechteck mit 50% Tastverhältnis liefert (2 Umschaltungen pro Periode) und dS statt dessen alle 100µs umschaltet (256 mal pro Periode!). Umschaltverluste 1:128. Und das bei gerade mal 8 Bit. Realiter will man eher 10-12 Bit (nach der Gammakorrektur). Keine Frage, wenn die Anwendung verlangt das PWM/dS Signal zu einer Gleichspannug zu filtern, dann ist dS von Vorteil. Denn dann will man ja daß das auszufilternde Störsignal möglichst hochfrequent ist. Aber davon hast du ja nicht geredet. XL
Axel Schwenke schrieb: > Umschaltverluste 1:128. Und das bei gerade mal 8 Bit. Die häufigere Taktung hat noch einen anderen Effekt: Wird die PWM für einen LED-Treiber eingesetzt, hackt hier die Turn-On-Zeit rein. Mal angenommen, wir haben 280Hz PWM mit 8Bit, benötigen wir einen PWM-Takt von etwa 14µsec. Mal angenommen, unsere getaktete KSQ hat eine Turn-On-Zeit von 8µsec und eine Turn-Off-Zeit von 1µsec (das sind relativ realistische Werte, die ich letztens mal vermessen habe).
1 | PWM-Ansteuerung |
2 | Wert Muster PWM Dauer soll Dauer ist Fehler Strom |
3 | 1 0..00001 14µsec 7µsec 50% |
4 | 2 0..00011 28 21 25% |
5 | 3 0..00111 42 35 17% |
6 | 128 000..111 1.78msec 1.78msec 0.4% |
7 | 255 111..111 3.57msec 3.57msec 0% |
Bei kleinen PWM-Werten ist die Dauer des fließenden Stromes durch die Turn-On-Zeit der KSQ kürzer als der PWM-Puls und verursacht einen Helligkeitsverlust, der mit steigender PWM schnell nachlässt. Ab einem PWM-Wert von 10 ist der eigentlich nicht mehr wahrnehmbar.
1 | delta-Sigma-Ansteuerung |
2 | Wert Muster dS Dauer soll Dauer ist Fehler Strom |
3 | 1 0..00001 14µsec 7µsec 50% |
4 | 2 0..10001 2x14 2x7 50% |
5 | 3 0..10101 3x14 3x7 50% |
6 | 128 010..101 128x14 128x7 50% |
7 | 255 111..111 3.57msec 3.57msec 0% |
Bei Delta-Sigma tritt bei jedem Puls ein Helligkeitsverlust ein, der sich bis in hohe Werte durchzieht. Im Beispiel ist bei 50% (Wert 128) durch den Fehler von 50% die Helligkeit nur 25% vom Endwert. Ausserdem hängt die Helligkeit stark von der Pulsfolge ab, wie man im Beispiel aus der oben angegebenen AN für einen 3bit-DAC sieht:
1 | Wert Muster dS Dauer soll Dauer ist Hell soll Hell ist Fehler |
2 | 1 00000010 1x14µ 1x7µ 13% 6% 50% |
3 | 2 00100010 2x14µ 2x7µ 25% 13% 50% |
4 | 3 01001010 3x14µ 3x7µ 38% 19% 50% |
5 | 4 10101010 4x14µ 4x7µ 50% 25% 50% |
6 | 5 10110110 1x14µ+2x28µ 1x7µ+2x21µ 63% 44% 30% |
7 | 6 11101110 2x42µ 2x35µ 75% 63% 16% |
8 | 7 11111110 1x98µ 1x91µ 88% 81% 8% |
9 | 8 11111111 1x112µ 1x112µ 100% 100% 0% |
Die Helligkeit ist bis 50% vom Sollwert deutlich verringert, und steigt dann nichtlinear an. Während sich die Turn-On-Zeit bei PWM nur bei geringen PWM-Werten bemerkbar macht, schlägt sie bei delta-Sigma über den gesamten Wertebereich zu, was den Einsatz von schnell schaltenden KSQ mit Turn-On-Zeiten von weniger als 1µsec erfordern würde. Mit den steilen Schaltflanken steigen natürlich wieder die Umschaltverluste und die Störausstrahlung.
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.