Forum: Mikrocontroller und Digitale Elektronik Warum gibt es (fast) keine MC mit eingebauter Sigma-Delta Wandlung


von Tim  . (cpldcpu)


Lesenswert?

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?

von Klaus R. (klara)


Lesenswert?

Hallo Tim,
der MSP430F2013 von TI hat zumindest einen 16-bit Sigma Delta ADC.

http://www.ti.com/product/msp430f2013-ep

Gruss Klaus.

von chris (Gast)


Lesenswert?

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

von Tim  . (cpldcpu)


Lesenswert?

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...

von Thomas K. (thomas_k39)


Lesenswert?

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)

von chris (Gast)


Lesenswert?

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];
}

von Tim  . (cpldcpu)


Lesenswert?

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 ...

von Tim  . (cpldcpu)


Lesenswert?

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.

von Tim  . (cpldcpu)


Lesenswert?

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
}

von holger (Gast)


Lesenswert?

>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.

von Tim  . (cpldcpu)


Lesenswert?

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.

von Axel S. (a-za-z0-9)


Lesenswert?

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

von Edgar (Gast)


Lesenswert?

vielleicht auch interessant:
http://www.cypress.com/psoc/

von Falk B. (falk)


Lesenswert?

@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.

von Tim  . (cpldcpu)


Lesenswert?

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.

von Tim  . (cpldcpu)


Lesenswert?

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

von Axel S. (a-za-z0-9)


Lesenswert?

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

von Timm T. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.