<p style="padding:0 0 0 0; margin:0 0 0 0;">diky za odpoved.</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;">jsem si to upravil a pustil na stm32f303 - misto do citace jsem vysledky (hodnoty pwm) zapisoval do bufferu na ktery jsem kouknul debuggerem</p>

<p style="padding:0 0 0 0; margin:0 0 0 0;">zmensil jsem pridavek na 4 bity, aby se v tom clovek snadneji vyznal.  mozna jsem tim ale ten kod zprznil vic nez jsem mel</p>

<p style="padding:0 0 0 0; margin:0 0 0 0;"><span style="font-size: 10pt;">protoze ono to v podstate dela to same co ta st appnota, ale "mene dokonale"  viz nize</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;">uint16_t indexX=0;</p>

<p style="padding:0 0 0 0; margin:0 0 0 0;">uint16_t buffer[1024];<span style="white-space: pre;"> </span>//na ulozeni vystupnich hodnot</p>

<p style="padding:0 0 0 0; margin:0 0 0 0;">uint32_t sigma=0;</p>

<p style="padding:0 0 0 0; margin:0 0 0 0;">uint32_t sample=0;</p>

<p style="padding:0 0 0 0; margin:0 0 0 0;">static uint16_t pwm; // šířka pulsu od 0 do maxpwm</p>

<p style="padding:0 0 0 0; margin:0 0 0 0;">#define INPUT_x  2050;                                                -pozadovana hodnota - me jde v podstate o presne DC urovne..</p>

<p style="padding:0 0 0 0; margin:0 0 0 0;">static const uint16_t maxpwm = 256;</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;">volano v main:</span></p>

<p style="padding:0 0 0 0; margin:0 0 0 0;"><span style="font-size: 10pt;">void PWM_Timer_Interrupt (void) { // přerušení od časovače PWM na fN</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="white-space: pre;"> </span>buffer[indexX] = pwm; // zapiš minulou šířku a pak v klidu počítej</p>

<p style="padding:0 0 0 0; margin:0 0 0 0;"><span style="white-space: pre;"> </span>indexX++;</p>

<p style="padding:0 0 0 0; margin:0 0 0 0;"><span style="white-space: pre;"> </span>if(indexX >1023){indexX=0;};</p>

<p style="padding:0 0 0 0; margin:0 0 0 0;"><span style="white-space: pre;"> </span>sample = INPUT_x;</p>

<p style="padding:0 0 0 0; margin:0 0 0 0;"><span style="white-space: pre;"> </span>sample *= maxpwm; // finta</p>

<p style="padding:0 0 0 0; margin:0 0 0 0;"><span style="white-space: pre;"> </span>sigma += sample; // sigma</p>

<p style="padding:0 0 0 0; margin:0 0 0 0;"><span style="white-space: pre;"> </span>pwm = sigma >> 12; // delta            //bylo 16</p>

<p style="padding:0 0 0 0; margin:0 0 0 0;"><span style="white-space: pre;"> </span>sigma &= 0x0FFFu; // zůstatek do dalšího kola  //bylo FFFF</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;"> </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;">v ramci periody 16 vystupnich  hodnot to pro nahodne zvolene cislo 2048 a dalsi vypada nasledovne:</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;">2048</p>

<p style="padding:0 0 0 0; margin:0 0 0 0;">128 vse</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;">2049</p>

<p style="padding:0 0 0 0; margin:0 0 0 0;">128 vse</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;">2050</p>

<p style="padding:0 0 0 0; margin:0 0 0 0;">129, 128, 128, 128, 128, 128, 128, 128, 129, 128, 128, 128, 128, 128, 128, 128,   2/14</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;">2051</p>

<p style="padding:0 0 0 0; margin:0 0 0 0;">129, 128, 128, 128, 128, 128, 129, 128, 128, 128, 128, 129, 128, 128, 128, 128,   3/13</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;">2052</p>

<p style="padding:0 0 0 0; margin:0 0 0 0;">129, 128, 128, 128, 129, 128, 128, 128, 129, 128, 128, 128, 129, 128, 128, 128,    4/12</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;">2053</p>

<p style="padding:0 0 0 0; margin:0 0 0 0;">129, 128, 128, 129, 128, 128, 129, 128, 129, 128, 128, 129, 128, 128, 129, 128,    6/10</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;">2054</p>

<p style="padding:0 0 0 0; margin:0 0 0 0;">129, 128, 128, 129, 128, 128, 129, 128, 129, 128, 128, 129, 128, 128, 129, 128,    6/10</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;">cili mi tam chybi ty stavy 1x 129 a 15x 128  a dale   5x129 a 11x128....</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;"> </p>

<p style="padding:0 0 0 0; margin:0 0 0 0;">v.p.</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;"> </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;"> </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;"> </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: 02.01.2020 17:05<br />
> Předmět: Re: stm32 - dithering pwm pres dma, dotaz...<br />
></p>

V textu<br />
 <br />
 Dne 02. 01. 20 v 16:29 Vojtěch Petrucha napsal(a):<br />
 > vzpominam si, ze jste to tu zminoval, mam to i nekde ulozene, akorat <br />
 > fakt nevim kde...<br />
 > <br />
 > ten princip ST apnote je myslim docela pochopitelny hned z toho prvniho <br />
 > obrazku v apnote pdf. je to takove "brute force" ktere prida do spektra <br />
 > nejake breberky na nizsich frekvencich nez je zakladni f pwm..<br />
 > <br />
 > ohledne Vaseho kodu, budu si muset rozmyslet co to vlastne dela. prvni <br />
 > pohled - ma tam byt v te funkci v preruseni opravdu resample = 0; - to <br />
 > by pak ten prvni if nedaval smysl?<br />
 <br />
 resample je statická proměnná, takže se na 0 inicializuje jen při <br />
 startu. Ono to tam spíš mate, protože to bylo použito pro audio v <br />
 telefonní kvalitě, tedy základní vzorkování 8kHz. A protože se tato <br />
 frekvence dala jen blbě odfiltrovat, použil jsem pro PWM opakovací <br />
 frekvenci 16kHz, proto je tam to převzorkováni, dá se to vyhodit.<br />
 Podstatou je přetékající čítač (unsigned, zde sigma) z něhož používáme <br />
 pro PWM horních několik (8) bitů a přičítáme každý vzorek tak, aby to <br />
 bylo bezznaménkové číslo. Prostě jako sigma-delta převodník, ten ale <br />
 místo horních 8. bitů používá jediný.<br />
 Já se spíš divím, že tenhle jednoduchý princip ještě nikoho nenapadlo <br />
 implementovat přímo v hardware timeru. Stačí na to jen jediná sčítačka - <br />
 akumulátor.<br />
 <br />
 Mrazík<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 />