Indholdsfortegnelse:

PID -controller VHDL: 10 trin
PID -controller VHDL: 10 trin

Video: PID -controller VHDL: 10 trin

Video: PID -controller VHDL: 10 trin
Video: VHDL Basics 2024, November
Anonim
PID -controller VHDL
PID -controller VHDL
PID -controller VHDL
PID -controller VHDL

Dette projekt var mit sidste projekt for at afslutte min Honours Bachelor Degree fra Cork Institute of Technology. Denne vejledning er opdelt i to sektioner, den første dækker hoveddelen af PID -kode, som er projektets hovedformål, og den anden sektion dækker grænseflade for koden, der blev implementeret på et Basys 3 -udviklingsbræt og derefter blev forbundet til en bordtennisbold levitation rig. Den teoretiske og indbyggede rig er vist på de vedhæftede billeder.

Forbrugsvarer

Simulering

Vivado Design Suite

Implementering (i parentes er det, der blev brugt til mit projekt)

  • FPGA -kort, der kan input og output digitale/analoge signaler (Basys 3)
  • et system, der kan styres med en enkelt feedback -kilde (Ping Pong Ball Levitation Rig)

Rig

  • Polycarbonat rør
  • 5V blæser
  • IR -sensor
  • 3D -printet base (denne vejledning dokumenterer konstruktionen af riggen, sensoren blev tilføjet for at give feedback, men riggen var generelt den samme)
  • 1k modstande
  • Brødbræt med 5V og GND -skinne

Trin 1: Grundlæggende kontrolteori

Grundlæggende kontrolteori
Grundlæggende kontrolteori

Jeg troede, at tilføjelse af en grundlæggende kontrolteori ville give alle, der gerne vil prøve at implementere denne kode, et godt grundlag at starte fra.

Diagrammet vedhæftet er layoutet på en enkelt loop -controller.

r- Er referencen. Dette bestemmer, hvor controlleren ønskes hen.

e-Er fejlen. Dette er forskellen mellem værdien på din sensor og din reference. f.eks. e = r- (d+sensorens udgang).

K-Dette er controlleren. En controller kan bestå af tre vilkår. Disse udtryk er P, I og D. Alle tre udtryk har multiplikatorer kaldet Kp, Ki og Kd. Disse værdier bestemmer controllerens respons.

  • P-proportional. En strengt P -controller vil have en output, der er proportional med den aktuelle fejl. En P -controller er enkel at implementere og arbejde hurtigt, men når aldrig den værdi, du har angivet (reference).
  • I-Integral. En strengt integreret controller opsummerer den tidligere fejl, som i sidste ende vil nå den ønskede reference. Denne controller er generelt for langsom at implementere. Tilføjelse af et P -udtryk reducerer den tid, det tager at nå referencen. Den tid, som input samples, skal tages i betragtning, at det integrale udtryk er integreret med hensyn til tid.
  • D-derivat. Det afledte udtryk vil have et output, der er afhængigt af fejlændringshastigheden. Dette udtryk bruges generelt med et P -udtryk eller med et PI -udtryk. Da dette er proportionalt med fejlændringshastigheden, vil en støjende single få sin støj forstærket, hvilket kan få et system til at være ustabilt. Tid skal også tages i betragtning, som det afledte udtryk også er med hensyn til tid.

U- Dette er styresignalet. Dette signal er et input til riggen. I tilfælde af dette projekt er u et PWM -signalindgang til blæseren for at ændre hastigheden.

G- Dette er det system, der styres. Dette system kan matematisk modelleres i S- eller Z -domænet. Systemerne kan være i niende rækkefølge, men for nogen, der kommer i gang med kontrol, bør et første ordens system sandsynligvis antages, da dette er meget lettere at beregne. Det er en overflod af oplysninger om modelleringssystem, der findes online. Afhængigt af sensorens prøveudtagningstid er systemmodellen enten diskret eller kontinuerlig. Dette har en drastisk effekt på controlleren, så det tilrådes at undersøge begge dele.

d- Dette er forstyrrelse, der tilføjes til systemet. Forstyrrelser er ydre kræfter, som systemmodellen ikke tager højde for. Et let eksempel på dette ville være en drone, som du gerne vil svæve på 5 meter, et vindstød kommer og taber dronen 1 meter, kontrolleren vil placere dronen igen, efter at forstyrrelsen er sket. Dette er kendt som forstyrrelse, da vinden ikke kan gentages, så dette kan ikke modelleres.

For at indstille controlleren er der for mange regler til at nævne, men nogle gode, som jeg blev startet med, er Cohen Coon og Zieger Nichols.

Modellering af et system er generelt den vigtigste del uden en nøjagtig model, som controlleren, der er designet, ikke reagerer som ønsket.

Der bør være tilstrækkelig information her til at forstå, hvordan controlleren fungerer sammen med nogle individuelle undersøgelser, og koden nedenfor kan en controller med en hvilken som helst kombination af de tre termer implementeres.

Trin 2: Skrivning af PID -kode

Skrivning af PID -kode
Skrivning af PID -kode

Grundprincippet for koden fundet på det følgende link blev taget og ændret, da denne kode ikke fungerede, men t havde mange af principperne rigtige, hvilket gav et godt udgangspunkt. Original PID Koden havde flere fejl som f.eks

  • Kontinuerlig drift - controlleren er iboende diskret, så controlleren skulle konfigureres til kun at beregne alle 3 termer, når et nyt input var tilgængeligt. Arbejdet med denne simulering var at kontrollere, om input var ændret siden sidste gang. dette virker kun for at simulere koden, der fungerer korrekt.
  • Prøvetid havde ingen effekt på integral- og derivatterm - Controlleren overvejede heller ikke det tidspunkt, hvor prøven blev overtaget, så der blev tilføjet en værdi, der kaldes divider for time for at sikre, at integral- og derivatbetingelserne fungerer over det korrekte interval.
  • Fejl kunne kun være postiv - ved beregning af fejlen var der også et problem, da fejlen aldrig kunne have en negativ betydning, når feedback -signalet havde overgået referenceværdien, at controlleren fortsat ville øge output, når det skulle være faldende.
  • Gain -værdier for de 3 termer var heltal - i min erfaring fandt jeg altid ud af, at værdier for de 3 termer i controlleren altid var flydende tal på grund af, at Basys 3 ikke havde flydende tal, værdierne skulle have en tællerværdi og et nævner værdi, der ville tjene som et arbejde omkring overgå dette problem.

Koden er vedhæftet herunder, der er hovedkoden og en testbænk til at simulere koden. ZIP -mappen indeholder koden og testbænken allerede i Vivado, så den kan åbnes for at spare tid. der er også en simuleret test af koden, der viser outputsporing af referencen, dette viser, at koden fungerer efter hensigten.

Trin 3: Sådan ændres til dit system

For det første er ikke alle systemer ens, man skal analysere systemets input og output. I mit tilfælde var output fra min rig, som gav mig en værdi for positionen, et analogt signal, og input fra systemet var et PWM -signal. Det betyder, at en ADC -konvertering var nødvendig. Heldigvis har Basys 3 en indbygget ADC, så dette var ikke noget problem, IR-sensorens output skulle nedskaleres til 0V-1V, da dette er det maksimale område for den indbyggede ADC. Dette blev gjort ved hjælp af et spændingsdelerkredsløb, der var fremstillet af 1k modstande, der var opstillet som en 3k modstand i serie med en 1k modstand. Det analoge signal var nu inden for ADC's område. PWM -indgangen til blæseren kan direkte drives af output fra en PMOD -port på Basys 3.

Trin 4: Udnytte I/O på Basys 3

Der er et antal I/O på Basys 3, som muliggjorde lettere fejlfinding, når koden kørte. I/O'en blev konfigureret som følgende.

  • Syv segmentvisning - Dette blev brugt til at vise værdien af referencen og værdien på ADC i volt. De to første cifre i displayet med syv segmenter viser de to cifre efter decimalpladsen for ADC-værdien, da værdien er mellem 0-1V. Cifrene tre og fire på displayet med syv segmenter viser referenceværdien i volt. Dette viser også de to første cifre efter decimal, da intervallet også er mellem 0-1V.
  • 16 lysdioder - Lysdioderne blev brugt til at vise værdien af output for at sikre, at output var mættende og output ændrede sig korrekt.

Trin 5: Støj på IR -sensoroutput

Der var støj på sensorudgangen for at løse dette problem, en gennemsnitlig blok blev sat på plads, da dette var tilstrækkeligt og krævede meget lidt arbejde for at fuldføre.

Trin 6: Overordnet kodelayout

Samlet kodelayout
Samlet kodelayout

Der er et stykke kode, som ikke er blevet talt om endnu. Denne kode er en urdeler kaldet trigger. denne bit kode udløser ADC -koden til prøve. ADC -koden tager maksimalt 2us at fuldføre, så den gennemsnitlige nuværende input og den tidligere input er gennemsnitlige. 1us efter dette gennemsnit beregner controlleren P, I og D udtryk. det overordnede layout af koden og grænsefladen er vist i det provisoriske forbindelsesdiagram.

Trin 7: Test

Test
Test

Koden blev implementeret på Basys 3, og følgende svar blev registreret. referencen ændret mellem 2 værdier. hvilket er tilfældet i den vedhæftede projektkode. Den vedhæftede video viser dette svar i realtid. Svingningerne falder hurtigere i den øverste del af røret, da controlleren var designet til dette område, men controlleren fungerer ikke så godt længere nede i røret, da systemet er ikke-lineært.

Trin 8: Ændringer til forbedring af projektet

Projektet fungerede efter hensigten, men der var et par ændringer, som jeg ville have foretaget, hvis projektet kunne have været forlænget.

  • Implementer digitalt filter for helt at dæmpe støj
  • konfigurer ADC -koden, gennemsnitskoden og integrationskoden til at udløse sekventielt.
  • brug en anden sensor til feedback, da den ikke-lineære respons på denne sensor forårsagede en lang række problemer med dette projekt, men det er mere på kontrolsiden, ikke kodningssiden.

Trin 9: Ekstra arbejde

I løbet af sommeren skrev jeg kode til en kaskadestyring og implementerede de ændringer, jeg anbefalede til single loop PID -controlleren.

Ændringer foretaget på almindelig PID -controller

· FIR-filterskabelon implementeret, koefficienterne skal ændres for at opnå den ønskede afskæringsfrekvens. Den nuværende implementering er et 5-tap granfilter.

· Tidspunktet for koden er blevet opsat, så filteret vil sprede den nye prøve igennem, og når output er klar, vil det integrerede udtryk blive udløst, hvilket vil betyde, at koden kan ændres til at fungere på forskellige tidsintervaller med mindre indsats for at ændre kode.

· Main for loop, der driver programmet, er også reduceret, da denne for loop tog 7 cykler, før dette bremsede controllerens maksimale driftshastighed, men ved at reducere for loop -t 4 -tilstandene betyder det, at hovedblokken med kode kan fungere inden for 4 urcykler.

Test

Denne controller blev testet og udført efter hensigten. Jeg tog ikke billeder af dette bevis, da denne del af projektet bare var at holde sindet aktivt. Koden til test såvel som testbænken vil være tilgængelig her, så du kan teste programmet før implementering.

Hvorfor bruge en kaskadecontroller

En kaskadestyring styrer to dele af systemet. I dette tilfælde ville en kaskadestyring have en ydre sløjfe, som er en controller, der har feedback fra IR -sensoren. Den indre sløjfe har feedback i form af tid mellem impulserne fra omdrejningstælleren, som bestemmer ventilatorens rotationshastighed. Ved at implementere kontrol kan der opnås en bedre respons ud af systemet.

Hvordan fungerer kaskadecontrolleren?

Controllerens ydre sløjfe vil føde en værdi for tiden mellem pulserne til den indre loop -controller. Denne controller vil derefter øge eller reducere driftscyklussen for at opnå den ønskede tid mellem impulser.

Implementering af ændringer på rig

Desværre kunne jeg ikke implementere disse ændringer på riggen, da jeg ikke havde adgang til den. Jeg testede den reviderede single loop -controller, der fungerer efter hensigten. Jeg har ikke testet kaskadecontrolleren endnu. Jeg er overbevist om, at controlleren fungerer, men kan kræve nogle små ændringer for at fungere efter hensigten.

Test

Jeg kunne ikke teste controlleren, da det var svært at simulere to inputkilder. Det eneste problem, jeg kan se med kaskadekontrolleren, er, at når den ydre sløjfe forsøger at øge det setpunkt, der leveres til den indre sløjfe, er et større setpunkt faktisk en lavere RPS for blæseren, men dette kan let rettes. tag setpunktet fra maks. værdi for setpunktsignalet (4095 - setpunkt - tacho_result).

Trin 10: Konklusion

Samlet set fungerer projektet som jeg havde tænkt mig da projektet startede, så jeg er tilfreds med resultatet. Tak fordi du tog dig tid til at læse mit forsøg på at udvikle en PID -controller i VHDL. Hvis nogen forsøger at implementere en eller anden variation af dette på et system og kræver hjælp til at forstå koden, kontakt mig, svarer jeg ASAP. Enhver, der prøver det ekstra arbejde, der blev udført, men ikke blev implementeret, bedes du kontakte mig for enhver hånd. Jeg ville sætte stor pris på det, hvis nogen, der implementerer det, fortæller mig, hvordan det går.

Anbefalede: