Re: stm32 - dithering pwm pres dma, dotaz...

Vojtěch Petrucha petrucha na volny.cz
Pátek Leden 3 13:06:38 CET 2020


diky za odpoved.
 
jsem si to upravil a pustil na stm32f303 - misto do citace jsem vysledky (hodnoty pwm) zapisoval do bufferu na ktery jsem kouknul debuggerem
zmensil jsem pridavek na 4 bity, aby se v tom clovek snadneji vyznal.  mozna jsem tim ale ten kod zprznil vic nez jsem mel
protoze ono to v podstate dela to same co ta st appnota, ale "mene dokonale"  viz nize
 
uint16_t indexX=0;
uint16_t buffer[1024]; //na ulozeni vystupnich hodnot
uint32_t sigma=0;
uint32_t sample=0;
static uint16_t pwm; // šířka pulsu od 0 do maxpwm
#define INPUT_x  2050;                                                -pozadovana hodnota - me jde v podstate o presne DC urovne..
static const uint16_t maxpwm = 256;
 
volano v main:
void PWM_Timer_Interrupt (void) { // přerušení od časovače PWM na fN
 
 buffer[indexX] = pwm; // zapiš minulou šířku a pak v klidu počítej
 indexX++;
 if(indexX >1023){indexX=0;};
 sample = INPUT_x;
 sample *= maxpwm; // finta
 sigma += sample; // sigma
 pwm = sigma >> 12; // delta            //bylo 16
 sigma &= 0x0FFFu; // zůstatek do dalšího kola  //bylo FFFF
}
 
 
v ramci periody 16 vystupnich  hodnot to pro nahodne zvolene cislo 2048 a dalsi vypada nasledovne:
 
2048
128 vse
 
2049
128 vse
 
2050
129, 128, 128, 128, 128, 128, 128, 128, 129, 128, 128, 128, 128, 128, 128, 128,   2/14
 
2051
129, 128, 128, 128, 128, 128, 129, 128, 128, 128, 128, 129, 128, 128, 128, 128,   3/13
 
2052
129, 128, 128, 128, 129, 128, 128, 128, 129, 128, 128, 128, 129, 128, 128, 128,    4/12
 
2053
129, 128, 128, 129, 128, 128, 129, 128, 129, 128, 128, 129, 128, 128, 129, 128,    6/10
 
2054
129, 128, 128, 129, 128, 128, 129, 128, 129, 128, 128, 129, 128, 128, 129, 128,    6/10
 
cili mi tam chybi ty stavy 1x 129 a 15x 128  a dale   5x129 a 11x128....
 
 
v.p.
 
 
 
 
 
 
______________________________________________________________
> Od: "Miroslav Mraz" <mrazik na volny.cz>
> Komu: hw-list na list.hw.cz
> Datum: 02.01.2020 17:05
> Předmět: Re: stm32 - dithering pwm pres dma, dotaz...
>
V textu
 
 Dne 02. 01. 20 v 16:29 Vojtěch Petrucha napsal(a):
 > vzpominam si, ze jste to tu zminoval, mam to i nekde ulozene, akorat 
 > fakt nevim kde...
 > 
 > ten princip ST apnote je myslim docela pochopitelny hned z toho prvniho 
 > obrazku v apnote pdf. je to takove "brute force" ktere prida do spektra 
 > nejake breberky na nizsich frekvencich nez je zakladni f pwm..
 > 
 > ohledne Vaseho kodu, budu si muset rozmyslet co to vlastne dela. prvni 
 > pohled - ma tam byt v te funkci v preruseni opravdu resample = 0; - to 
 > by pak ten prvni if nedaval smysl?
 
 resample je statická proměnná, takže se na 0 inicializuje jen při 
 startu. Ono to tam spíš mate, protože to bylo použito pro audio v 
 telefonní kvalitě, tedy základní vzorkování 8kHz. A protože se tato 
 frekvence dala jen blbě odfiltrovat, použil jsem pro PWM opakovací 
 frekvenci 16kHz, proto je tam to převzorkováni, dá se to vyhodit.
 Podstatou je přetékající čítač (unsigned, zde sigma) z něhož používáme 
 pro PWM horních několik (8) bitů a přičítáme každý vzorek tak, aby to 
 bylo bezznaménkové číslo. Prostě jako sigma-delta převodník, ten ale 
 místo horních 8. bitů používá jediný.
 Já se spíš divím, že tenhle jednoduchý princip ještě nikoho nenapadlo 
 implementovat přímo v hardware timeru. Stačí na to jen jediná sčítačka - 
 akumulátor.
 
 Mrazík
 
 _______________________________________________
 HW-list mailing list  -  sponsored by www.HW.cz
 Hw-list na list.hw.cz
 http://list.hw.cz/mailman/listinfo/hw-list <http://list.hw.cz/mailman/listinfo/hw-list>

------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20200103/bc8858c3/attachment.html>


Další informace o konferenci Hw-list