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