Esercizio 20regolatore PI in C per il controllo PWM di un motore, valore del duty-cycle e risoluzione (tema d'esame gennaio 2023)
In questa pagina 7
Testo (tema d'esame gennaio 2023, problema P7). È dato il seguente segmento di codice C che realizza un regolatore di tipo PI per il controllo tramite PWM di un motore elettrico a corrente continua:
/* ---- Variable x1 ---- */
error1 = x1_ref - x1; /* error on x1 */
/* ---- PI regulator ---- */
yp1 = (kp1 * error1) >> 12; /* proportional correction */
yint1 += ((ki1 * error1) >> 16); /* integral correction */
DutyCycle = yp1 + yint1;Sapendo che all'inizio del segmento i valori di x1_ref, x1 e yint1 sono , e , e che i guadagni del regolatore sono rispettivamente e (valori in base 10), determinare:
(a) il valore, in formato esadecimale, della variabile uint16_t DutyCycle alla fine del segmento;
(b) il valore effettivo del duty-cycle, sapendo che il periodo di conteggio del modulatore è pari a cicli di clock;
(c) il numero effettivo di bit che corrisponde alla risoluzione del duty-cycle;
Sapendo inoltre che la frequenza di clock del timer è fissata a GHz: (d) la frequenza di modulazione del sistema; (e) il valore della frequenza di modulazione che porterebbe a 12 bit effettivi la risoluzione del duty-cycle.
Teoria usata: Regolatori PI e PID digitaliIl PI digitale è $y(k)=k_p,e(k)+y_I(k)$ con $y_I(k)=k_I',e(k)+y_I(k-1)$ e $k_I'=k_iT_c$ (con una MAC bastano 3 cicli). Nel PID la derivata si calcola come $\frac{k_d}{T_c}[e(k)-e(k-1)]$ ed è sensibile al rumore: si usa la versione filtrata $y_d(k)=\frac{k_d}{T_c+\tau_L}[e(k)-e(k-1)]+\frac{\tau_L}{T_c+\tau_L}y_d(k-1)$ o una media su più campioni. Con la saturazione dell'attuatore serve l'anti-wind-up: $|y_I|\le L(k)=Y_{max}-|k_pe(k)|$. Il controllo dead-beatcontrollo che porta l'errore a zero in un numero finito di passi (predittivo) azzera l'errore in un numero finito di passi ma è poco usato in industria.Regolatori PI e PID digitali →, Modulazione PWM - duty-cycle, risoluzione e demodulazioneLa PWM trasferisce un segnale modulante $V^$ nella larghezza degli impulsi di un'onda quadra a frequenza fissa: con duty-cycle $d=t_1/T$ e livelli $\pm\frac E2$ la media è $V_{med}=(d-\frac12)E=E,\frac{V^}{V_p}$. L'informazione sta nel valor medio; il resto dello spettro (armoniche della portante) si elimina con un passa-basso (demodulazione). Il modulatore digitale è un timer: contatore + comparatore, $N=f_{clk}/f_{PWM}$ conteggi per periodo, risoluzione $n=\log_2N$ bit (massima frequenza per $n$ bit: $f_{clk}/2^n$), registro di compare = duty-cycle. Servono almeno 8 bit per evitare cicli limite.Modulazione PWM - duty-cycle, risoluzione e demodulazione →, Realizzare un filtro o un regolatore a virgola fissaRealizzare in C un filtro a virgola fissa vuol dire scegliere per ogni dato il formato (coefficienti $<1$ in 0.16 U, coefficienti $>1$ in 1.15, 4.12, 5.11 S...), moltiplicare con aritmetica a 32 bit ($16\times16\to32$) e riportare il prodotto al formato di arrivo con uno shift a destrascorrimento dei bit verso destra: equivale a dividere per una potenza di 2; per sommare due prodotti con scale diverse si fa lo shift prima di sommare. Con $a+b=2^{16}$ il filtro $y=\big(a,y_{k-1}+b,(u\ll4)\big)\gg16$ non va in overflow in un uint32_t. Nel codice il formato di ogni variabile va dichiarato in un commento; la funzione $\sin x\approx x-\frac{x^3}6+\frac{x^5}{120}$ mostra come si approssima una funzione con polinomi a coefficienti in virgola fissa.Realizzare un filtro o un regolatore a virgola fissa →.
Lettura del codice
È un PI discreto (Regolatori PI e PID digitaliIl PI digitale è $y(k)=k_p,e(k)+y_I(k)$ con $y_I(k)=k_I',e(k)+y_I(k-1)$ e $k_I'=k_iT_c$ (con una MAC bastano 3 cicli). Nel PID la derivata si calcola come $\frac{k_d}{T_c}[e(k)-e(k-1)]$ ed è sensibile al rumore: si usa la versione filtrata $y_d(k)=\frac{k_d}{T_c+\tau_L}[e(k)-e(k-1)]+\frac{\tau_L}{T_c+\tau_L}y_d(k-1)$ o una media su più campioni. Con la saturazione dell'attuatore serve l'anti-wind-up: $|y_I|\le L(k)=Y_{max}-|k_pe(k)|$. Il controllo dead-beatcontrollo che porta l'errore a zero in un numero finito di passi (predittivo) azzera l'errore in un numero finito di passi ma è poco usato in industria.Regolatori PI e PID digitali →): con . I guadagni sono scalati in virgola fissa: con fattore (shift : ) e con fattore (shift : ). Le variabili intermedie (error1, yp1, yint1) sono int32_t; la somma finale è assegnata a una uint16_t, quindi si tiene la parte bassa a 16 bit.
(a) Calcolo
- Errore: .
- Proporzionale: ; (divisione per 4096, troncamento): .
- Integrale: ; : . Quindi .
- Duty-cycle: (infatti e ). Assegnato a una
uint16_tsi tiene il resto modulo :DutyCycle.
(Nota: il termine è più grande di 16 bit perché la variabile integrale è a 32 bit; l'assegnazione a 16 bit ne scarta il byte alto. Il testo chiede il valore della variabile a 16 bit: qui si segue questa interpretazione; il dato del testo non precisa se yint1 sia scalato diversamente.)
(b) Duty-cycle effettivo
, cioè 13,8% (il registro di compare vale conteggi su 38400).
(c) Risoluzione
I conteggi per periodo sono : bit effettivi bit. Il passo del duty-cycle è (0,0026%).
(d) Frequenza di modulazione
.
(e) Frequenza per 12 bit effettivi
: (con un timer ordinario a 100 MHz gli stessi 12 bit darebbero solo kHz: è il clock di qualche GHz dei timer ad alta risoluzione a permettere una portante di oltre 500 kHz con 12 bit).
Errori comuni
- Fare lo shift prima della moltiplicazione (si perde tutta la precisione di ).
- Dimenticare che l'assegnazione a
uint16_ttronca ai 16 bit bassi. - Calcolare la frequenza di modulazione con il clock del processore invece che con quello del timer ( GHz).
- Usare i bit effettivi arrotondati: la risoluzione "effettiva" è bit.
Versione ripasso
Testo. Frammento C di un PI per il PWM di un motore in corrente continua: error1 = x1_ref - x1; yp1 = (kp1*error1) >> 12; yint1 += (ki1*error1) >> 16; DutyCycle = yp1 + yint1;, con x1_ref=0x2000, x1=0x0900, yint1=0x0005FF00, , ; periodo del modulatore 38400 cicli, clock del timer 2,304 GHz. Chiede il duty-cycle in esadecimale, il duty effettivo, i bit di risoluzione e le frequenze di modulazione (gennaio 2023).
- Errore: .
- Termine proporzionale: , con
>>12(divisione per 4096) dà . - Termine integrale: , con
>>16dà ;yint1diventa . - DutyCycle: ; assegnato a
uint16_tresta il valore modulo , cioè 5314 . Il byte alto diyint1viene scartato dall'assegnazione. - Duty effettivo: . Risoluzione: bit, passo .
- Frequenza di modulazione: kHz.
- Frequenza per 12 bit effettivi: dà kHz; con un clock di 100 MHz si avrebbero solo 24,4 kHz.
- Errori tipici: fare lo shift prima della moltiplicazione (si perde la precisione di ); dimenticare il troncamento a 16 bit dell'assegnazione; usare il clock del processore invece di quello del timer; arrotondare (Regolatori PI e PID digitaliIl PI digitale è $y(k)=k_p,e(k)+y_I(k)$ con $y_I(k)=k_I',e(k)+y_I(k-1)$ e $k_I'=k_iT_c$ (con una MAC bastano 3 cicli). Nel PID la derivata si calcola come $\frac{k_d}{T_c}[e(k)-e(k-1)]$ ed è sensibile al rumore: si usa la versione filtrata $y_d(k)=\frac{k_d}{T_c+\tau_L}[e(k)-e(k-1)]+\frac{\tau_L}{T_c+\tau_L}y_d(k-1)$ o una media su più campioni. Con la saturazione dell'attuatore serve l'anti-wind-up: $|y_I|\le L(k)=Y_{max}-|k_pe(k)|$. Il controllo dead-beatcontrollo che porta l'errore a zero in un numero finito di passi (predittivo) azzera l'errore in un numero finito di passi ma è poco usato in industria.Regolatori PI e PID digitali →, Modulazione PWM - duty-cycle, risoluzione e demodulazioneLa PWM trasferisce un segnale modulante $V^$ nella larghezza degli impulsi di un'onda quadra a frequenza fissa: con duty-cycle $d=t_1/T$ e livelli $\pm\frac E2$ la media è $V_{med}=(d-\frac12)E=E,\frac{V^}{V_p}$. L'informazione sta nel valor medio; il resto dello spettro (armoniche della portante) si elimina con un passa-basso (demodulazione). Il modulatore digitale è un timer: contatore + comparatore, $N=f_{clk}/f_{PWM}$ conteggi per periodo, risoluzione $n=\log_2N$ bit (massima frequenza per $n$ bit: $f_{clk}/2^n$), registro di compare = duty-cycle. Servono almeno 8 bit per evitare cicli limite.Modulazione PWM - duty-cycle, risoluzione e demodulazione →).