PLL digitale con i timer
In questa pagina 4
Esempio di applicazione dei timer (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 →) di un µC ad alte prestazioni (STM32G474RE, timer ad alta risoluzione HRTIMtimer ad alta risoluzione dello STM32G474): sintetizzare un'onda quadra la cui frequenza sia 11 volte quella di un segnale di riferimento (anch'esso a onda quadra), con frequenza del riferimento tra 4 e 6 kHz (nominale 5 kHz). Il tempo di aggancio deve essere il minimo possibile e l'onda sintetizzata deve restare agganciata in fase al riferimento con il minimo errore consentito dall'hardware ( GHz al massimo).
Il PLL
Un anello ad aggancio di fasecircuito in retroazione che mantiene fase e frequenza di un segnale in relazione fissa con un riferimento regola frequenza e fase di un segnale, ponendole in una relazione nota e costante con quelle di un riferimento (moltiplicatori di frequenza, sintesi di frequenze, sincronizzazione). Analogicamente si realizza con circuiti integrati come il CD4046 (Comunicazione wireless - ASK, OOK, FSK, PLL e antenneMolti µC integrano un trasmettitore RF semplice: PLL che genera la portante a $N$ volte la frequenza di un quarzo, amplificatore (LNA) e antenna con rete di adattamento. Modulazioni digitali: ASK (due livelli di ampiezza), OOK (un livello è zero), FSK (due frequenze). In analogico si usa l'FM con VCO e PLL (CD4046). Il PLL è un anello di retroazione: comparatore di fase, filtro passa-basso, VCO ($k_{VCO}=\frac{f_{max}-f_{min}}{V_{max}-V_{min}}$), divisore per $N$; a regime errore nullo di frequenza e di fase. Antenne a microstriscia: loop (lunghezza $\lesssim\lambda/10$), patch ($f_r\simeq\frac c{2L\sqrt{\varepsilon_r}}$). Standard: Wi-Fi 802.11, Bluetooth 802.15.1, ZigBee 802.15.4 (2,4 GHz, 250 kbit/s, rete mesh, basso consumo).Comunicazione wireless - ASK, OOK, FSK, PLL e antenne →). Ottenere il rapporto tra le frequenze richiesto non è di per sé difficile; la difficoltà è l'aggancio di fase, che richiede che la frequenza del segnale generato sia controllata a catena chiusa. Una realizzazione a catena aperta, a causa dell'inevitabile differenza tra frequenza desiderata e reale, darebbe uno sfasamento continuamente variabile: la differenza di frequenza viene integrata nel tempo e diventa errore di fasedifferenza temporale tra gli istanti di due eventi che dovrebbero coincidere. Un PLLPhase Locked Loop: anello ad aggancio di fase esegue: (1) rilevamento dell'errore di fase; (2) regolazione della frequenza del segnale generato per annullare l'errore di fase con una dinamica controllata. Come ogni retroazione può essere instabile.
Algoritmo di controllo
L'errore di fase è l'intervallo di tempo tra l'evento A (fronte di salita del segnale di sincronismoil segnale di riferimento a cui l'onda generata deve agganciarsi) e l'evento B (fronte di discesa dell'undicesimo impulso generato). Può essere positivo o negativo. Il sistema deve portarlo a zero nel minor tempo, modificando il periodo degli impulsi generati: uno schema in retroazione con ingresso (tempo dell'evento A) meno uscita (tempo dell'evento B), errore , regolatore e periodo .
Primo tentativo: compensare l'errore in un solo periodo. . Esempio: sincronismo con periodo unità arbitrarie, segnali in fase per , : dopo 11 impulsi e (il valore a regime!). Ma al treno successivo l'errore di fase è di nuovo : il sistema non annulla mai l'errore; aumentare la correzione non aiuta. Bisogna separare la compensazione dell'errore istantaneo dalla costruzione del periodo a regime.
Soluzione "in due tempi" (un PIregolatore proporzionale-integrale): , un integratore a tempo discreto, memorizza le correzioni accumulate (il periodo "a regime"); il secondo termine compensa l'errore di fase corrente. Nello stesso esempio: e : il treno successivo dura e recupera esattamente il ritardo di ; l'errore si annulla al treno dopo (per è ) e da lì resta costante: sistema a regime in due treni.
Questo algoritmo è un regolatore PI a tempo discreto con : annulla l'errore in un solo passo ed è detto dead-beat. Deriva dall'allocazione del polo del sistema a catena chiusa nell'origine del piano complesso () (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 →).
Realizzazione con i timer
Un timer funziona in capture (collegato al segnale di sincronismo) e misura il periodo del riferimento; l'altro in compare (match) genera gli impulsi sul pin di uscita e ne fissa il periodo.
- Quando valutare l'errore. Alla fine del treno di 11 impulsi, cioè all'evento B (non all'evento A): così si modifica il periodo sempre all'inizio di una nuova sequenza di 11, come l'algoritmo richiede.
- Tempo di calcolo. Il periodo va aggiornato prima della fine del primo semiperiodo del primo impulso di ogni treno. A regime il tempo a disposizione è s. Nel transitoriofase iniziale in cui l'uscita non ha ancora raggiunto il regime il controllo può imporre frequenze più alte: se la frequenza del riferimento passa da 4 a 6 kHz a gradino, subito dopo il calcolo del periodo, l'errore di fase al termine del treno è s; il nuovo periodo è s (circa 132 kHz), e il calcolo deve concludersi in s: compatibile con la velocità del µC (si verifica con il debugger).
- Errore di fase negativo. In caso di anticipo l'evento B precede A: il tempo dell'evento A non è ancora noto e l'algoritmo userebbe il vecchio valore, generando un errore abnorme. Si ricostruisce il valore corretto sommando il periodo del segnale di sincronismo all'errore trovato (cambiato di segno), e solo se l'errore supera metà del periodo. Per questo si misura sempre il periodo con l'interruzione di captureil timer salva il conteggio quando arriva un evento esterno.
- Ritardo nel rilevare le variazioni del riferimento. Una variazione del periodo di sincronismo si vede solo dopo un periodo: nel caso peggiore l'aggancio ritarda di due sequenze di 11 impulsi; le correzioni fatte con il periodo non aggiornato sono errate e allungano il transitorio. Soluzione: rinunciare al comportamento dead-beatcontrollo che annulla l'errore in un numero finito di passi riducendo i guadagni (in pratica si riduce il guadagno integrale e si aggiusta quello proporzionale): il dead-beat serve a trovare valori plausibili da cui partire. L'aumento di robustezza si paga con una diminuzione di prestazioni dinamiche.
Organizzazione del codice. Con le interruzioni: TIMER_B (capture, base dei tempi, priorità più bassa) misura i periodi del sincronismo; TIMER_A (compareil timer genera un evento quando il conteggio raggiunge un valore programmato, priorità massimala più alta priorità di interruzione, quella servita per prima) genera gli impulsi e a ogni undicesimo impulso esegue l'algoritmo del PLL; il programma principale è un while(1){}. La condizione di intervallo delle ISR è facilmente soddisfatta (la ISR del TIMER_B è molto breve: 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à →). Nel codice l'algoritmo si riduce a poche istruzioni aritmetiche:
SynchError = count_n - count; // tempo(B) - tempo(A) in conteggi
PhaseError = (SynchError > (MeasPeriod>>1)) ? SynchError - MeasPeriod : SynchError;
IntOscPeriod -= (PhaseError<<2)/PLLgain; // integrale (aggiornamento di Pint)
OscPeriod = -(PhaseError<<4)/PLLgain + IntOscPeriod; // periodo con termine proporzionale
// saturazione tra limL e limH, poi scrittura nei registri di periodo e compare di TIMER_ALe parti più gravose in tempo sono gli accessi alle periferiche con le funzioni HAL; i guadagni effettivi nel codice del corso sono diversi da quelli teorici (, quindi non dead-beat). La configurazione di HRTIM si fa con strutture dati (HRTIM_TimeBaseCfgTypeDef e simili) e funzioni di libreria (Microcontrollori STM32 - clock, timer, ADC e codice HALI µC STM32 (core ARM Cortex-M) del corso si configurano con la libreria HAL: si riempiono strutture C (...InitTypeDef) con valori simbolici e si chiamano funzioni di libreria. Clock (STM32F334R8): oscillatore esterno HSE 8 MHz × PLL (MUL9) = SYSCLK 72 MHz (massimo); AHB ÷1, APB1 ÷2 (36 MHz), APB2 ÷1 (72 MHz); clock dell'ADC = clock del bus ÷ divisore (÷6 → 12 MHz). Timer in PWM: $f=f{clk}/((PSC+1)(Period+1))$, Pulse = duty $\times$ conteggi. Toggle: onda quadra a metà della frequenza di match. ADC: SAR a 12 bit, conversioni injected avviate da un trigger del timer, lettura con interruzione.Microcontrollori STM32 - clock, timer, ADC e codice HAL →).
Errori comuni
- Compensare solo l'errore istantaneo: la fase non si annulla mai (serve l'integratoreaccumulatore che somma a ogni passo un nuovo termine).
- Valutare l'errore all'evento A invece che all'evento B.
- Dimenticare la correzione di un errore di fase che supera metà periodo del riferimento.
- Voler mantenere il comportamento dead-beat con un riferimento a frequenza variabile.
Versione ripasso
- Problema: onda a la frequenza del riferimento (4-6 kHz), aggancio di fase con errore minimo; HRTIM 5,44 GHz.
- Errore di fase: = tempo(B) − tempo(A), B = fronte di discesa dell'undicesimo impulso.
- Solo proporzionale non basta: lascia l'errore costante. PI "in due tempi": , → dead-beat (, polo in ).
- Timer: capture (periodo del riferimento) + compare (impulsi, priorità massima); valutare all'evento B; tempo di calcolo µs, caso 4→6 kHz: µs (132 kHz), 3,79 µs.
- Correzioni: errore ricostruito con se oltre mezzo periodo; ritardo di un periodo → ridurre i guadagni (non dead-beat).
- Errori: solo errore istantaneo; evento A; niente ricostruzione; dead-beat con riferimento variabile (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 →).