<p style="padding:0 0 0 0; margin:0 0 0 0;">Děkuju, ještě si s tím pohraju.</p>
<p style="padding:0 0 0 0; margin:0 0 0 0;">Těch 16 prvků jsem vypsal protože i dál to bylo stejně.</p>
<p style="padding:0 0 0 0; margin:0 0 0 0;">Intuitivně mi přišlo, že by to měla být perioda opakování toho vzoru.., <span style="font-size: 10pt;">pokud by se to měnilo přes delší periodu, zbytečně by to posouvalo spektrum rušení k nížším f </span></p>
<p style="padding:0 0 0 0; margin:0 0 0 0;"><span style="font-size: 10pt;"></span><span style="font-size: 10pt;">v.p.</span></p>
<p style="padding:0 0 0 0; margin:0 0 0 0;"> </p>
<p style="padding:0 0 0 0; margin:0 0 0 0;"><span style="font-size: 10pt;"> </span></p>
<p style="padding:0 0 0 0; margin:0 0 0 0;"> </p>
<p style="padding:0 0 0 0; margin:0 0 0 0;">______________________________________________________________<br />
> Od: "Miroslav Mraz" <mrazik@volny.cz><br />
> Komu: hw-list@list.hw.cz<br />
> Datum: 03.01.2020 13:56<br />
> Předmět: Re: stm32 - dithering pwm pres dma, dotaz...<br />
></p>
To máte patrně dobře, ale 16 vzorků je na průměrování málo. Samozřejmě, <br />
že tam ten dithering je, je trochu jiný než od ST, ale integrálně to <br />
sedí a to potřebujete. Viz obrázek. Počítáno je to takto<br />
<br />
static const int INPUT_BIT_RANGE = 14;<br />
static const int MAXIMUM_PWM = 256; // nemusí být nutně mocnina 2<br />
static const unsigned SIGMA_MASK = (1u << (INPUT_BIT_RANGE + 0)) - 1u;<br />
static const unsigned SIGNED_OFFEST = (1u << (INPUT_BIT_RANGE - 1));<br />
// Předpokládá se na vstupu signed int o šířce INPUT_BIT_RANGE<br />
// přičemž 0 na vstupu odpovídá MAXIMUM_PWM / 2 na výstupu<br />
static const unsigned pwm_sd_1 (const int input) {<br />
static unsigned sigma = 0;<br />
const unsigned sample = (input + SIGNED_OFFEST) * MAXIMUM_PWM;<br />
sigma &= SIGMA_MASK;<br />
sigma += sample;<br />
return sigma >> INPUT_BIT_RANGE;<br />
}<br />
static const unsigned pwm_pure (const int input) {<br />
const unsigned sample = (input + SIGNED_OFFEST) * MAXIMUM_PWM;<br />
return sample >> INPUT_BIT_RANGE;<br />
}<br />
<br />
Mrazík<br />
<br />
Dne 03. 01. 20 v 13:06 Vojtěch Petrucha napsal(a):<br />
> diky za odpoved.<br />
> <br />
> jsem si to upravil a pustil na stm32f303 - misto do citace jsem vysledky <br />
> (hodnoty pwm) zapisoval do bufferu na ktery jsem kouknul debuggerem<br />
> <br />
> zmensil jsem pridavek na 4 bity, aby se v tom clovek snadneji vyznal. <br />
> mozna jsem tim ale ten kod zprznil vic nez jsem mel<br />
> <br />
> protoze ono to v podstate dela to same co ta st appnota, ale "mene <br />
> dokonale" viz nize<br />
> <br />
> uint16_t indexX=0;<br />
> <br />
> uint16_t buffer[1024];//na ulozeni vystupnich hodnot<br />
> <br />
> uint32_t sigma=0;<br />
> <br />
> uint32_t sample=0;<br />
> <br />
> static uint16_t pwm; // šířka pulsu od 0 do maxpwm<br />
> <br />
> #define INPUT_x 2050; <br />
> -pozadovana hodnota - me jde v podstate o presne DC urovne..<br />
> <br />
> static const uint16_t maxpwm = 256;<br />
> <br />
> volano v main:<br />
> <br />
> void PWM_Timer_Interrupt (void) { // přerušení od časovače PWM na fN<br />
> <br />
> buffer[indexX] = pwm; // zapiš minulou šířku a pak v klidu počítej<br />
> <br />
> indexX++;<br />
> <br />
> if(indexX >1023){indexX=0;};<br />
> <br />
> sample = INPUT_x;<br />
> <br />
> sample *= maxpwm; // finta<br />
> <br />
> sigma += sample; // sigma<br />
> <br />
> pwm = sigma >> 12; // delta //bylo 16<br />
> <br />
> sigma &= 0x0FFFu; // zůstatek do dalšího kola //bylo FFFF<br />
> <br />
> }<br />
> <br />
> v ramci periody 16 vystupnich hodnot to pro nahodne zvolene cislo 2048 <br />
> a dalsi vypada nasledovne:<br />
<br />
<br />
----------<br />
<br />
_______________________________________________<br />
HW-list mailing list - sponsored by www.HW.cz<br />
Hw-list@list.hw.cz<br />
<a href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a><br />