Re: stm32 - dithering pwm pres dma, dotaz...
Vojtěch Petrucha
petrucha na volny.cz
Pátek Leden 3 14:45:12 CET 2020
Děkuju, ještě si s tím pohraju.
Těch 16 prvků jsem vypsal protože i dál to bylo stejně.
Intuitivně mi přišlo, že by to měla být perioda opakování toho vzoru.., pokud by se to měnilo přes delší periodu, zbytečně by to posouvalo spektrum rušení k nížším f
v.p.
______________________________________________________________
> Od: "Miroslav Mraz" <mrazik na volny.cz>
> Komu: hw-list na list.hw.cz
> Datum: 03.01.2020 13:56
> Předmět: Re: stm32 - dithering pwm pres dma, dotaz...
>
To máte patrně dobře, ale 16 vzorků je na průměrování málo. Samozřejmě,
že tam ten dithering je, je trochu jiný než od ST, ale integrálně to
sedí a to potřebujete. Viz obrázek. Počítáno je to takto
static const int INPUT_BIT_RANGE = 14;
static const int MAXIMUM_PWM = 256; // nemusí být nutně mocnina 2
static const unsigned SIGMA_MASK = (1u << (INPUT_BIT_RANGE + 0)) - 1u;
static const unsigned SIGNED_OFFEST = (1u << (INPUT_BIT_RANGE - 1));
// Předpokládá se na vstupu signed int o šířce INPUT_BIT_RANGE
// přičemž 0 na vstupu odpovídá MAXIMUM_PWM / 2 na výstupu
static const unsigned pwm_sd_1 (const int input) {
static unsigned sigma = 0;
const unsigned sample = (input + SIGNED_OFFEST) * MAXIMUM_PWM;
sigma &= SIGMA_MASK;
sigma += sample;
return sigma >> INPUT_BIT_RANGE;
}
static const unsigned pwm_pure (const int input) {
const unsigned sample = (input + SIGNED_OFFEST) * MAXIMUM_PWM;
return sample >> INPUT_BIT_RANGE;
}
Mrazík
Dne 03. 01. 20 v 13:06 Vojtěch Petrucha napsal(a):
> 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:
----------
_______________________________________________
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/3c2f60eb/attachment.html>
Další informace o konferenci Hw-list