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. PI in C: error1=x1_ref-x1; yp1=(kp1*error1)>>12; yint1+=(ki1*error1)>>16; DutyCycle=yp1+yint1; con x1_ref=0x2000, x1=0x0900, yint1=0x0005FF00, , ; periodo 38400, clock 2,304 GHz (gennaio 2023).
- Calcolo: errore ;
yp1; incremento integrale ,yint1;DutyCycle. - Duty: ; bit effettivi .
- Frequenze: kHz; per 12 bit : kHz.
- Errori: shift prima del prodotto; troncamento a 16 bit dimenticato; clock sbagliato (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 →).