Sommario:

Controller PID VHDL: 10 passaggi
Controller PID VHDL: 10 passaggi

Video: Controller PID VHDL: 10 passaggi

Video: Controller PID VHDL: 10 passaggi
Video: Lecture 73: Digital PID Control Implementation using Verilog HDL Programming 2024, Luglio
Anonim
Controllore PID VHDL
Controllore PID VHDL
Controllore PID VHDL
Controllore PID VHDL

Questo progetto è stato il mio progetto finale per completare la mia laurea con lode presso il Cork Institute of Technology. Questo tutorial è suddiviso in due sezioni la prima riguarderà il corpo principale del codice PID che è lo scopo principale del progetto e la seconda sezione riguarda l'interfacciamento del codice che è stato implementato su una scheda di sviluppo Basys 3 e quindi interfacciato a una pallina da ping pong impianto di levitazione. Il rig teorico e costruito sono mostrati nelle immagini allegate.

Forniture

Simulazione

Vivado Design Suite

Realizzazione (tra parentesi c'è quello che è stato utilizzato per il mio progetto)

  • Scheda FPGA che può immettere ed emettere segnali digitali/analogici (Basys 3)
  • un sistema controllabile con un'unica fonte di feedback (Ping Pong Ball Levitation Rig)

Rig

  • Tubo in policarbonato
  • Ventola 5V
  • Sensore IR
  • Base stampata in 3D (questo tutorial documenta la costruzione del rig, il sensore è stato aggiunto per fornire feedback ma il rig era generalmente lo stesso)
  • Resistori da 1k
  • Tagliere con 5V e GND Rail

Passaggio 1: teoria del controllo di base

Teoria del controllo di base
Teoria del controllo di base

Ho pensato che l'aggiunta di qualche teoria di controllo di base avrebbe dato a chiunque volesse provare a implementare questo codice una buona base da cui partire.

Lo schema allegato è il layout di un controller di loop singolo.

r- È il riferimento. Questo determina dove si desidera che il controller vada.

e-È l'errore. Questa è la differenza tra il valore sul tuo sensore e il tuo riferimento. per esempio. e=r-(d+uscita del sensore).

K-Questo è il controller. Un controller può essere composto da tre termini. Questi termini sono P, I e D. Tutti e tre i termini hanno moltiplicatori chiamati Kp, Ki e Kd. Questi valori determinano la risposta del controller.

  • P-proporzionale. Un controllore strettamente P avrà un'uscita proporzionale all'errore corrente. Un controller P è semplice da implementare e funziona velocemente ma non raggiungerà mai il valore impostato (riferimento).
  • I-integrale. Un controllore strettamente integrale riassumerà l'errore precedente che alla fine raggiungerà il riferimento desiderato. Questo controller è generalmente troppo lento da implementare. L'aggiunta di un termine P ridurrà il tempo impiegato per raggiungere il riferimento. Il tempo in cui si sta campionando l'ingresso deve essere preso in considerazione il termine integrale è integrato rispetto al tempo.
  • D-derivato. Il termine derivato avrà un output che dipende dal tasso di variazione dell'errore. Questo termine è generalmente utilizzato con un termine P o con un termine PI. Poiché questo è proporzionale al tasso di variazione dell'errore, un singolo rumoroso avrà il suo rumore amplificato, il che può rendere instabile un sistema. Anche il tempo deve essere preso in considerazione poiché il termine derivato è anche rispetto al tempo.

U- Questo è il segnale di controllo. Questo segnale è un ingresso al rig. Nel caso di questo progetto, u è un segnale PWM in ingresso alla ventola per modificare la velocità.

G- Questo è il sistema che viene controllato. Questo sistema può essere modellato matematicamente nel dominio S o Z. I sistemi possono essere all'ennesimo ordine, ma per qualcuno che inizia con il controllo dovrebbe probabilmente essere assunto un sistema del primo ordine in quanto è molto più facile da calcolare. C'è una pletora di informazioni sul sistema di modellazione da trovare online. A seconda del tempo di campionamento del sensore il modello del sistema è discreto o continuo. Questo ha un effetto drastico sul controller, quindi si consiglia di ricercare entrambi.

d- Questo è un disturbo che viene aggiunto al sistema. Il disturbo sono forze esterne di cui il modello del sistema non tiene conto. Un semplice esempio di questo sarebbe un drone che vorresti librare a 5 metri arriva una raffica di vento e lascia cadere il drone di 1 metro il controller riposizionerà il drone dopo che si è verificato il disturbo. Questo è noto come disturbo poiché il vento non è ripetibile, quindi non può essere modellato.

Per mettere a punto il controller ci sono troppe regole da nominare, ma alcune buone con cui ho iniziato sono Cohen Coon e Zieger Nichols.

La modellazione di un sistema è generalmente la parte più importante senza un modello accurato il controller che è stato progettato non risponderà come desiderato.

Dovrebbero esserci abbastanza informazioni qui per capire come funziona il controller insieme ad alcune ricerche individuali e il codice sotto un controller con qualsiasi combinazione dei tre termini può essere implementato.

Passaggio 2: scrittura del codice PID

Scrittura del codice PID
Scrittura del codice PID

Il principio di base del codice che si trova al seguente link è stato preso e modificato in quanto questo codice non funzionava ma aveva molti dei principi giusti che davano un buon punto di partenza. PID originale Il codice presentava diversi errori come

  • Funzionamento continuo: il controller è ereditario discreto, quindi il controller doveva essere impostato per calcolare tutti e 3 i termini solo quando era disponibile un nuovo input. La soluzione per questa simulazione consisteva nel verificare se l'input era cambiato dall'ultima volta. questo funziona solo per simulare il corretto funzionamento del codice.
  • Il tempo di campionamento non ha avuto alcun effetto sul termine integrale e derivato - Il controllore inoltre non ha considerato il tempo in cui il campione veniva rilevato, quindi è stato aggiunto un valore chiamato divisore per il tempo per garantire che i termini integrale e derivato operassero sul corretto intervallo.
  • L'errore poteva essere solo positivo - durante il calcolo dell'errore c'era anche un problema in quanto l'errore non poteva mai essere negativo, il che significa che quando il segnale di retroazione aveva superato il valore di riferimento che il controller avrebbe continuato ad aumentare l'uscita quando dovrebbe diminuire.
  • I valori di guadagno per i 3 termini erano numeri interi: nella mia esperienza ho sempre scoperto che i valori per i 3 termini nel controller erano sempre numeri in virgola mobile a causa del fatto che Basys 3 non aveva un numero in virgola mobile, ai valori doveva essere assegnato un valore numeratore e un valore del denominatore che servirebbe come soluzione per aggirare questo problema.

Il codice è allegato di seguito, c'è il corpo principale del codice e un banco di prova per simulare il codice. La cartella zip contiene il codice e il banco di prova già in Vivado in modo che possa essere aperto per risparmiare tempo. c'è anche un test simulato del codice che mostra l'output che tiene traccia del riferimento, questo dimostra che il codice funziona come previsto.

Passaggio 3: come modificare per il tuo sistema

Innanzitutto non tutti i sistemi sono uguali, bisogna analizzare gli input e gli output del sistema. Nel mio caso l'output del mio rig che mi ha dato un valore per la posizione era un segnale analogico e l'input dal sistema era un segnale PWM. Ciò significa che era necessaria una conversione ADC. Fortunatamente il Basys 3 ha un ADC integrato, quindi questo non è stato un problema, l'uscita del sensore IR doveva essere ridotta a 0V-1V poiché questa è la portata massima dell'ADC di bordo. Ciò è stato fatto utilizzando un circuito divisore di tensione costituito da resistori da 1k impostati come resistore da 3k in serie con un resistore da 1k. Il segnale analogico era ora nel raggio dell'ADC. L'ingresso PWM della ventola è in grado di essere pilotato direttamente dall'uscita di una porta PMOD sul Basys 3.

Passaggio 4: sfruttare i vantaggi dell'I/O su Basys 3

C'è un certo numero di I/O su Basys 3 che ha permesso un debugging più facile quando il codice era in esecuzione. l'I/O è stato impostato come segue.

  • Display a sette segmenti - Questo è stato utilizzato per mostrare il valore del riferimento e il valore sull'ADC in volt. Le prime due cifre del display a sette segmenti mostrano le due cifre dopo la cifra decimale del valore ADC poiché il valore è compreso tra 0-1V. Le cifre tre e quattro sul display a sette segmenti mostrano il valore di riferimento in volt, questo mostra anche le prime due cifre dopo la cifra decimale poiché anche l'intervallo è compreso tra 0-1 V.
  • 16 LED - I LED sono stati utilizzati per mostrare il valore dell'uscita per garantire che l'uscita fosse saturata e che l'uscita stesse cambiando correttamente.

Passaggio 5: rumore sull'uscita del sensore IR

C'era rumore sull'uscita del sensore per risolvere questo problema, è stato messo in atto un blocco di media poiché questo era sufficiente e richiedeva pochissimo lavoro per essere completato.

Passaggio 6: layout del codice generale

Layout del codice generale
Layout del codice generale

C'è un pezzo di codice di cui non si è ancora parlato. Questo codice è un divisore di clock chiamato trigger. questo bit di codice attiva il campionamento del codice ADC. il codice ADC impiega un massimo di 2us per essere completato, quindi viene calcolata la media dell'input corrente e dell'input precedente. 1us dopo questa media il controllore calcola i termini P, I e D. il layout complessivo del codice e dell'interfacciamento è riportato nello schema di collegamento improvvisato.

Passaggio 7: test

test
test

Il codice è stato distribuito su Basys 3 ed è stata registrata la seguente risposta. il riferimento è cambiato tra 2 valori. che è il caso nel codice del progetto completato allegato. Il video allegato mostra questa risposta in tempo reale. Le oscillazioni decadono più velocemente nella parte superiore del tubo poiché il controller è stato progettato per questa regione, ma il controller non funziona altrettanto bene nella parte inferiore del tubo poiché il sistema non è lineare.

Passaggio 8: modifiche per migliorare il progetto

Il progetto ha funzionato come previsto, ma ci sono alcune modifiche che avrei apportato se il progetto avesse potuto essere esteso.

  • Implementa un filtro digitale per attenuare completamente il rumore
  • impostare il codice ADC, il codice medio e il codice di integrazione per l'attivazione in sequenza.
  • utilizzare un sensore diverso per il feedback poiché la risposta non lineare di questo sensore ha causato un'ampia varietà di problemi con questo progetto, ma questo è più dal lato del controllo che dal lato della codifica.

Passaggio 9: lavoro extra

Nel corso dell'estate ho scritto il codice per un controllore in cascata e implementato le modifiche che ho consigliato per il controllore PID a loop singolo.

Modifiche apportate al normale controller PID

· Modello di filtro FIR implementato, i coefficienti devono essere modificati per ottenere la frequenza di taglio desiderata. L'implementazione attuale è un filtro abete a 5 tocchi.

· La tempistica del codice è stata impostata in modo che il filtro propaghi il nuovo campione e quando l'output è pronto verrà attivato il termine integrale, il che significa che il codice può essere modificato per funzionare a intervalli di tempo diversi con meno sforzo per cambiare codice.

· Anche il ciclo principale for che pilota il programma è stato ridotto in quanto questo ciclo for impiegava 7 cicli in precedenza questo rallentava la velocità massima di funzionamento del Controller ma riducendo gli stati del ciclo for t 4 significa che il blocco principale di codice può funzionare entro 4 cicli di clock.

test

Questo controller è stato testato ed eseguito come previsto. Non ho scattato foto di questa prova poiché questa parte del progetto era solo per mantenere la mente attiva. Il codice per il test e il banco di prova saranno disponibili qui in modo da poter testare il programma prima dell'implementazione.

Perché usare un controllore in cascata

Un controllore in cascata controlla due parti del sistema. In questo caso un controller in cascata avrebbe un loop esterno che è un controller che ha un feedback dal sensore IR. L'anello interno ha un feedback sotto forma di tempo tra gli impulsi dal tachimetro che determina la velocità di rotazione della ventola. Implementando il controllo, è possibile ottenere una risposta migliore dal sistema.

Come funziona il controllore in cascata?

Il loop esterno del controller fornirà un valore per il tempo tra i pule al controller del loop interno. Questo controller aumenterà o diminuirà il ciclo di lavoro per ottenere il tempo desiderato tra gli impulsi.

Attuazione di modifiche su rig

Sfortunatamente, non sono stato in grado di implementare queste modifiche sul rig poiché non avevo accesso ad esso. Ho testato il controller single loop rivisto che funziona come previsto. Non ho ancora testato il controller in cascata. Sono sicuro che il controller funzionerà, ma potrebbe richiedere alcune lievi modifiche per funzionare come previsto.

test

Non sono stato in grado di testare il controller poiché era difficile simulare due sorgenti di input. L'unico problema che posso vedere con il controllore in cascata è che quando l'anello esterno cerca di aumentare il setpoint fornito all'anello interno che un setpoint più grande è in realtà un RPS inferiore per la ventola, ma questo può essere risolto facilmente. prendere il setpoint dal valore massimo del segnale di setpoint (4095 - setpoint - risultato_tachimetro).

Passaggio 10: conclusione

Nel complesso il progetto funziona come intendevo quando è iniziato il progetto, quindi sono contento del risultato. Grazie per aver dedicato del tempo a leggere il mio tentativo di sviluppare un controller PID in VHDL. Se qualcuno sta tentando di implementare qualche variazione di questo su un sistema e richiede assistenza per comprendere il codice, contattami, risponderò al più presto. Chiunque provi il lavoro extra che è stato completato ma non implementato mi contatti per qualsiasi mano. Apprezzerei molto se qualcuno che lo implementa mi faccia sapere come va.

Consigliato: