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