Indholdsfortegnelse:
- Forbrugsvarer
- Trin 1: Grundlæggende kontrolteori
- Trin 2: Skrivning af PID -kode
- Trin 3: Sådan ændres til dit system
- Trin 4: Udnytte I/O på Basys 3
- Trin 5: Støj på IR -sensoroutput
- Trin 6: Overordnet kodelayout
- Trin 7: Test
- Trin 8: Ændringer til forbedring af projektet
- Trin 9: Ekstra arbejde
- Trin 10: Konklusion
Video: PID -controller VHDL: 10 trin
2024 Forfatter: John Day | [email protected]. Sidst ændret: 2024-01-30 08:27
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
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
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
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
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:
Selvbalancerende robot - PID -kontrolalgoritme: 3 trin
Self Balancing Robot - PID Control Algorithm: Dette projekt blev udtænkt, fordi jeg var interesseret i at lære mere om kontrolalgoritmer og hvordan man effektivt implementerer funktionelle PID -loops. Projektet er stadig i udviklingsfasen, da der endnu ikke skal tilføjes et Bluetooth -modul, som
PID Line Follower Atmega328P: 4 trin
PID Line Follower Atmega328P: INTRODUKTION Denne instruktør handler om at lave en effektiv og pålidelig Line Follower med PID (proportional-integral-derivat) kontrol (matematisk), der kører inde i hjernen (Atmega328P). Liniefølger er en autonom robot, der følger enten b
Kontrol temperatur hjem med PID og Labview: 4 trin
Kontroltemperatur Hjem med PID og Labview: PID -system kan bruges til at styre PID -paneler, der kan bruges til at producere et stort antal indbyggede produkter, der kan bruges til at kontrollere, hvordan PID'en kan bruges til at se, hvad der skal gøres
PID -styret kuglebalancerende Stewart -platform: 6 trin
PID -styret boldbalancering Stewart Platform: Motivation og overordnet koncept: Som fysiker i træning er jeg naturligt tiltrukket af og søger at forstå fysiske systemer. Jeg er blevet uddannet til at løse komplekse problemer ved at opdele dem i deres mest basale og essentielle ingredienser, så
Visuino PID -børster Motorstyring og encoder: 5 trin
Visuino PID -børster Motorstyring og encoder: Dzisiaj pokażę wam jak podłączyć servomotor szczotkowy z enkoderem optycznym do naszego arduino uno albo mega. I dag vil jeg vise dig, hvordan du tilslutter en børsteservomotor med en optisk encoder til vores arduino uno eller mega