Salta al contenuto
Note per Studenti Esercizio 21 · controllo digitale della velocità di un motore con regolatore PI, scale, timer e trasmissione seriale (tema d'esame 3 settembre 2020)

Esercizio 21controllo digitale della velocità di un motore con regolatore PI, scale, timer e trasmissione seriale (tema d'esame 3 settembre 2020)

Esame
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

c
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 2⋅10−32\cdot10^{-3} V/rpm, segnale con segno tra −5-5 V e +5+5 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 YADC=0x4000YADC=\texttt{0x4000} e di quanto può cambiare al massimo senza che il valore convertito cambi (profilo di quantizzazione 12\frac12 LSB, 1 LSB, 1 LSB, ...); (c) rappresentazione esadecimale di un set-point REFV di −1500-1500 rpm; (d) la rappresentazione più conveniente di err_V (frazionaria senza segno, frazionaria con segno, intera, di tipo 4.12); (e) KP=1,35K_P=1{,}35 e KI=0,23K_I=0{,}23 con normalizzazione senza segno 1.15 per KPK_P e 0.16 per KIK_I: codici esadecimali ed errori; (f) servono aggiustamenti del punto decimale a valle di yI(k)y_I(k) se anche yIy_I è frazionaria con segno su 32 bit? (g) in caso affermativo quali? (h) valore di REFC(1)REFC(1) (16 bit frazionario con segno) se REFV fissa +1000+1000 rpm, il motore è fermo e yI(0)=0y_I(0)=0.

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à ±5\pm5 V: ωmax=5 V2⋅10−3 V/rpm=±2500 rpm\omega_{max}=\frac{5\ \text{V}}{2\cdot10^{-3}\ \text{V/rpm}}=\pm\mathbf{2500\ rpm}. L'attenuazione di 2 e l'offset di 2,5 V portano [−5,+5][-5,+5] V in [0,5][0,5] V: VADC=VT2+2,5V_{ADC}=\frac{V_T}2+2{,}5.

(b) YADC=0x4000\texttt{YADC}=\texttt{0x4000}. Allineato a sinistra su 16 bit: il codice del convertitore è 0x400065536=0,25\frac{\texttt{0x4000}}{65536}=0{,}25 del fondo scala: VADC=0,25⋅5=1,25V_{ADC}=0{,}25\cdot5=1{,}25 V. Il trasduttore ha VT=2 (VADC−2,5)=2 (−1,25)=−2,5V_T=2\,(V_{ADC}-2{,}5)=2\,(-1{,}25)=-2{,}5 V, cioè ω=−2,52⋅10−3=−1250 rpm\omega=\frac{-2{,}5}{2\cdot10^{-3}}=\mathbf{-1250\ rpm}. Intervallo: con un ADC a 12 bit un LSB vale 5000 rpm4096=1,22 rpm\frac{5000\text{ rpm}}{4096}=\mathbf{1{,}22\ rpm} sulla scala della velocità: con il profilo 12,1,1,…\frac12,1,1,\dots LSB la velocità può cambiare al massimo di un LSB senza che il codice cambi: Δω=1,22 rpm\Delta\omega=\mathbf{1{,}22\ rpm}.

(c) Set-point. ω=−1500\omega=-1500 rpm →VT=−3\to V_T=-3 V →VADC=−1,5+2,5=1\to V_{ADC}=-1{,}5+2{,}5=1 V →YADC=15⋅65536=13107=0x3333\to\texttt{YADC}=\frac1{5}\cdot65536=13107=\texttt{0x3333}. Nel codice l'ingresso al regolatore è YADC−0x8000\texttt{YADC}-\texttt{0x8000} (si toglie l'offset di metà scala: valore con segno nel campo [−32768,+32767][-32768,+32767]): 0x3333−0x8000=−19661=0xB333\texttt{0x3333}-\texttt{0x8000}=-19661=\mathbf{0xB333} in complemento a 2 su 16 bit. REFV =0xB333=\texttt{0xB333} (cioè 0xFFFFB333\texttt{0xFFFFB333} su 32 bit).

(d) Rappresentazione di err_V: è la differenza di due grandezze con segno, quindi frazionaria con segno (1.15 S).

(e) Coefficienti. KP=1,35K_P=1{,}35 in 1.15 U: round(1,35⋅32768)=44237=0xACCD\mathrm{round}(1{,}35\cdot32768)=44237=\mathbf{0xACCD}, ε=+6,1⋅10−6\varepsilon=+6{,}1\cdot10^{-6}. KI=0,23K_I=0{,}23 in 0.16 U: round(0,23⋅65536)=15073=0x3AE1\mathrm{round}(0{,}23\cdot65536)=15073=\mathbf{0x3AE1}, ε=−4,3⋅10−6\varepsilon=-4{,}3\cdot10^{-6}.

(f)-(g) Aggiustamento del punto. err_V ha 15 bit frazionari (m=15m=15), KIK_I ne ha 16: KI⋅err_VK_I\cdot err\_V ha 16+15=3116+15=31 bit frazionari, cioè è già nel formato 1.31 S di una variabile a 32 bit frazionaria con segno. Quindi per yIy_I non servono aggiustamenti: No. (Per KP⋅err_VK_P\cdot err\_V con m=15+15=30m=15+15=30 bit frazionari occorrerebbe invece uno shift a sinistra di 1 per sommare a yIy_I in 1.31, e poi la parte alta per scendere a 16 bit.)

(h) REFC(1)REFC(1). Velocità richiesta +1000+1000 rpm: VT=+2V_T=+2 V, VADC=1+2,5=3,5V_{ADC}=1+2{,}5=3{,}5 V, YADC\texttt{YADC} del riferimento =3,55⋅65536=45875=0xB333=\frac{3{,}5}5\cdot65536=45875=\texttt{0xB333}; il codice dell'errore è REFV=0xB333−0x8000=0x3333\texttt{REFV}=\texttt{0xB333}-\texttt{0x8000}=\texttt{0x3333} (=13107=13107, in 1.15 S vale 0,40{,}4). Il motore è fermo: VT=0V_T=0, VADC=2,5V_{ADC}=2{,}5 V, YADC=0x8000\texttt{YADC}=\texttt{0x8000}, YADC−0x8000=0\texttt{YADC}-\texttt{0x8000}=0. Quindi err_V=0,4err\_V=0{,}4 (codice 1310713107). Parte integrale: yI(1)=KI err_V=15073⋅13107=197 561 811y_I(1)=K_I\,err\_V=15073\cdot13107=197\,561\,811 (1.31 S: 0,0920{,}092); parte proporzionale: KP err_V=44237⋅13107=579 814 359K_P\,err\_V=44237\cdot13107=579\,814\,359 (2.302.30), portata a 1.31 con ≪1\ll1: 1 159 628 7181\,159\,628\,718; somma: 1 357 190 5291\,357\,190\,529 (1.31 S, vale 0,6320{,}632); in 16 bit frazionari con segno (parte alta, ≫16\gg16): 20709=0x50E5\mathbf{20709=0x50E5} (valore 0,6320{,}632, calcolo ideale 1,35⋅0,4+0,23⋅0,4=0,6321{,}35\cdot0{,}4+0{,}23\cdot0{,}4=0{,}632 ✓).

4.2 Timer

Il clock di sistema è 4 MHz e si vuole un evento a 300 Hz: conteggi totali 4 MHz300=13333,3\frac{4\ \text{MHz}}{300}=13333{,}3 (<65536<65536), quindi il prescaler minimo è 1: PRSC=0x0001\texttt{PRSC}=\mathbf{0x0001} (fattore di divisione 1) e MATCH=round(13333,3)=13333=0x3415\texttt{MATCH}=\mathrm{round}(13333{,}3)=13333=\mathbf{0x3415}; la frequenza ottenuta è 4 MHz13333=300,0075\frac{4\text{ MHz}}{13333}=300{,}0075 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è 2⋅10=202\cdot10=20 bit sulla linea. Tempo: 2019200=1042 μs\frac{20}{19200}=\mathbf{1042\ \mu s}. Clock del trasmettitore: 16⋅19200=307,2 kHz16\cdot19200=\mathbf{307{,}2\ kHz} (campionamento a 16×). Prescaler: 4 MHz307,2 kHz=13,02→13=0x000D\frac{4\ \text{MHz}}{307{,}2\ \text{kHz}}=13{,}02\to\mathbf{13=0x000D} (baud effettivo 4 MHz/13/16=192314\text{ MHz}/13/16=19231 bps, errore 0,16%0{,}16\%).

(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 REFV come −1500-1500 senza applicare la stessa conversione (attenuazione e offset) del segnale misurato.
  • Aggiustare il punto decimale con uno shift superfluo: il prodotto 0.16×1.150.16\times1.15 è 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 VADC=VT/2+2,5V_{ADC}=V_T/2+2{,}5, YADC a 16 bit allineato a sinistra; timer a 300 Hz da 4 MHz; seriale a 19200 bps (3 settembre 2020).

Esercizi su questo argomento

Teoria collegata