Esercizio 21controllo digitale della velocità di un motore con regolatore PI, scale, timer e trasmissione seriale (tema d'esame 3 settembre 2020)
In questa pagina 4
Testo (tema d'esame del 3 settembre 2020, quarto appello, problemi 4.1-4.3). Un microcontrollore con aritmetica a 32 bit esegue la regolazione di velocità di un motore con un regolatore PI, nel codice
err_V = REFV - (YADC - 0x8000);
yI(k) = KI*err_V + yI(k-1);
REFC(k) = KP*err_V + yI(k);
yI(k-1) = yI(k);La velocità è misurata da un trasduttore analogico con guadagno V/rpm, segnale con segno tra V e V. Il fondo scala del convertitore A/D (a 12 bit) è 5 V; per adattare il segnale, prima della conversione, viene attenuato di un fattore 2 e sommato a un offset di 2,5 V. Il valore convertito è poi riportato su 16 bit con l'allineamento a sinistra dei due MSB e salvato in YADC.
4.1 (a) valore di fondo scala della velocità; (b) velocità quando e di quanto può cambiare al massimo senza che il valore convertito cambi (profilo di quantizzazione LSB, 1 LSB, 1 LSB, ...); (c) rappresentazione esadecimale di un set-point REFV di rpm; (d) la rappresentazione più conveniente di err_V (frazionaria senza segno, frazionaria con segno, intera, di tipo 4.12); (e) e con normalizzazione senza segno 1.15 per e 0.16 per : codici esadecimali ed errori; (f) servono aggiustamenti del punto decimale a valle di se anche è frazionaria con segno su 32 bit? (g) in caso affermativo quali? (h) valore di (16 bit frazionario con segno) se REFV fissa rpm, il motore è fermo e .
4.2 Il codice è eseguito a 300 Hz da un timer (TMR0) con clock di sistema 4 MHz, divisore di frequenza e registro di match a 16 bit: valori di prescale e match; azioni del timer al match.
4.3 Il valore REFC viene trasmesso via seriale a un DAC a 19200 bit al secondo, senza parità, con un bit di start e uno di stop: tempo per un dato, frequenza di clock del trasmettitore, prescaler.
Teoria usata: Quantizzazione, fattori di scala e cicli limiteUn algoritmo di filtro o regolatore pensato per un processore ideale va adattato alla realtà: temporizzazionedistribuzione nel tempo delle operazioni di un algoritmo (l'algoritmo nella ISR dell'ADC, durata minore di $T_c$), acquisizione (condizionamento del segnale per sfruttare tutto il fondo scala dell'ADC), fattori di scala (normalizzazione intera o 1.15; evitare overflow), quantizzazione di ingresso, uscita, coefficienti e prodotti (sposta i poli, genera errori a regime e cicli limite). Una frequenza di campionamento troppo alta rende più critica la quantizzazione dei coefficienti: va scelta coerente con la lunghezza di parola.Quantizzazione, fattori di scala e cicli limite →, 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 →, Timer - prescaler, compare, capture e watchdogUn timer è un contatore binario di periodi di clock: $f_{cont}=f_{clk}/PSC$ ($PSC$ = fattore del prescaler). In modalità compare/match genera un evento (interruzione, reset del conteggio, azione su un pin) quando il conteggio raggiunge il registro di match: per un evento ogni $T$ servono $N=T,f_{clk}/PSC\le2^{16}$ conteggi, e si prende il minimo $PSC$ (massima risoluzione). Con uscita in modo toggle la frequenza dell'onda quadra è metà di quella degli eventi, il duty-cycle 50%. In modalità capture il valore del contatore, salvato a due fronti, dà il periodo: $T=C_2-C_1$ (corretto anche con un overflow), risoluzione $1/f_{clk}$. Il watchdog reinizializza il sistema se non viene azzerato in tempo.Timer - prescaler, compare, capture e watchdog →, Comunicazione seriale - UART, RS232, RS422 e RS485La trasmissione serialeche trasmette i bit uno dopo l'altro su una sola linea invia un bit alla volta su pochi fili. Asincrona (UART): senza clock comune, ogni dato è inquadrato da 1 bit di start, 5-8 bit di dati, parità opzionale e 1-2 bit di stop; per 8 bit di dati servono 10 bit sulla linea (efficienza 80%); tempo di bit $BT=1/bps$; il ricevitore campiona a $1{,}5,BT,2{,}5,BT,\dots$ dal fronte di start e tollera uno scostamento di frequenza di circa $\pm5{,}3%$ (o $4{,}6%$ con campionamento a 16×). Sincrona: il trasmettitore invia anche il clock (e il frame sync), efficienza 100%. Livelli fisici: RS232 ($\pm12$ V, 1 = $-12$ V), RS422/RS485 (differenziale, doppino, 10 Mbit/s su $<15$ m; RS485 multi-trasmettitore), loop di corrente 0-20 mA.Comunicazione seriale - UART, RS232, RS422 e RS485 →.
4.1 Regolatore PI
(a) Fondo scala. Il trasduttore dà V: . L'attenuazione di 2 e l'offset di 2,5 V portano V in V: .
(b) . Allineato a sinistra su 16 bit: il codice del convertitore è del fondo scala: V. Il trasduttore ha V, cioè . Intervallo: con un ADC a 12 bit un LSB vale sulla scala della velocità: con il profilo LSB la velocità può cambiare al massimo di un LSB senza che il codice cambi: .
(c) Set-point. rpm V V . Nel codice l'ingresso al regolatore è (si toglie l'offset di metà scala: valore con segno nel campo ): in complemento a 2 su 16 bit. REFV (cioè su 32 bit).
(d) Rappresentazione di err_V: è la differenza di due grandezze con segno, quindi frazionaria con segno (1.15 S).
(e) Coefficienti. in 1.15 U: , . in 0.16 U: , .
(f)-(g) Aggiustamento del punto. err_V ha 15 bit frazionari (), ne ha 16: ha bit frazionari, cioè è già nel formato 1.31 S di una variabile a 32 bit frazionaria con segno. Quindi per non servono aggiustamenti: No. (Per con bit frazionari occorrerebbe invece uno shift a sinistra di 1 per sommare a in 1.31, e poi la parte alta per scendere a 16 bit.)
(h) . Velocità richiesta rpm: V, V, del riferimento ; il codice dell'errore è (, in 1.15 S vale ). Il motore è fermo: , V, , . Quindi (codice ). Parte integrale: (1.31 S: ); parte proporzionale: (), portata a 1.31 con : ; somma: (1.31 S, vale ); in 16 bit frazionari con segno (parte alta, ): (valore , calcolo ideale ✓).
4.2 Timer
Il clock di sistema è 4 MHz e si vuole un evento a 300 Hz: conteggi totali (), quindi il prescaler minimo è 1: (fattore di divisione 1) e ; la frequenza ottenuta è Hz. Azioni al match: arresto del conteggio No (free-run), reset del conteggio Sì (riparte da 0), generazione di interrupt Sì (l'algoritmo gira nella ISR), asserimento del pin di I/O No.
4.3 Trasmissione seriale
Ogni dato REFC è a 16 bit: due byte, ciascuno con start e stop, cioè bit sulla linea. Tempo: . Clock del trasmettitore: (campionamento a 16×). Prescaler: (baud effettivo bps, errore ).
(La parte 4.4 sulle interruzioni e il quesito in C sono nell'esercizio 12 e nell'esercizio 28.)
Errori comuni
- Dimenticare che il dato dell'ADC ha offset di metà scala:
YADC - 0x8000è il dato con segno. - Scrivere
REFVcome senza applicare la stessa conversione (attenuazione e offset) del segnale misurato. - Aggiustare il punto decimale con uno shift superfluo: il prodotto è già in 1.31.
- Confondere la durata di un byte (10 bit) con quella del dato da 16 bit trasmesso come due byte (20 bit).
Versione ripasso
Testo. PI di velocità con ADC a 12 bit e conversione , YADC a 16 bit allineato a sinistra; timer a 300 Hz da 4 MHz; seriale a 19200 bps (3 settembre 2020).
- Velocità: FS rpm;
YADC=0x4000→ rpm, rpm; rpm →YADC=0x3333,REFV=0xB333. - Coefficienti: (), (); già in 1.31 S: nessun aggiustamento.
- (+1000 rpm, motore fermo): (), .
- Timer:
PRSC=0x0001,MATCH=0x3415(13333): reset e interrupt sì, arresto e pin no. - Seriale: 20 bit = 1042 µs; clock 307,2 kHz; prescaler 13 .
- Errori: offset di metà scala dimenticato;
REFVsenza conversione; shift superfluo; byte contro dato (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 →).