Quantizzazione, fattori di scala e cicli limite
In questa pagina 6
La progettazione di un controllore o filtro numerico (Filtri numerici IIR e FIRUn filtro numerico è una equazione alle differenzerelazione che dà il campione di uscita in funzione di campioni di ingresso e di uscita passati $y(k)=\sum_ib_ix(k-i)+\sum_ia_iy(k-i)$. IIR (ricorsivo: qualche $a_i\ne0$) ha risposta impulsiva infinita e bastano pochi termini; FIR (tutti $a_i=0$) è sempre stabile ma richiede molti termini. Il passa-basso IIR del primo ordine $y(k)=b,x(k)+a,y(k-1)$ con $a+b=1$ ha guadagno 1 ed è stabile se $|a|<1$; la risposta al gradino è $y(k)=1-a^{k+1}$. Il filtro analogico equivalente (Eulero) ha $\tau=\dfrac{a,T_c}{1-a}$ e $f_T=\dfrac1{2\pi\tau}$. La media mobile di $N$ campioni è un FIR passa-basso che si assesta in $N$ passi.Filtri numerici IIR e FIR →, 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 →) si fa, in prima battuta, assumendo il processore ideale. In realizzazione contano la sua aritmetica, la lunghezza di parola e le prestazioni delle periferiche (per esempio l'ADC): limitano la qualità e possono costringere a riprogettare. I problemi nascono da (uno o più, anche insieme): temporizzazione, acquisizione dei dati, fattori di scala, quantizzazione in ingresso e uscita, precisione finita dell'aritmetica, cicli limite.
Temporizzazione
La distribuzione nel tempo delle operazioni è critica: le prestazioni di un filtro o controllo dipendono dalla frequenza di campionamento e il requisito minimo è che, fissata, resti costante (la teoria elementare dei sistemi campionati assume questo). Con un ADC on chip è facile: spesso lavora in modo autonomo e continuo grazie a un timer interno, oppure in modalità triggeredavviato da un segnale di trigger esterno o da un altro modulo del chip (parte con un segnale di avvio, necessaria per sincronizzare la conversione con altri eventi: per esempio un timer o un PWM come sorgente di trigger).
La velocità di conversione dell'ADC (oggi spesso µs) pone il limite superiore a ; il limite inferiore è dato dalla dinamica del processo o dalla banda richiesta al filtro. La tendenza è porre al valore più alto consentito dall'ADC, ma non sempre è la scelta migliore. Il metodo più usato: si mette l'algoritmo dentro la ISR dell'ADC, che genera una interruzione a fine conversione. Programma principale: dopo l'inizializzazione, while(1){}; il filtro o regolatore vive nella ISR. Requisito: la durata della ISR, con le latenze e le ISR a priorità maggiore, deve essere minore del periodo di campionamento, altrimenti si perdono dati e il calcolo non procede a frequenza costante (Sistemi di interruzioni - latenza, nesting e sostenibilitàCon $N$ sorgenti, ciascuna ISR $i$ ha durata $T_{d,i}$ (spesso già comprensiva della latenza intrinseca $T_{LI}$ e dell'istruzione in corso) e periodo minimo $T_{p,i}$. Condizione necessaria: $\sum_iT_{d,i}/T_{p,i}<1$ (la percentuale di impegno della CPU è la somma). Condizione di intervallo per ogni $i$ (priorità 1 = massima): $T_{d,i}+\sum_{k<i}n_k,T_{d,k};[+\max(T_{RC},\max_{j>i}T_{d,j})\text{ senza nesting}]\le T_{p,i}$, con $n_k=\lceil T_{p,i}/T_{p,k}\rceil$. Latenza massima della priorità $n$: con nesting $T_{LI}+\sum_{i<n}T_{ex,i}$; senza nesting si aggiunge $\max_{j>n}T_{ex,j}$.Sistemi di interruzioni - latenza, nesting e sostenibilità →); all'ADC conviene associare l'interruzione di priorità più alta. La durata reale di un segmento si misura con un pin di I/O e un oscilloscopio.
Acquisizione e condizionamento
Un trasduttore è collegato all'ADC con un circuito di condizionamento (di solito con amplificatori operazionali) che deve: a. adattare il livello del segnale al fondo scala dell'ADC; b. filtrare per eliminare rumore e impedire l'aliasing (Campionamento, aliasing e sample and holdCampionare vuol dire prendere i valori di $s(t)$ a istanti $kT_c$ ($T_c$ periodo, $f_c=1/T_c$). Teorema di Shannon: se lo spettro è nullo sopra $BW$, $s(t)$ si ricostruisce esattamente da campioni con $f_c\ge2BW$. Lo spettro campionato è la replica periodica (ogni $f_c$) dello spettro originale; se $f_c<2BW$ le repliche si sovrappongono: aliasing (una sinusoide a $f$ campionata a $1{,}25f$ appare a $0{,}25f$). Si previene con un filtro anti-aliasing sotto $f_c/2$ e col sovracampionamento. Il sample and holdcircuito che campiona il segnale e lo mantiene costante durante la conversione tiene il segnale costante durante la conversione.Campionamento, aliasing e sample and hold →). Un circuito tipico (differenziale con filtro) ha : permette l'acquisizione differenziale o single-ended, la somma di un offsetvalore costante sommato al segnale, per esempio per portarlo tutto in tensioni positive (utile per segnali con segno: per esempio un segnale di V attenuato di 2 e sommato a 2,5 V entra in un ADC con FSR 5 V), amplificazione o attenuazione, filtraggio passa-basso, e ha una bassa resistenza di uscita (nessun effetto di carico). Si completa con strutture di protezione (diodi Schottkydiodi con bassa caduta di tensione, usati come protezione degli ingressi verso l'alimentazione) che limitano le escursioni entro i livelli ammessi.
Per sfruttare al meglio la parola dell'ADC, il massimo valore atteso della grandezza (con un margine per rivelare condizioni anomale) deve coincidere con il massimo codice dell'ADC. Dato che la parola del processore ha più bit di quella dell'ADC, l'allineamento può essere: a destra (gli LSB coincidono: normalizzazione intera) o a sinistra (gli MSB coincidono: normalizzazione frazionaria, 1.15 su 16 bit, facendo attenzione al segno). Un dato a 12 bit allineato a sinistra su 16 bit è .
Fattori di scala
Il problema esiste solo per processori a virgola fissa (Operazioni in virgola fissa - somma, prodotto e riallineamentoIn virgola fissa il processore opera sugli interi e non sa dov'è la virgola: tocca al programmatore. Regola 1: si sommano solo dati con lo stesso formato (stesso $m$). Regola 2: il prodotto di $n_1.m_1$ per $n_2.m_2$ ha $m_1+m_2$ bit frazionari e il doppio dei bit: va riallineato con uno shift a destra di $m_2$ posizioni (per riportarlo a $m_1$) o preso dalla parte alta. Con la normalizzazione frazionaria $1.15$ il prodotto è $2.30$ e basta uno shift a sinistra di 1 prima di prendere la parte alta. I fattori di scala si scelgono per evitare overflow e perdita di risoluzione.Operazioni in virgola fissa - somma, prodotto e riallineamento →). Una scelta errata porta o a un cattivo sfruttamento dell'aritmetica (quantizzazione) oppure a overflow o saturazione, che di solito rendono il codice inutilizzabile. Il problema è serio nei sistemi di controllo perché influisce sul guadagno della catena e può addirittura rendere instabile il sistema anche con un regolatore ben progettato (coefficienti con valori molto diversi, ).
- Normalizzazione intera: intuitiva ma i coefficienti vanno premoltiplicati per e ogni prodotto va seguito da uno shift a destra di .
- Normalizzazione frazionaria 1.15: i coefficienti frazionari non danno problemi, il prodotto di due frazioni non va mai in overflowvalore fuori dall'intervallo rappresentabile; gli interi si gestiscono con fattori di scala (, poi ×4). Il prodotto 1.15 × 1.15 è 2.30 e va shiftato a sinistra di 1 per essere un 1.31, di cui si usa la parte alta (16 bit). Il formato va dichiarato nel codice.
Overflow. Non deve mai verificarsi in una routine di filtro o regolatore. Per le variabili che accumulano (la parte integrale di un PI) si usano talvolta parole doppie (l'accumulatoreregistro che raccoglie somme e prodotti, spesso largo il doppio della parola, spesso largo il doppio, si salva con due locazioni; nella somma con un dato a parola singola si usa solo la parte alta se si lavora in 1.15). Alcuni processori hanno l'aritmetica saturatail risultato fuori intervallo è sostituito dal massimo o dal minimo: in caso di overflow il risultato è sostituito dal massimo (0x7FFF) o dal minimo (0x8000); equivale a un blocco non lineare dopo ogni somma, di effetti non facilmente prevedibili (si ricorre alla simulazione).
Quantizzazione
In virgola fissa gli effetti di quantizzazione intervengono in più punti: (a) conversione A/D dei dati; (b) calcolo dei coefficienti di filtri e regolatori; (c) prodotti, quando il risultato è troncato o arrotondato; (d) trasformazione del risultato in un segnale (DAC). Introducono non linearità il cui impatto è difficile da prevedere sulla carta (esistono metodi analitici ma di difficile applicazione): si usa la simulazione (per esempio il Fixed Point Blockset di Simulink). Il caso peggiore è quello dei sistemi a catena chiusa.
Un quantizzatore "lineare" associa a ogni con il numero ; è il passo di quantizzazionela distanza tra due livelli consecutivi del quantizzatore, cioè 1 LSB ( LSB) e gli intervalli larghi sono i bin.
- Ingresso (ADC). La parola dell'ADC è molto più corta di quella del processore, quindi il peso di nell'aritmetica interna è maggiore di 1 LSB. In un controllo a catena chiusa il suo effetto è un errore a regime (per riferimento costante) fino a , non compensabile: deve essere minore del massimo errore tollerabile (criterio di scelta dell'ADC).
- Uscita. La quantizzazione in uscita (DAC o comando di un trasduttore) crea un errore a regimeerrore che resta dopo che il transitorio si è esaurito e può dare origine a un ciclo limite.
- Coefficienti. L'arrotondamento dei coefficienti sposta i poli del filtro o del regolatore. Esempio: filtro con su 8 bit (1.7): , cioè , e . Il tempo di salita al 90% passa da a campioni: +28%.
Paradosso della frequenza di campionamento. Se si riduce a 1/5 il tempo di salita richiesto (in campioni) scende a circa un quinto: , : 44,9 campioni contro 48,0 (+7%): l'errore è 4 volte minore. L'aumento di non sempre migliora filtro o regolatore, perché rende più critica la quantizzazione dei coefficienti: alte frequenze di campionamento richiedono lunghezze di parola maggiori.
- Prodotti. Il prodotto di due numeri a bit ha bit; riportarlo a bit (parte alta) è un troncamento (o arrotondamento) interno all'algoritmo, quindi una quantizzazione per ogni moltiplicazione: il numero di non linearitàcomportamento in cui l'uscita non è proporzionale all'ingresso cresce rapidamente (si pensi a un FIR) e lo studio si fa solo per simulazione.
Cicli limite
Nei sistemi a catena chiusa la precisione finita può indurre oscillazioni persistenti dei bit meno significativi del risultato: i cicli limite (limit cycles). I filtri FIR, non avendo retroazione interna, ne sono protetti (ma se un FIR è usato come regolatore in un anello chiuso, i cicli limite possono comparire). La teoria (metodo di Tsypkin, funzione descrittiva) è applicabile solo a casi semplici: in pratica si usa la simulazione e si cerca la quantizzazione responsabile. Con processori a 16 bit i cicli limite aritmetici sono rari e si confinano nei bit bassi; se l'uscita (o il DAC) ha meno bit del processore, un allineamento opportuno scarta i bit corrotti.
Anche con un algoritmo ideale, la risoluzione finita dell'uscita (per esempio il duty-cycle del PWM) può rendere impossibile raggiungere il punto di equilibrio: se il processo non ha un integratore, il ciclo limiteoscillazione persistente di piccola ampiezza causata dalla quantizzazione è a frequenza nulla (errore permanente rispetto al set-pointvalore di riferimento che l'uscita deve raggiungere); se ha almeno un integratore si ha un'oscillazione persistente tra i due valori di uscita più vicini all'equilibrio, a causa dell'integrazione dell'errore da parte del processo. È tipico dei controlli PWM digitali: se il duty-cycle di equilibrio non coincide con uno dei valori possibili (per esempio con 8 bit) si oscilla tra e . Perciò è importante una buona risoluzione sul duty-cycle (almeno 8 bit) (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 →).
Errori comuni
- Alzare senza controllare i coefficienti: si avvicinano a 0 e a 1 e la quantizzazione sposta i poli.
- Non sfruttare l'intera parola dell'ADC (segnale che occupa metà del fondo scala: si perde 1 bit di SNR).
- Dimenticare l'overflow nella parte integrale.
- Credere che la quantizzazione sia sempre un rumore piccolo e innocuo in un anello chiuso: può dare errore a regime e cicli limite.
Versione ripasso
- Temporizzazione: costante; algoritmo nella ISR dell'ADC (priorità massima), ; ADC triggered da timer/PWM.
- Condizionamento: adattamento al fondo scala (offset, guadagno), filtro anti-aliasing, protezioni; allineamento a destra (intero) o sinistra (frazionario, ).
- Scale: intera (coefficienti premoltiplicati e shift) o 1.15 (prodotto 2.30, parte alta); evitare overflow (accumulatori doppi, saturazione).
- Quantizzazione: ADC (errore a regime fino a ), uscita (cicli limite), coefficienti (poli spostati: in 1.7 → +28% sul tempo di salita; con solo +7%), prodotti (troncamento).
- Cicli limite: oscillazioni degli LSB nei sistemi chiusi (FIR esente); PWM: servono bit di duty-cycle; senza integratore nel processo errore costante, con integratore oscillazione.
- Errori: troppo alta; ADC sottoutilizzato; overflow nell'integrale; quantizzazione "innocua" (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 →).
Esercizi su questo argomento
- Esercizio 14 · sensore e convertitore A-D, allineamento a 16 bit, offset e tempo di calcolo (temi d'esame gennaio 2022, gennaio 2025, febbraio 2025 e settembre 2026)
- Esercizio 21 · controllo digitale della velocità di un motore con regolatore PI, scale, timer e trasmissione seriale (tema d'esame 3 settembre 2020)
- Esercizio 28 · programmazione degli STM32 con la HAL e quesiti di linguaggio C (temi d'esame gennaio 2021, gennaio 2022, febbraio 2022, febbraio 2025 e 2020-21)
- Esercizio 30 · istruzione MAC con accumulatore a 32 bit e arrotondamento (tema d'esame luglio 2020)
- Esercizio 31 · sistema di controllo di un ascensore con microcontrollore a 8 bit (tema d'esame 18 luglio 2006)
Teoria collegata
- Filtri numerici IIR e FIR
- Formulario - elettronica industriale
- Microcontrollori STM32 - clock, timer, ADC e codice HAL
- Modulazione PWM - duty-cycle, risoluzione e demodulazione
- Operazioni in virgola fissa - somma, prodotto e riallineamento
- Realizzare un filtro o un regolatore a virgola fissa
- Regolatori PI e PID digitali