Innholdsfortegnelse:

PID -kontroller VHDL: 10 trinn
PID -kontroller VHDL: 10 trinn

Video: PID -kontroller VHDL: 10 trinn

Video: PID -kontroller VHDL: 10 trinn
Video: SPI Master in FPGA, VHDL Code Example 2024, November
Anonim
PID -kontroller VHDL
PID -kontroller VHDL
PID -kontroller VHDL
PID -kontroller VHDL

Dette prosjektet var mitt siste prosjekt for å fullføre min Honours Bachelor Degree fra Cork Institute of Technology. Denne opplæringen er delt inn i to seksjoner, den første vil dekke hoveddelen av PID -kode, som er hovedformålet med prosjektet, og den andre delen dekker grensesnitt mellom koden som ble implementert på et Basys 3 utviklingsbord og deretter tilkoblet en bordtennisball levitasjonsrigg. Den teoretiske og bygde riggen er vist på bildene vedlagt.

Rekvisita

Simulering

Vivado Design Suite

Implementering (i parentes er det som ble brukt til prosjektet mitt)

  • FPGA -kort som kan sende inn og sende ut digitale/analoge signaler (Basys 3)
  • et system som kan kontrolleres med en enkelt tilbakemeldingskilde (Ping Pong Ball Levitation Rig)

Rig

  • Polykarbonatrør
  • 5V vifte
  • IR -sensor
  • 3D -trykt base (Denne opplæringen dokumenterer konstruksjonen av riggen, sensoren ble lagt til for å gi tilbakemelding, men riggen var generelt den samme)
  • 1k motstander
  • Brødbrett med 5V og GND -skinne

Trinn 1: Grunnleggende kontrollteori

Grunnleggende kontrollteori
Grunnleggende kontrollteori

Jeg trodde at å legge til noen grunnleggende kontrollteori ville gi alle som ønsker å prøve å implementere denne koden en god base å starte fra.

Diagrammet vedlagt er oppsettet til en enkelt sløyfekontroller.

r- Er referansen. Dette bestemmer hvor kontrolleren ønskes å gå.

e-Er feilen. Dette er forskjellen mellom verdien på sensoren din og referansen din. f.eks. e = r- (d+sensorens utgang).

K-Dette er kontrolleren. En kontroller kan bestå av tre vilkår. Disse begrepene er P, I og D. Alle tre begrepene har multiplikatorer kalt Kp, Ki og Kd. Disse verdiene bestemmer responsen til kontrolleren.

  • P-proporsjonal. En strengt P -kontroller vil ha en utgang proporsjonal med den nåværende feilen. En P -kontroller er enkel å implementere og fungerer raskt, men vil aldri nå verdien du angir (referanse).
  • Jeg-Integral. En strengt integrert kontroller vil oppsummere den forrige feilen som til slutt vil nå ønsket referanse. Denne kontrolleren er vanligvis for treg å implementere. Hvis du legger til et P -uttrykk, reduseres tiden det tar å nå referansen. Tiden som innsamlingen blir samplet må tas i betraktning. Det integrerte begrepet er integrert med hensyn til tid.
  • D-derivat. Derivatbetegnelsen vil ha en utgang som er avhengig av hastigheten for endring av feil. Dette begrepet brukes vanligvis med en P -term eller med et PI -begrep. Siden dette er proporsjonalt med endringshastigheten for feil, vil en støyende singel få støyen sin forsterket, noe som kan føre til at et system er ustabilt. Tid må også tas i betraktning som det avledede begrepet også er med hensyn til tid.

U- Dette er kontrollsignalet. Dette signalet er en inngang til riggen. I tilfelle av dette prosjektet er u en PWM -signalinngang til viften for å endre hastigheten.

G- Dette er systemet som blir kontrollert. Dette systemet kan modelleres matematisk i S- eller Z -domenet. Systemene kan være i niende rekkefølge, men for noen som kommer i gang med kontroll, bør et første ordens system sannsynligvis antas da dette er mye lettere å beregne. Det er en overflod av informasjon om modelleringssystem som finnes på nettet. Avhengig av prøvetidstiden til sensoren er modellen av systemet enten diskret eller kontinuerlig. Dette har en drastisk effekt på kontrolleren, så det anbefales å undersøke begge deler.

d- Dette er forstyrrelse som legges til systemet. Forstyrrelse er eksterne krefter som modellen for systemet ikke tar hensyn til. Et enkelt eksempel på dette vil være en drone som du ønsker å sveve på 5 meter et vindkast kommer og slipper dronen 1 meter kontrolleren vil plassere dronen etter at forstyrrelsen har skjedd. Dette er kjent som forstyrrelse, da vinden ikke kan gjentas, så dette kan ikke modelleres.

For å stille kontrolleren er det for mange regler å nevne, men noen gode som jeg ble startet med er Cohen Coon og Zieger Nichols.

Å modellere et system er generelt den viktigste delen uten en nøyaktig modell som kontrolleren som er designet, ikke vil svare som ønsket.

Det bør være nok informasjon her til å forstå hvordan kontrolleren fungerer sammen med individuell forskning og koden under en kontroller med en hvilken som helst kombinasjon av de tre begrepene kan implementeres.

Trinn 2: Skrive PID -kode

Skriver PID -kode
Skriver PID -kode

Det grunnleggende prinsippet for koden som ble funnet på den følgende lenken ble tatt og endret ettersom denne koden ikke fungerte, men jeg hadde mange av prinsippene som ga et godt utgangspunkt. Original PID Koden hadde flere feil som f.eks

  • Kontinuerlig drift - kontrolleren er iboende diskret, så kontrolleren måtte settes opp til å bare beregne alle tre vilkårene når en ny inngang var tilgjengelig. Arbeidet rundt for denne simuleringen var å sjekke om inngangen hadde endret seg siden forrige gang. dette fungerer bare for å simulere koden som fungerer korrekt.
  • Prøvetid hadde ingen effekt på integral- og derivatterm - Kontrolleren vurderte heller ikke tidspunktet da prøven ble overtatt, så en verdi kalt divider for time ble lagt til for å sikre at integral- og derivatvilkårene opererte over riktig intervall.
  • Feil kan bare være postiv - ved beregning av feilen var det også et problem, ettersom feilen aldri kunne ha negativ betydning når tilbakemeldingssignalet hadde overgått referanseverdien om at kontrolleren ville fortsette å øke utgangen når den skulle være redusert.
  • Få verdier for de tre begrepene var heltall - i min erfaring har jeg alltid funnet ut at verdier for de tre begrepene i kontrolleren alltid skal være flytende tall på grunn av at Basys 3 ikke har flytende tall, verdiene måtte gis en tellerverdi og et nevnerverdi som ville fungere som et arbeid for å overgå dette problemet.

Koden er vedlagt nedenfor, det er hoveddelen av kode og en testbenk for å simulere koden. Zip -mappen inneholder koden og testbenken som allerede er i Vivado, slik at den kan åpnes for å spare tid. det er også en simulert test av koden som viser utgangssporing av referansen, dette viser at koden fungerer etter hensikten.

Trinn 3: Slik endrer du for systemet ditt

For det første er ikke alle systemene like, man må analysere systemets innganger og utganger. I mitt tilfelle var utgangen fra riggen min som ga meg en verdi for stillingen et analogt signal og inngangen fra systemet var et PWM -signal. Det betyr at en ADC -konvertering var nødvendig. Heldigvis har Basys 3 en innebygd ADC, så dette var ikke noe problem, utgangen fra IR-sensoren måtte reduseres til 0V-1V, da dette er maksimal rekkevidde for den innebygde ADC. Dette ble gjort ved hjelp av en spenningsdelerkrets som var laget av 1k motstander satt opp som en 3k motstand i serie med en 1k motstand. Det analoge signalet var nå innenfor ADC -området. PWM -inngangen til viften kan direkte drives av utgangen fra en PMOD -port på Basys 3.

Trinn 4: Dra fordel av I/O på Basys 3

Det er en rekke I/O på Basys 3 som muliggjorde enklere feilsøking når koden kjørte. I/O ble satt opp som følgende.

  • Seven Segment Display - Dette ble brukt til å vise verdien av referansen og verdien på ADC i volt. De to første sifrene i displayet med syv segmenter viser de to sifrene etter desimalplassen for ADC-verdien da verdien er mellom 0-1V. Sifrene tre og fire på displayet med syv segmenter viser referanseverdien i volt. Dette viser også de to første sifrene etter desimalplassen, ettersom området også er mellom 0-1V.
  • 16 lysdioder - Lysdiodene ble brukt til å vise verdien på utgangen for å sikre at utgangen mettet og utgangen endret seg riktig.

Trinn 5: Støy på IR -sensorutgangen

Det var støy på sensorutgangen for å fikse dette problemet, en gjennomsnittsblokk ble satt på plass, da dette var tilstrekkelig og krevde svært lite arbeid for å fullføre.

Trinn 6: Samlet kodeoppsett

Samlet kodeoppsett
Samlet kodeoppsett

Det er en kodebit som ikke har blitt snakket om ennå. Denne koden er en klokkeskille som kalles trigger. denne biten av kode utløser ADC -koden for å prøve. ADC -koden tar maksimalt 2us å fullføre, så da er gjennomsnittlig inngang og forrige inngang gjennomsnittlig. 1us etter dette gjennomsnitt beregner kontrolleren P, I og D vilkår. den overordnede utformingen av koden og grensesnittet er vist i det provisoriske tilkoblingsdiagrammet.

Trinn 7: Testing

Testing
Testing

Koden ble distribuert på Basys 3 og følgende respons ble registrert. referansen endret mellom 2 verdier. som er tilfelle i den ferdige prosjektkoden vedlagt. Den vedlagte videoen viser dette svaret i sanntid. Svingningene forfaller raskere i den øvre delen av røret ettersom kontrolleren var designet for dette området, men kontrolleren fungerer ikke like godt lenger ned i røret da systemet er ikke-lineært.

Trinn 8: Endringer for å forbedre prosjektet

Prosjektet fungerte etter hensikten, men det var noen få endringer som jeg ville ha gjort hvis prosjektet kunne ha blitt utvidet.

  • Implementer digitalt filter for å dempe støy helt
  • sett opp ADC -koden, gjennomsnittskoden og integrasjonskoden for å utløse sekvensielt.
  • bruk en annen sensor for tilbakemelding, ettersom den ikke-lineære responsen til denne sensoren forårsaket mange problemer med dette prosjektet, men det er mer på kontrollsiden, ikke på kodesiden.

Trinn 9: Ekstraarbeid

I løpet av sommeren skrev jeg kode for en kaskadekontroller og implementerte modifikasjonene jeg anbefalte for single loop PID -kontrolleren.

Endringer gjort på vanlig PID -kontroller

· FIR-filtermal implementert, koeffisientene må endres for å oppnå ønsket cut-off frekvens. Den nåværende implementeringen er et 5-tappers granfilter.

· Tidspunktet for koden er konfigurert slik at filteret vil spre den nye prøven gjennom, og når utgangen er klar, vil det integrerte uttrykket bli utløst, noe som betyr at koden kan endres til å fungere i forskjellige tidsintervaller med mindre innsats for å endre kode.

· Hoveddelen for sløyfe som driver programmet har også blitt redusert ettersom denne for sløyfe tok 7 sykluser før dette bremset den maksimale driftshastigheten til kontrolleren, men ved å redusere tilstandene for sløyfe t 4 betyr dette at hovedblokken med kode kan fungere innen 4 klokkesykluser.

Testing

Denne kontrolleren ble testet og utført etter hensikten. Jeg tok ikke bilder av dette beviset, siden denne delen av prosjektet bare var for å holde sinnet aktivt. Koden for testing så vel som testbenken vil være tilgjengelig her, slik at du kan teste programmet før implementering.

Hvorfor bruke en kaskadekontroller

En kaskadestyring kontrollerer to deler av systemet. I dette tilfellet vil en kaskadestyring ha en ytre sløyfe som er en kontroller som har tilbakemelding fra IR -sensoren. Den indre sløyfen har tilbakemelding i form av tid mellom impulsene fra turtelleren som bestemmer viftehastigheten. Ved å implementere kontroll kan en bedre respons oppnås ut av systemet.

Hvordan fungerer kaskadekontrolleren?

Kontrollens ytre sløyfe vil mate en verdi for tiden mellom pulsene til den indre sløyfekontrolleren. Denne kontrolleren vil deretter øke eller redusere driftssyklusen for å oppnå ønsket tid mellom pulser.

Implementering av modifikasjoner på rigg

Dessverre klarte jeg ikke å implementere disse modifikasjonene på riggen da jeg ikke hadde tilgang til den. Jeg testet den reviderte single loop -kontrolleren som fungerer etter hensikten. Jeg har ikke testet kaskadekontrolleren ennå. Jeg er sikker på at kontrolleren vil fungere, men kan kreve noen små modifikasjoner for å fungere etter hensikten.

Testing

Jeg klarte ikke å teste kontrolleren, da det var vanskelig å simulere to inngangskilder. Det eneste problemet jeg kan se med kaskadestyreren er at når den ytre sløyfen prøver å øke settpunktet som leveres til den indre sløyfen, er et større settpunkt faktisk en lavere RPS for viften, men dette kan løses enkelt. ta settpunktet fra maksverdien til settpunktssignalet (4095 - settpunkt - tacho_result).

Trinn 10: Konklusjon

Totalt sett fungerer prosjektet slik jeg hadde tenkt meg da prosjektet begynte, så jeg er fornøyd med resultatet. Takk for at du tok deg tid til å lese mitt forsøk på å utvikle en PID -kontroller i VHDL. Hvis noen prøver å implementere en variant av dette på et system og krever litt støtte for å forstå koden, kontakt meg. Jeg svarer ASAP. Alle som prøver det ekstra arbeidet som ble utført, men som ikke ble implementert, kan kontakte meg for enhver hånd. Jeg ville sette stor pris på om noen som implementerer det gir meg beskjed om hvordan det går.

Anbefalt: