Salta al contenuto
Note per Studenti PLL digitale con i timer

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 (fHRTIM=5,44f_{HRTIM}=5{,}44 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 ϵ\epsilon 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 Δϕ\Delta\phi è 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 PP degli impulsi generati: uno schema in retroazione con ingresso (tempo dell'evento A) meno uscita (tempo dell'evento B), errore Δϕ\Delta\phi, regolatore e periodo PP.

Primo tentativo: compensare l'errore in un solo periodo. P(k+1)=P(k)+Δϕ(k)11P(k+1)=P(k)+\dfrac{\Delta\phi(k)}{11}. Esempio: sincronismo con periodo PS=11P_S=11 unità arbitrarie, segnali in fase per t=0t=0, P(k)=0,9P(k)=0{,}9: dopo 11 impulsi Δϕ(k)=11−9,9=1,1\Delta\phi(k)=11-9{,}9=1{,}1 e P(k+1)=0,9+0,1=1,0P(k+1)=0{,}9+0{,}1=1{,}0 (il valore a regime!). Ma al treno successivo l'errore di fase è di nuovo 1,11{,}1: 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): Pint(k)=Pint(k−1)+Δϕ(k)11,P(k+1)=Pint(k)+Δϕ(k)11.P_{int}(k)=P_{int}(k-1)+\frac{\Delta\phi(k)}{11},\qquad P(k+1)=P_{int}(k)+\frac{\Delta\phi(k)}{11}. PintP_{int}, 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: Pint(0)=0,9+0,1=1,0P_{int}(0)=0{,}9+0{,}1=1{,}0 e P(1)=1,0+0,1=1,1P(1)=1{,}0+0{,}1=1{,}1: il treno successivo dura 11⋅1,1=12,111\cdot1{,}1=12{,}1 e recupera esattamente il ritardo di 1,11{,}1; l'errore si annulla al treno dopo (per k=1k=1 è 22−22=022-22=0) e da lì P=Pint=1,0P=P_{int}=1{,}0 resta costante: sistema a regime in due treni.

Questo algoritmo è un regolatore PI a tempo discreto con kp=kI′=111k_p=k_I'=\frac1{11}: 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 (z=0z=0) (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 è PS,min22=16000⋅22=7,58 μ\frac{P_{S,min}}{22}=\frac1{6000\cdot22}=7{,}58\ \mus. 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 è 16 kHz−14 kHz=−83,33 μ\frac1{6\text{ kHz}}-\frac1{4\text{ kHz}}=-83{,}33\ \mus; il nuovo periodo è P(k+1)=144 kHz−2⋅83,33 μs11=22,73−15,15=7,58 μP(k+1)=\frac1{44\text{ kHz}}-\frac{2\cdot83{,}33\ \mu\text{s}}{11}=22{,}73-15{,}15=7{,}58\ \mus (circa 132 kHz), e il calcolo deve concludersi in P(k+1)2=3,79 μ\frac{P(k+1)}2=3{,}79\ \mus: 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 TMT_M 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 TMT_M 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:

c
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_A

Le 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 (kp≠kI′k_p\ne k_I', 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

Esercizi su questo argomento

Teoria collegata