stm32 - dithering pwm pres dma, dotaz...
Tomas Dresler
dresler na hw.cz
Pondělí Červen 15 22:39:44 CEST 2020
Je to dane tim, ze jadro procesoru „plave“ – LDO vyuziva VCAP (vnitrni nebo vnejsi) jako „pumpu“ a nabiji ho při poklesu pod nejakou uroven. Tim se meni napeti jadra a ostatních periferii s periodou kolem 10-12 s, coz muze ovlivnit zpozdeni delay lines v HRTIM (a mirnou zmenu stridy).
Muzu zkusit doporucit dva principy: a) pouzit MCU s vnejsim VCAP pinem a vnejsim LDO, b) zrychlit samočinnou rekalibraci HRTIM – sam si meri zpozdeni v analogových zpozdovacich linkach a vybira hradla dle celkového zmereneho zpozdeni.
--
S pozdravem
Tomáš Dresler
+420 606 756 606
From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Vojtěch Petrucha
Sent: Monday, June 15, 2020 6:51 PM
To: HW-news <hw-list na list.hw.cz>
Subject: Re: stm32 - dithering pwm pres dma, dotaz...
Zdravim,
pred casem jsem se ptal na STM32 - HRTIM a zvyseni rozliseni pomoci ditheringu..
Mam to implementovane v zarizeni co zpetnovazebne ridi proud do civek, takze tam umi nastavit libovolne magneticke pole a kompenzovat pritom okolni ruseni (oboji samozrejme v ramci nejakych mezi..)
Nejake fotky zde: https://maglab.fel.cvut.cz/arbitrary-magnetic-field-generator-system/
Zarizeni funguje pekne, ale vsiml jsem si, ze pokud tam vlozim magnetometr, dostanu na vystupu pilovity signal s amplitudou 1 nT a periodou cca 20-40s, typ. 30s, coz me pro prakticke pouziti prilis netrapi, ale trochu me to stve.. je to jen asi 5 ppm z rozsahu magnetometru (ale magnetometr rozlisi pri pomalejsim vzorkovani dobre i 0.5 ppm takze je to pekne videt)..
Ruznym laborovanim jsem se snazil zjisit kde se to bere. Nejdrive primo v zarizeni, ale to k nicemu nevedlo. Dnes jsem vzal Nucleo-F334 a pokud MCU napajím z nizkosumoveho stabilizatoru (LT1763) a patricny vystup PWM merim DAQ kartou (primo, filtraci udela ta karta,, zalozena na ADS1281..), tak namerim to same.. pilovity prubeh napeti, amplitada cca 5 ppm rozsahu. Stejne vysledky davalo i logovani pomoci Agilent 34401, take ten obdelnik na 64kHz pekne sezere..
viz predposledni obrazek na strance vyse zminene - kanal X je vystup PWM (obdelnik 50:50 takze 1.6 V, konstantni nastavena strida), kanal Y byl zkratovany - jde videt sum karty - asi 0.1 ppm peak-peak (na +-10V rozsah, pri 1Sa/s), kanal Z je napajeci napeti MCU.. (je to SW pro zobrazovani dat z magnetometru s konstantou 100 kV/T, 33183 odpovida 3.318.. V)
Hned na zacatku laborovani jsem si vsiml, ze stejne pilovity prubeh ma odber proudu MCU (v mem zarizeni i na Nucleo F334, i treba F303), rozkmit pily cca 2 mA, viz obrazek na strance, logovan proud pomoci agilent 34401.. a ty dve pily jsou synchronni..
Netusi prosim nekdo cim je dan ten pilovity odber proudu? Predpokladam, ze se nejak fazove schazi prepinani tranzistoru rizenych z vice hodinovych zdroju nebo co? u nuclea je nastaven bypass a PLL, HSI-RC jde do FLITFCLK coz nevim co je.. u meho zarizeni mam klasicky krystal, asi 16.384 MHz a PLL a zas je tam ten asynchronni RC? ..
Kdyby se menilo napeti jadra procesoru, chapal bych, ze by to melo vliv na frekvenci, ale proc by to melo ovlivnit stridu teda nevim. Podotykam ze zmenit nastaveni HRTIM kalibrace (kratka, dlouha, zadna), vypnout dithering a podobne veci jsem zkousel bez vysledku..
diky
v.p.
______________________________________________________________
> Od: "Vojtěch Petrucha" <petrucha na volny.cz <mailto:petrucha na volny.cz> >
> Komu: "HW-news" <hw-list na list.hw.cz <mailto:hw-list na list.hw.cz> >, "HW-news" <hw-list na list.hw.cz <mailto:hw-list na list.hw.cz> >
> Datum: 03.01.2020 14:45
> Předmět: Re: stm32 - dithering pwm pres dma, dotaz...
>
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 <mailto:mrazik na volny.cz> >
> Komu: hw-list na list.hw.cz <mailto: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 <http://www.HW.cz>
Hw-list na list.hw.cz <mailto:Hw-list na list.hw.cz>
http://list.hw.cz/mailman/listinfo/hw-list
----------
_______________________________________________
HW-list mailing list - sponsored by www.HW.cz <http://www.HW.cz>
Hw-list na list.hw.cz <mailto:Hw-list na list.hw.cz>
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/20200615/11cfd3d5/attachment.html>
------------- další část ---------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 6053 bytes
Desc: [žádný popis není k dispozici]
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20200615/11cfd3d5/attachment.bin>
Další informace o konferenci Hw-list