Inhoudsopgave:

PID-regelaar VHDL: 10 stappen
PID-regelaar VHDL: 10 stappen

Video: PID-regelaar VHDL: 10 stappen

Video: PID-regelaar VHDL: 10 stappen
Video: BTC #10 | Display text on an HD44780 LCD using VHDL code - FULL Tutorial PART 3 2024, Juli-
Anonim
PID-regelaar VHDL
PID-regelaar VHDL
PID-regelaar VHDL
PID-regelaar VHDL

Dit project was mijn afstudeerproject om mijn Honours Bachelor Degree van Cork Institute of Technology af te ronden. Deze zelfstudie is opgedeeld in twee secties, de eerste zal het hoofdgedeelte van de PID-code behandelen, wat het hoofddoel van het project is, en de tweede sectie behandelt de interface met de code die is geïmplementeerd op een Basys 3-ontwikkelingsbord en vervolgens is gekoppeld aan een pingpongbal levitatie tuig. De theoretische en gebouwde rig worden getoond in de bijgevoegde afbeeldingen.

Benodigdheden

Simulatie

Vivado Design Suite

Implementatie (tussen haakjes is wat werd gebruikt voor mijn project)

  • FPGA-kaart die digitale/analoge signalen kan invoeren en uitvoeren (Basys 3)
  • een systeem dat bestuurbaar is met een enkele feedbackbron (Ping Pong Ball Levitation Rig)

Rig

  • Polycarbonaat buis
  • 5V ventilator
  • IR-sensor
  • 3D-geprinte basis (Deze tutorial documenteert de constructie van de rig die de sensor is toegevoegd om feedback te geven, maar de rig was over het algemeen hetzelfde)
  • 1k Weerstanden
  • Breadboard met 5V en GND Rail

Stap 1: Basiscontroletheorie

Basiscontroletheorie
Basiscontroletheorie

Ik dacht dat het toevoegen van een basiscontroletheorie iedereen die deze code zou willen proberen te implementeren een goede basis zou geven om mee te beginnen.

Het bijgevoegde diagram is de lay-out van een enkele luscontroller.

r- Is de referentie. Dit bepaalt waar de controller heen moet.

e-Is de fout. Dit is het verschil tussen de waarde op je sensor en je referentie. bijv. e=r-(d+uitgang van sensor).

K-Dit is de controller. Een controller kan uit drie termen bestaan. Deze termen zijn P, I en D. Alle drie de termen hebben vermenigvuldigers genaamd Kp, Ki en Kd. Deze waarden bepalen de reactie van de regelaar.

  • P-Proportioneel. Een strikt P-controller heeft een output die evenredig is met de huidige fout. Een P-controller is eenvoudig te implementeren en werkt snel, maar zal nooit de door u ingestelde waarde (referentie) bereiken.
  • I-Integraal. Een strikt integrale controller zal de vorige fout samenvatten die uiteindelijk de gewenste referentie zal bereiken. Deze controller is over het algemeen te traag om te implementeren. Het toevoegen van een P-term zal de tijd die nodig is om de referentie te bereiken verkorten. Met de tijd dat de input wordt bemonsterd, moet rekening worden gehouden met de integrale term die is geïntegreerd in de tijd.
  • D-derivaat. De afgeleide term zal een output hebben die afhankelijk is van de mate van foutverandering. Deze term wordt over het algemeen gebruikt met een P-term of met een PI-term. Aangezien dit evenredig is met de mate van verandering van fouten, zal de ruis van een luidruchtige single worden versterkt, waardoor een systeem instabiel kan worden. Er moet ook rekening worden gehouden met tijd, aangezien de afgeleide term ook betrekking heeft op tijd.

U- Dit is het stuursignaal. Dit signaal is een ingang naar de rig. In het geval van dit project is de u een PWM-signaalinvoer naar de ventilator om de snelheid te wijzigen.

G- Dit is het systeem dat wordt bestuurd. Dit systeem kan wiskundig worden gemodelleerd in het S- of Z-domein. De systemen kunnen tot de n-de orde zijn, maar voor iemand die aan de slag gaat met controle, moet waarschijnlijk worden uitgegaan van een eerste-ordesysteem, omdat dit veel gemakkelijker te berekenen is. Het is een overvloed aan informatie over het modelleringssysteem dat online te vinden is. Afhankelijk van de bemonsteringstijd van de sensor is het model van het systeem ofwel discreet ofwel continu. Dit heeft een ingrijpend effect op de controller, dus onderzoek naar beide is aan te raden.

d- Dit is een storing die aan het systeem wordt toegevoegd. Verstoring is krachten van buitenaf waar het model van het systeem geen rekening mee houdt. Een eenvoudig voorbeeld hiervan is een drone die je op 5 meter wilt laten zweven. Een windvlaag komt en laat de drone 1 meter vallen. De controller zal de drone verplaatsen nadat de storing is opgetreden. Dit staat bekend als verstoring omdat wind niet herhaalbaar is, dus dit kan niet worden gemodelleerd.

Om de controller af te stemmen zijn er teveel regels om op te noemen, maar een paar goede waarmee ik ben begonnen zijn Cohen Coon en Zieger Nichols.

Het modelleren van een systeem is over het algemeen het belangrijkste onderdeel zonder een nauwkeurig model zal de ontworpen controller niet reageren zoals gewenst.

Er moet hier voldoende informatie zijn om te begrijpen hoe de controller werkt, samen met wat individueel onderzoek en de onderstaande code kan een controller met elke combinatie van de drie termen implementeren.

Stap 2: PID-code schrijven

PID-code schrijven
PID-code schrijven

Het basisprincipe van de code die op de volgende link te vinden is, is genomen en aangepast omdat deze code niet werkte, maar het had veel van de principes goed, wat een goed uitgangspunt gaf. Originele PID De code had verschillende fouten, zoals:

  • Continue werking - de controller is inherent discreet, dus de controller moest worden ingesteld om alleen alle 3 de termen te berekenen als er een nieuwe ingang beschikbaar was. De work around voor deze simulatie was om te controleren of de invoer sinds de laatste keer was veranderd. dit werkt alleen om te simuleren dat de code correct werkt.
  • Sample Time had geen effect op integrale en afgeleide term - De controller hield ook geen rekening met de tijd waarin de sample werd overgenomen, dus werd een waarde toegevoegd die deler voor tijd wordt genoemd om ervoor te zorgen dat de integrale en afgeleide termen werkten over de juiste interval.
  • Fout kan alleen positief zijn - bij het berekenen van de fout was er ook een probleem omdat de fout nooit negatief kon zijn, wat betekent dat wanneer het feedbacksignaal de referentiewaarde had overschreden, de controller de output zou blijven verhogen wanneer deze zou moeten afnemen.
  • Winstwaarden voor de 3 termen waren gehele getallen - in mijn ervaring vond ik altijd dat waarden voor de 3 termen in de controller altijd drijvende-kommagetallen waren omdat Basys 3 geen drijvende-kommagetal had, de waarden moesten een tellerwaarde en een noemerwaarde die zou dienen als een oplossing om dit probleem te omzeilen.

De code is hieronder bijgevoegd, het hoofdgedeelte van de code en een testbank om de code te simuleren. De zip-map bevat de code en testbench al in Vivado, zodat deze kan worden geopend om tijd te besparen. er is ook een gesimuleerde test van de code die laat zien dat de uitvoer de referentie volgt. Dit bewijst dat de code functioneert zoals bedoeld.

Stap 3: Hoe te wijzigen voor uw systeem?

Ten eerste zijn niet alle systemen hetzelfde, men moet de inputs en outputs van het systeem analyseren. In mijn geval was de output van mijn rig die me een waarde voor de positie gaf een analoog signaal en de input van het systeem was een PWM-signaal. Dit betekent dat een ADC-conversie nodig was. Gelukkig heeft de Basys 3 een ingebouwde ADC, dus dit was geen probleem. De output van de IR-sensor moest worden verkleind naar 0V-1V aangezien dit het maximale bereik is van de ingebouwde ADC. Dit werd gedaan met behulp van een spanningsdelercircuit dat was gemaakt van 1k-weerstanden die waren opgesteld als een 3k-weerstand in serie met een 1k-weerstand. Het analoge signaal was nu binnen het bereik van de ADC. De PWM-ingang naar de ventilator kan direct worden aangedreven door de uitgang van een PMOD-poort op de Basys 3.

Stap 4: Profiteren van I/O op Basys 3

Er is een aantal I/O's op de Basys 3 die het debuggen gemakkelijker maakten wanneer de code werd uitgevoerd. de I/O was als volgt ingesteld.

  • Seven Segment Display - Dit werd gebruikt om de waarde van de referentie en waarde op de ADC in volt weer te geven. De eerste twee cijfers van het zevensegmentendisplay tonen de twee cijfers achter de komma van de ADC-waarde, aangezien de waarde tussen 0-1V ligt. De cijfers drie en vier op het zevensegmentendisplay geven de referentiewaarde in volt aan, dit toont ook de eerste twee cijfers achter de komma aangezien het bereik ook tussen 0-1V ligt.
  • 16 LED's - De LED's werden gebruikt om de waarde van de uitvoer weer te geven om ervoor te zorgen dat de uitvoer verzadigd was en de uitvoer correct veranderde.

Stap 5: Ruis op de IR-sensoruitgang

Er was ruis op de sensoruitgang om dit probleem op te lossen. Er werd een middelingsblok geplaatst omdat dit voldoende was en er heel weinig werk nodig was om te voltooien.

Stap 6: Algemene codelay-out

Algemene code-indeling
Algemene code-indeling

Er is een stukje code waar nog niet over is gesproken. Deze code is een klokverdeler die trigger wordt genoemd. dit stukje code activeert de ADC-code om te samplen. de ADC-code duurt maximaal 2us om te voltooien, dus de huidige invoer en de vorige invoer worden gemiddeld. 1us na deze middeling berekent de controller P-, I- en D-termen. de algehele lay-out van de code en interface wordt getoond in het geïmproviseerde verbindingsdiagram.

Stap 7: Testen

Testen
Testen

De code is ingezet op de Basys 3 en de volgende reactie is opgenomen. de referentie is veranderd tussen 2 waarden. wat het geval is in de voltooide projectcode die is bijgevoegd. De bijgevoegde video toont deze reactie in realtime. De oscillaties nemen sneller af in het bovenste deel van de buis omdat de controller voor dit gebied is ontworpen, maar de controller werkt niet zo goed verder in de buis omdat het systeem niet-lineair is.

Stap 8: Aanpassingen om het project te verbeteren

Het project werkte zoals bedoeld, maar er zijn een paar wijzigingen die ik zou hebben aangebracht als het project had kunnen worden verlengd.

  • Implementeer een digitaal filter om ruis volledig te dempen
  • stel de ADC-code, Gemiddelde code en Integratiecode in om sequentieel te activeren.
  • gebruik een andere sensor voor feedback, aangezien de niet-lineaire respons van deze sensor een breed scala aan problemen met dit project veroorzaakte, maar dat is meer aan de besturingskant en niet aan de coderingskant.

Stap 9: Extra werk

In de loop van de zomer schreef ik code voor een cascaderegelaar en implementeerde ik de wijzigingen die ik had aanbevolen voor de enkelvoudige PID-regelaar.

Aanpassingen aan de reguliere PID-regelaar

· FIR-filtersjabloon geïmplementeerd, de coëfficiënten moeten worden gewijzigd om de gewenste afsnijfrequentie te bereiken. De huidige implementatie is een 5-tap fir filter.

· De timing van de code is zo ingesteld dat het filter het nieuwe monster doorgeeft en wanneer de uitvoer gereed is, wordt de integrale term geactiveerd, wat betekent dat de code kan worden aangepast om op verschillende tijdsintervallen te werken met minder moeite om te veranderen code.

· De belangrijkste for-lus die het programma aanstuurt, is ook verkleind, aangezien deze for-lus eerder 7 cycli duurde. Dit vertraagde de maximale werksnelheid van de controller, maar door de for-lus t 4 te verminderen, betekent dit dat het hoofdcodeblok kan werken binnen 4 klokcycli.

Testen

Deze controller is getest en uitgevoerd zoals bedoeld. Ik heb geen foto's van dit bewijs gemaakt omdat dit deel van het project alleen maar was om de geest actief te houden. De code voor het testen en de testbench zijn hier beschikbaar, zodat u het programma kunt testen voordat u het implementeert.

Waarom een cascaderegelaar gebruiken?

Een cascaderegelaar stuurt twee delen van het systeem aan. In dit geval zou een cascadecontroller een buitenste lus hebben, een controller die feedback heeft van de IR-sensor. De binnenste lus heeft feedback in de vorm van tijd tussen de pulsen van de toerenteller die het toerental van de ventilator bepaalt. Door controle te implementeren kan een betere respons uit het systeem worden gehaald.

Hoe werkt de cascaderegelaar?

De buitenste lus van de controller stuurt een waarde voor de tijd tussen de pulsen naar de controller van de binnenste lus. Deze controller zal dan de duty cycle verhogen of verlagen om de gewenste tijd tussen pulsen te bereiken.

Implementatie van wijzigingen op rig

Helaas kon ik deze wijzigingen niet op de rig doorvoeren omdat ik er geen toegang toe had. Ik heb de herziene single loop-controller getest die werkt zoals bedoeld. Ik heb de cascadecontroller nog niet getest. Ik ben er zeker van dat de controller zal werken, maar het kan zijn dat er enkele kleine aanpassingen nodig zijn om te werken zoals bedoeld.

Testen

Ik kon de controller niet testen omdat het moeilijk was om twee invoerbronnen te simuleren. Het enige probleem dat ik met de cascaderegelaar kan zien, is dat wanneer de buitenste lus probeert het instelpunt dat aan de binnenste lus wordt geleverd te verhogen, een groter instelpunt in feite een lagere RPS voor de ventilator is, maar dit kan eenvoudig worden opgelost. neem het setpoint van de maximale waarde van het setpointsignaal (4095 - setpoint - tacho_result).

Stap 10: Conclusie

Over het algemeen functioneert het project zoals ik het bedoeld had toen het project begon, dus ik ben blij met het resultaat. Bedankt dat je de tijd hebt genomen om mijn poging tot het ontwikkelen van een PID-controller in VHDL te lezen. Als iemand een variatie hiervan op een systeem probeert te implementeren en enige hulp nodig heeft om de code te begrijpen, neem dan contact met mij op. Ik zal zo snel mogelijk reageren. Iedereen die het extra werk probeert dat is voltooid maar niet is uitgevoerd, neem contact met mij op voor elke hand. Ik zou het zeer op prijs stellen als iemand die het implementeert, me laat weten hoe het gaat.

Aanbevolen: