<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 />