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