Cuprins:

Controler PID VHDL: 10 pași
Controler PID VHDL: 10 pași

Video: Controler PID VHDL: 10 pași

Video: Controler PID VHDL: 10 pași
Video: Curs 1 IoT (Internet of Things) 2024, Iulie
Anonim
Controler PID VHDL
Controler PID VHDL
Controler PID VHDL
Controler PID VHDL

Acest proiect a fost proiectul meu final pentru finalizarea diplomei de licență de la Cork Institute of Technology. Acest tutorial este împărțit în două secțiuni, prima va acoperi corpul principal al codului PID, care este scopul principal al proiectului, iar a doua secțiune acoperă interfața codului care a fost implementat pe o placă de dezvoltare Basys 3 și apoi interfațată cu o minge de ping pong. platforma de levitație. Instalația teoretică și construită sunt prezentate în imaginile atașate.

Provizii

Simulare

Vivado Design Suite

Implementare (între paranteze se folosește proiectul meu)

  • Placă FPGA care poate introduce și ieși semnale digitale / analogice (Bazele 3)
  • un sistem controlabil cu o singură sursă de feedback (Ping Pong Ball Levitation Rig)

Rig

  • Tub din policarbonat
  • Ventilator 5V
  • Senzor IR
  • 3D Printed Base (Acest tutorial documentează construcția platformei, senzorul a fost adăugat pentru a oferi feedback, dar platforma a fost în general aceeași)
  • Rezistențe 1k
  • Panou cu 5V și șină GND

Pasul 1: Teoria de bază a controlului

Teoria de bază a controlului
Teoria de bază a controlului

Am crezut că adăugarea unei teorii de control de bază ar oferi oricărei persoane care ar dori să încerce să implementeze acest cod o bază bună de la care să înceapă.

Diagrama atașată este aspectul unui controler cu buclă unică.

r- Este referința. Aceasta determină unde se dorește controlerul.

e-Este eroarea. Aceasta este diferența dintre valoarea senzorului și referința dvs. de exemplu. e = r- (d + ieșirea senzorului).

K-Acesta este controlerul. Un controler poate fi compus din trei termeni. Acești termeni sunt P, I și D. Toți cei trei termeni au multiplicatori numiți Kp, Ki și Kd. Aceste valori determină răspunsul controlerului.

  • P-proporțional. Un controler strict P va avea o ieșire proporțională cu eroarea curentă. Un controler P este simplu de implementat și funcționează rapid, dar nu va atinge niciodată valoarea setată (referință).
  • I-Integral. Un controler strict integral va însuma eroarea anterioară care va ajunge în cele din urmă la referința dorită. Acest controler este în general prea lent pentru a fi implementat. Adăugarea într-un termen P va reduce timpul necesar pentru a ajunge la referință. Timpul la care se prelevează eșantionul trebuie luat în considerare, termenul integral este integrat în raport cu timpul.
  • D-Derivat. Termenul derivat va avea o ieșire care depinde de rata de schimbare a erorii. Acest termen este utilizat în general cu un termen P sau cu un termen PI. Deoarece acest lucru este proporțional cu rata de schimbare a erorii, atunci un singur zgomotos va avea zgomotul său amplificat, ceea ce poate determina un sistem să fie instabil. Timpul trebuie, de asemenea, luat în considerare, deoarece termenul derivat este și în ceea ce privește timpul.

U- Acesta este semnalul de control. Acest semnal este o intrare în platformă. În cazul acestui proiect, u este un semnal PWM intrat în ventilator pentru a modifica viteza.

G- Acesta este sistemul care este controlat. Acest sistem poate fi modelat matematic în domeniul S sau Z. Sistemele pot fi de ordinul n, dar pentru cineva care începe cu controlul, ar trebui probabil să se presupună un sistem de primă comandă, deoarece acest lucru este mult mai ușor de calculat. Este o multitudine de informații despre sistemul de modelare care pot fi găsite online. În funcție de timpul de eșantionare a senzorului, modelul sistemului este fie discret, fie continuu. Acest lucru are un efect drastic asupra controlerului, astfel că este recomandată cercetarea în ambele.

d- Aceasta este o perturbare care se adaugă sistemului. Perturbarea este în afara forțelor pe care modelul sistemului nu le ia în considerare. Un exemplu ușor în acest sens ar fi o dronă pe care ați dori să o deplasați la 5 metri, o rafală de vânt vine și scade drona 1 metru, controlerul va repoziționa drona după ce s-a produs tulburarea. Acest lucru este cunoscut sub numele de perturbare, deoarece vântul este nerepetabil, deci acest lucru nu poate fi modelat.

Pentru a regla controlerul, există prea multe reguli de numit, dar unele bune cu care am început sunt Cohen Coon și Zieger Nichols.

Modelarea unui sistem este, în general, cea mai importantă parte fără un model precis, controlerul care a fost proiectat nu va răspunde după cum se dorește.

Ar trebui să existe suficiente informații aici pentru a înțelege modul în care funcționează controlerul împreună cu unele cercetări individuale și codul de sub un controler cu orice combinație a celor trei termeni poate fi implementat.

Pasul 2: Scrierea codului PID

Scrierea codului PID
Scrierea codului PID

Principiul de bază al codului găsit la următoarea legătură a fost luat și modificat deoarece acest cod nu a funcționat, dar avea multe dintre principiile corecte, care au dat un bun punct de plecare. PID original Codul a avut mai multe erori, cum ar fi

  • Funcționare continuă - controlerul este discret în mod ereditar, astfel încât controlerul a trebuit să fie configurat pentru a calcula toți cei 3 termeni doar când a fost disponibilă o nouă intrare. Efectuarea acestei simulări a fost de a verifica dacă intrarea sa schimbat de la ultima dată. acest lucru funcționează doar pentru a simula codul care funcționează corect.
  • Timpul de eșantionare nu a avut niciun efect asupra termenului integral și derivat - Controlerul nu a luat în considerare nici timpul în care eșantionul a fost preluat, așa că s-a adăugat o valoare numită divizor pentru timp, pentru a se asigura că termenii integrali și derivați funcționează pe durata corectă interval.
  • Eroarea ar putea fi doar pozitivă - la calcularea erorii a existat și o problemă, deoarece eroarea nu ar putea avea niciodată semnificație negativă atunci când semnalul de feedback a depășit valoarea de referință conform căreia controlerul ar continua să incrementeze ieșirea atunci când ar trebui să fie descrescătoare.
  • Valorile câștigului pentru cei 3 termeni au fost numere întregi - în experiența mea, am constatat întotdeauna că valorile pentru cei 3 termeni din controler trebuie să fie întotdeauna numere în virgulă mobilă datorită faptului că bazele 3 nu au număr în virgulă mobilă, valorile trebuiau să aibă o valoare de numărător și o valoarea numitorului care ar servi ca o soluție pentru depășirea acestei probleme.

Codul este atașat mai jos, există corpul principal de cod și un banc de testare pentru a simula codul. Dosarul zip conține codul și testbench-ul deja în Vivado, astfel încât să poată fi deschis pentru a economisi timp. există, de asemenea, un test simulat al codului care arată ieșirea care urmărește referința, ceea ce demonstrează că codul funcționează conform intenției.

Pasul 3: Cum să modificați sistemul dvs

În primul rând, nu toate sistemele sunt la fel, trebuie analizate intrările și ieșirile sistemului. În cazul meu, ieșirea platformei mele care mi-a dat o valoare pentru poziție a fost un semnal analogic, iar intrarea din sistem a fost un semnal PWM. Adică este necesară o conversie ADC. Din fericire, Basys 3 are un ADC încorporat, deci nu a fost o problemă, ieșirea senzorului IR a trebuit să fie redusă la 0V-1V, deoarece acesta este intervalul maxim al ADC-ului de la bord. Acest lucru a fost realizat folosind un circuit divizor de tensiune care a fost realizat din rezistențe 1k configurate ca rezistență 3k în serie cu rezistor 1k. Semnalul analogic se afla acum în raza de acțiune a ADC. Intrarea PWM către ventilator este capabilă să fie acționată direct de ieșirea unui port PMOD pe bazele 3.

Pasul 4: Profitarea I / O pe baza 3

Există o serie de I / O pe Basys 3 care au permis o depanare mai ușoară atunci când rulează codul. I / O a fost configurat după cum urmează.

  • Afișare cu șapte segmente - Aceasta a fost utilizată pentru a arăta valoarea de referință și valoarea de pe ADC în volți. Primele două cifre ale afișajului cu șapte segmente arată cele două cifre după zecimalul valorii ADC, deoarece valoarea este între 0-1V. Cifrele trei și patru de pe afișajul de șapte segmente indică valoarea de referință în volți, acestea afișând și primele două cifre după zecimal, deoarece intervalul este, de asemenea, între 0-1V.
  • 16 LED-uri - LED-urile au fost utilizate pentru a arăta valoarea ieșirii pentru a se asigura că ieșirea satura și că ieșirea se schimbă corect.

Pasul 5: Zgomot la ieșirea senzorului IR

La ieșirea senzorului a fost zgomot pentru a remedia această problemă, a fost pus în aplicare un bloc de mediere, deoarece acest lucru a fost suficient și a necesitat foarte puțină muncă.

Pasul 6: Aspect general al codului

Aspect general al codului
Aspect general al codului

Există o singură bucată de cod despre care nu s-a vorbit încă. Acest cod este un divizor de ceas numit trigger. acest bit de cod declanșează codul ADC pentru eșantionare. codul ADC durează maximum 2us pentru a fi finalizat, astfel încât intrarea curentă și intrarea anterioară sunt mediate. 1us după această medie, controlerul calculează termenii P, I și D. aspectul general al codului și interfața este prezentat în diagrama de conexiune improvizată.

Pasul 7: Testarea

Testarea
Testarea

Codul a fost implementat pe Bazele 3 și a fost înregistrat următorul răspuns. referința s-a schimbat între 2 valori. care este cazul în codul de proiect completat atașat. Videoclipul atașat arată acest răspuns în timp real. Oscilațiile se descompun mai repede în partea superioară a tubului, deoarece controlerul a fost proiectat pentru această regiune, dar regulatorul nu funcționează la fel de bine în jos, deoarece sistemul este neliniar.

Pasul 8: Modificări pentru îmbunătățirea proiectului

Proiectul a funcționat așa cum se intenționează, dar există câteva modificări pe care aș fi făcut-o dacă proiectul ar fi putut fi extins.

  • Implementați un filtru digital pentru a atenua complet zgomotul
  • configurați codul ADC, codul mediu și codul de integrare pentru a declanșa secvențial.
  • utilizați un senzor diferit pentru feedback, deoarece răspunsul neliniar al acestui senzor a cauzat o mare varietate de probleme cu acest proiect, dar aceasta este mai mult pe partea de control, nu pe cea de codificare.

Pasul 9: Muncă suplimentară

Pe parcursul verii am scris cod pentru un controler în cascadă și am implementat modificările pe care le-am recomandat pentru controlerul PID cu buclă simplă.

Modificări aduse controlerului PID obișnuit

· Șablonul de filtru FIR implementat coeficienții trebuie schimbați pentru a atinge frecvența de întrerupere dorită. Implementarea actuală este un filtru de brad cu 5 atingeri.

· Momentul codului a fost configurat astfel încât filtrul să propage noul eșantion și atunci când ieșirea este gata, va fi declanșat termenul integral, ceea ce va însemna că codul poate fi modificat pentru a funcționa la intervale de timp diferite, cu mai puțin efort de modificare cod.

· Bucla principală care conduce programul a fost, de asemenea, redusă, deoarece această buclă a durat 7 cicluri anterior, aceasta a încetinit viteza maximă de funcționare a controlerului, dar prin reducerea stărilor pentru bucla t 4, aceasta înseamnă că blocul principal de cod poate funcționa în 4 cicluri de ceas.

Testarea

Acest controler a fost testat și efectuat conform intenției. Nu am făcut poze cu această dovadă, deoarece această parte a proiectului a fost doar pentru a menține mintea activă. Codul pentru testare, precum și bancul de testare, va fi disponibil aici, astfel încât să puteți testa programul înainte de implementare.

De ce să folosiți un controler în cascadă

Un controler în cascadă controlează două părți ale sistemului. În acest caz, un controler în cascadă ar avea o buclă exterioară, care este un controler care are feedback de la senzorul IR. Bucla interioară are feedback sub formă de timp între impulsurile de la tahometru care determină viteza de rotație a ventilatorului. Prin implementarea controlului, se poate obține un răspuns mai bun din sistem.

Cum funcționează controlerul în cascadă?

Bucla exterioară a controlerului va alimenta o valoare pentru timpul dintre pule către controlerul buclei interne. Acest controler va crește sau micșora apoi ciclul de funcționare pentru a atinge timpul dorit între impulsuri.

Implementarea modificărilor pe platformă

Din păcate, nu am putut implementa aceste modificări pe platformă, deoarece nu aveam acces la ea. Am testat controlerul revizuit cu o singură buclă care funcționează conform intenției. Nu am testat încă controlerul cascadă. Sunt încrezător că controlerul va funcționa, dar poate necesita unele ușoare modificări pentru a funcționa conform intenției.

Testarea

Nu am putut testa testul, deoarece a fost dificil să simulez două surse de intrare. Singura problemă pe care o văd cu controlerul în cascadă este că, pe măsură ce bucla exterioară încearcă să mărească valoarea de referință furnizată buclei interne, un punct de referință mai mare este de fapt un RPS mai mic pentru ventilator, dar acest lucru poate fi remediat cu ușurință. luați valoarea setată din valoarea maximă a semnalului setpoint (4095 - setpoint - tacho_result).

Pasul 10: Concluzie

În general, proiectul funcționează așa cum am intenționat când a început proiectul, așa că sunt mulțumit de rezultat. Vă mulțumesc că ați acordat timp pentru a citi încercarea mea de a dezvolta un controler PID în VHDL. Dacă cineva încearcă să implementeze o variantă a acestui lucru pe un sistem și necesită o anumită asistență pentru înțelegerea codului, contactați-mă, voi răspunde cât mai curând posibil. Oricine încearcă munca suplimentară care a fost completată, dar care nu a fost implementată, vă rugăm să mă contactați pentru orice mână. Aș aprecia foarte mult dacă cineva care o implementează mă anunță cum merge.

Recomandat: