stm32 - dithering pwm pres dma, dotaz...
Miroslav Mraz
mrazik na volny.cz
Pátek Leden 3 13:56:06 CET 2020
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:
------------- další část ---------------
A non-text attachment was scrubbed...
Name: img.png
Type: image/png
Size: 34025 bytes
Desc: [žádný popis není k dispozici]
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20200103/ee51c945/attachment-0001.png>
Další informace o konferenci Hw-list