Innehållsförteckning:

PID -styrenhet VHDL: 10 steg
PID -styrenhet VHDL: 10 steg

Video: PID -styrenhet VHDL: 10 steg

Video: PID -styrenhet VHDL: 10 steg
Video: Lecture 73: Digital PID Control Implementation using Verilog HDL Programming 2024, November
Anonim
PID -styrenhet VHDL
PID -styrenhet VHDL
PID -styrenhet VHDL
PID -styrenhet VHDL

Detta projekt var mitt sista projekt för att slutföra min kandidatexamen från Cork Institute of Technology. Denna handledning är uppdelad i två sektioner, den första kommer att täcka huvuddelen av PID -kod som är huvudsyftet med projektet och den andra sektionen täcker gränssnitt mellan koden som implementerades på ett Basys 3 -utvecklingsbord och sedan gränssnitt till en pingisboll levitationsrigg. Den teoretiska och byggda riggen visas på bifogade bilder.

Tillbehör

Simulering

Vivado Design Suite

Implementering (inom parentes är det som användes för mitt projekt)

  • FPGA -kort som kan mata in och mata ut digitala/analoga signaler (Basys 3)
  • ett system som kan styras med en enda återkopplingskälla (Ping Pong Ball Levitation Rig)

Rigg

  • Polykarbonatrör
  • 5V fläkt
  • IR -sensor
  • 3D -tryckt bas (denna handledning dokumenterar konstruktionen av riggen sensorn tillkom för att ge feedback men riggen var i allmänhet densamma)
  • 1k motstånd
  • Brödbräda med 5V och GND -skena

Steg 1: Grundläggande kontrollteori

Grundläggande kontrollteori
Grundläggande kontrollteori

Jag trodde att att lägga till någon grundläggande kontrollteori skulle ge alla som skulle vilja försöka implementera denna kod en bra bas att utgå från.

Diagrammet som bifogas är layouten för en enda loop -styrenhet.

r- Är referensen. Detta bestämmer vart styrenheten önskas gå.

e-Är felet. Detta är skillnaden mellan värdet på din sensor och din referens. t.ex. e = r- (d+sensorns utgång).

K-Detta är regulatorn. En controller kan bestå av tre termer. Dessa termer är P, I och D. Alla tre termerna har multiplikatorer som kallas Kp, Ki och Kd. Dessa värden bestämmer regulatorns svar.

  • P-proportionellt. En strikt P -styrenhet kommer att ha en utgång proportionell mot det aktuella felet. En P -styrenhet är enkel att implementera och fungerar snabbt men kommer aldrig att nå det värde du ställer in (referens).
  • Jag-Integral. En strikt integrerad styrenhet sammanfattar det tidigare felet som så småningom kommer att nå önskad referens. Denna styrenhet är i allmänhet för långsam att implementera. Att lägga till en P -term minskar tiden det tar att nå referensen. Den tid som ingången samplas måste beaktas integral termen är integrerad med avseende på tid.
  • D-derivat. Den härledda termen kommer att ha en output som är beroende av hastigheten för feländring. Denna term används vanligtvis med en P -term eller med en PI -term. Eftersom detta är proportionellt mot hastighetsändringen av fel kommer en bullrig singel att få sitt brus förstärkt vilket kan få ett system att vara instabilt. Tiden måste också beaktas som den härledda termen också är med avseende på tid.

U- Detta är styrsignalen. Denna signal är en ingång till riggen. För detta projekt är u en PWM -signalingång till fläkten för att ändra hastigheten.

G- Detta är systemet som styrs. Detta system kan modelleras matematiskt i S- eller Z -domänen. Systemen kan vara i n: a ordningen, men för någon som kommer igång med kontroll bör ett första ordningssystem antagas eftersom detta är mycket lättare att beräkna. Det finns en mängd information om modelleringssystem som finns online. Beroende på sensorns provtagningstid är systemmodellen antingen diskret eller kontinuerlig. Detta har en drastisk effekt på regulatorn, så forskning om båda rekommenderas.

d- Detta är störning som läggs till i systemet. Störning är yttre krafter som systemmodellen inte står för. Ett enkelt exempel på detta skulle vara en drönare som du skulle vilja sväva på 5 meter ett vindkast kommer och tappar drönaren 1 meter som styrenheten kommer att flytta drönaren efter att störningen har inträffat. Detta är känt som störning eftersom vinden inte kan upprepas, så detta kan inte modelleras.

För att ställa in regulatorn finns det för många regler att nämna, men några bra som jag började med är Cohen Coon och Zieger Nichols.

Att modellera ett system är i allmänhet den viktigaste delen utan en exakt modell som styrenheten som har designats inte kommer att svara som önskat.

Det bör finnas tillräckligt med information här för att förstå hur kontrollenheten fungerar tillsammans med viss individuell forskning och koden nedanför en controller med valfri kombination av de tre termerna kan implementeras.

Steg 2: Skriva PID -kod

Skriva PID -kod
Skriva PID -kod

Grundprincipen för koden som finns på följande länk togs och modifierades eftersom denna kod inte fungerade men t hade många av principerna rätt vilket gav en bra utgångspunkt. Original PID Koden hade flera fel som t.ex.

  • Kontinuerlig drift - regulatorn är i arv diskret så styrenheten måste konfigureras för att bara beräkna alla tre termer när en ny ingång var tillgänglig. Arbetet med denna simulering var att kontrollera om ingången hade ändrats sedan förra gången. detta fungerar bara för att simulera koden som fungerar korrekt.
  • Provtid hade ingen effekt på integral- och derivattermin - Controllern tog inte heller hänsyn till den tidpunkt då provet togs över, så ett värde som kallas divider för tid adderades till för att säkerställa att integral- och derivatvillkoren fungerade över korrekt intervall.
  • Fel kan bara vara postivt - vid beräkning av felet fanns det också ett problem eftersom felet aldrig kunde vara negativt, vilket betyder att återkopplingssignalen hade överstigit referensvärdet att regulatorn skulle fortsätta att öka utmatningen när den skulle minska.
  • Förstärkningsvärden för de tre termerna var heltal - enligt min erfarenhet har jag alltid funnit att värden för de tre termerna i regulatorn alltid ska vara flytande siffror på grund av att Basys 3 inte har flytpunktsnummer värdena måste ges ett täljarvärde och ett nämnare värde som skulle fungera som ett arbete kring överträffa detta problem.

Koden är bifogad nedan, det finns huvuddelen av kod och en testbänk för att simulera koden. Zip -mappen innehåller koden och testbänken redan i Vivado så att den kan öppnas för att spara tid. det finns också ett simulerat test av koden som visar utsignalen som spårar referensen, detta bevisar att koden fungerar som avsett.

Steg 3: Så här ändrar du för ditt system

För det första är inte alla system desamma, man måste analysera systemets ingångar och utgångar. I mitt fall var utmatningen från min rigg som gav mig ett värde för positionen en analog signal och ingången från systemet var en PWM -signal. Det betyder att en ADC -konvertering behövdes. Lyckligtvis har Basys 3 en inbyggd ADC så detta var inga problem, utgången från IR-sensorn måste minskas till 0V-1V eftersom detta är det maximala intervallet för inbyggd ADC. Detta gjordes med hjälp av en spänningsdelare krets som var gjord av 1k motstånd som sattes upp som ett 3k motstånd i serie med ett 1k motstånd. Den analoga signalen var nu inom ADC: s intervall. PWM -ingången till fläkten kan direkt drivas av utgången från en PMOD -port på Basys 3.

Steg 4: Utnyttja I/O på Basys 3

Det finns ett antal I/O på Basys 3 som möjliggjorde enklare felsökning när koden kördes. I/O -enheten konfigurerades enligt följande.

  • Sju segmentvisning - Detta användes för att visa referensvärdet och värdet på ADC i volt. De två första siffrorna i sjusegmentsdisplayen visar de två siffrorna efter decimalplatsen för ADC-värdet eftersom värdet är mellan 0-1V. Siffrorna tre och fyra på displayen med sju segment visar referensvärdet i volt. Detta visar också de två första siffrorna efter decimalen eftersom intervallet också är mellan 0-1V.
  • 16 lysdioder - Lysdioderna användes för att visa värdet på utgången för att säkerställa att utgången mättades och utgången ändrades korrekt.

Steg 5: Buller på IR -sensorutgången

Det var buller på sensorutgången för att åtgärda detta problem. Ett medelvärdesblock sattes på plats eftersom detta var tillräckligt och krävde mycket lite arbete för att slutföra.

Steg 6: Övergripande kodlayout

Övergripande kodlayout
Övergripande kodlayout

Det finns en kodbit som inte har pratats om än. Denna kod är en klockavdelare som kallas trigger. denna bit kod utlöser ADC -koden att prova. ADC -koden tar max 2us att slutföra så den genomsnittliga aktuella ingången och den föregående ingången. 1us efter detta medelvärde beräknar regulatorn P, I och D -termer. den övergripande layouten av koden och gränssnittet visas i det provisoriska anslutningsdiagrammet.

Steg 7: Testning

Testning
Testning

Koden distribuerades på Basys 3 och följande svar registrerades. referensen ändrades mellan 2 värden. vilket är fallet i den bifogade projektkoden. Den bifogade videon visar detta svar i realtid. Svängningarna förfaller snabbare i den övre delen av röret eftersom regulatorn är utformad för detta område men styrenheten fungerar inte lika bra längre ner i röret eftersom systemet är olinjärt.

Steg 8: Ändringar för att förbättra projektet

Projektet fungerade som tänkt men det fanns några ändringar som jag skulle ha gjort om projektet kunde ha förlängts.

  • Implementera digitalt filter för att helt dämpa brus
  • konfigurera ADC -koden, Genomsnittskoden och Integrationskoden för att utlösa sekventiellt.
  • använd en annan sensor för återkoppling eftersom den icke-linjära responsen hos den här sensorn orsakade en mängd olika problem med detta projekt men det är mer på kontrollsidan inte på kodningssidan.

Steg 9: Extraarbete

Under sommaren skrev jag kod för en kaskadkontroller och implementerade de modifieringar jag rekommenderade för PID -regulatorn med en slinga.

Modifieringar gjorda på vanlig PID -styrenhet

· FIR-filtermallen implementerad, koefficienterna måste ändras för att uppnå önskad avstängningsfrekvens. Den nuvarande implementeringen är ett 5-krans granfilter.

· Tidpunkten för koden har ställts in så att filtret kommer att sprida det nya samplet genom och när utgången är klar kommer den integrerade termen att utlösas, vilket innebär att koden kan modifieras för att fungera vid olika tidsintervaller med mindre ansträngning att ändra koda.

· Huvudet för slingan som driver programmet har också reducerats eftersom detta för slingan tog 7 cykler innan detta sänkte regulatorns maximala driftshastighet men genom att minska för -slingan t 4 -tillstånd betyder detta att huvudblocket med kod kan fungera inom 4 klockcykler.

Testning

Denna styrenhet testades och utfördes på avsett sätt. Jag tog inte bilder av detta bevis eftersom den här delen av projektet bara var att hålla sinnet aktivt. Koden för testning såväl som testbänken kommer att finnas tillgänglig här så att du kan testa programmet före implementering.

Varför använda en kaskadkontroller

En kaskadkontroll styr två delar av systemet. I detta fall skulle en kaskadstyrenhet ha en yttre slinga som är en styrenhet som har återkoppling från IR -sensorn. Den inre slingan har återkoppling i form av tid mellan pulserna från varvräknaren som bestämmer fläktens rotationshastighet. Genom att implementera kontroll kan ett bättre svar uppnås från systemet.

Hur fungerar kaskadkontrollen?

Styrenhetens yttre slinga matar ett värde för tiden mellan pulsarna till den inre slingans styrenhet. Denna styrenhet kommer sedan att öka eller minska arbetscykeln för att uppnå önskad tid mellan pulser.

Genomförande av modifieringar på rigg

Tyvärr kunde jag inte genomföra dessa ändringar på riggen eftersom jag inte hade tillgång till den. Jag testade den reviderade single loop controller som fungerar som avsett. Jag har inte testat kaskadkontrollen än. Jag är säker på att handkontrollen kommer att fungera men kan kräva några små ändringar för att fungera som avsett.

Testning

Jag kunde inte testa regulatorn eftersom det var svårt att simulera två ingångskällor. Det enda problemet jag kan se med kaskadkontrollen är att när den yttre slingan försöker öka börvärdet som levereras till innerslingan så är ett större börvärde faktiskt en lägre RPS för fläkten men detta kan fixas enkelt. ta börvärdet från maxvärdet för börvärdesignalen (4095 - börvärde - tacho_result).

Steg 10: Slutsats

Sammantaget fungerar projektet som jag tänkt mig när projektet började så jag är nöjd med resultatet. Tack för att du tog dig tid att läsa mitt försök att utveckla en PID -styrenhet i VHDL. Om någon försöker implementera någon variant av detta på ett system och kräver lite stöd för att förstå koden kontakta mig så svarar jag ASAP. Alla som försöker det extra arbete som kompletterades men inte genomfördes, vänligen kontakta mig för någon hand. Jag skulle uppskatta det om någon som genomför det låter mig veta hur det går.

Rekommenderad: