Embedded PID Temperaturkontroll, Del 4: Scilab GUI

How to program a STC-1000 temperature controller (Juni 2019).

$config[ads_text] not found
Anonim

Embedded PID Temperaturkontroll, Del 4: Scilab GUI


Med USB-kommunikasjon og et Scilab grafisk brukergrensesnitt, kan vi virkelig se hva PID-kontrolleren gjør.

støttende informasjon

  • Dette prosjektet bruker en spesialdesignet PCB; vennligst se Tilpasset PCB Design med en EFM8 Microcontroller for veiledning om å inkorporere EFM8-enheter i din tilpassede maskinvare.
  • Du finner en kort oversikt over termoelementer sammen med noen generell informasjon om MAX31855 i Lag et EFM8-basert system for overvåking og analyse av termoelementmålinger.
  • En introduksjon til styringssystemer: Utforming av en PID-kontroller ved hjelp av MATLABs SISO-verktøy
  • Negativ tilbakemelding, Del 1: Generell struktur og grunnleggende begreper
  • Denne artikkelen introduserer Scilab.
  • To tidligere artikler gir informasjon om innlemming av USB-kommunikasjon i et EFM8-prosjekt: Kommunisere med en EFM8 Microcontroller via USB og EFM8 Sound Synthesizer: Spille melodier via USB.

Tidligere artikler i denne serien

  • Embedded PID Temperaturkontroll, Del 1: Kretskortet
  • Embedded PID Temperature Control, Del 2: Integrering på Board-Level
  • Innebygd PID-temperaturkontroll, Del 3: Implementering og visualisering

Før vi begynner, er det tidligere PID-styringsdiagrammet vist:

Mye bedre enn lysdioder

LED-visualiseringsskjemaet som ble brukt i forrige artikkel var ganske begrenset. Faktum er, omtrent enhver visualiseringsordning basert på ingenting mer enn noen få lysdioder vil være ganske svake. Vi trenger noe som gjør at vi kan se nøyaktig hva vår PID-kontroller gjør - først, fordi det vil være mye mer interessant, og for det andre fordi vi trenger detaljert informasjon om systemets ytelse for å kunne ordne riktig proporsjonal, integrert, og derivativ gevinst.

For dette stadiet av prosjektet skal vi innlemme USB-funksjonalitet i EFM8-fastvaren og designe et Scilab grafisk brukergrensesnitt som styrer settpunktet og viser i realtid de faktiske målte temperaturene. "Støtteinformasjon" -delen ovenfor viser deg artikler som gir innledende informasjon om EFM8 USB-funksjonalitet og Scilab. Du kan også bla gjennom mine tidligere artikler og ta en titt på alt som involverer Scilab GUIer eller USB-kommunikasjon.

firmware

USB-kommandoer

Fastvaren er endret slik at PID-drift styres av Scilab. EFM8 starter ikke PID-funksjonaliteten før Scilab forteller det, og deretter kan Scilab stoppe og gjenoppta PID-funksjonaliteten til enhver tid. For å starte eller gjenoppta PID-operasjon, sender Scilab ASCII "C" over USB-koblingen, og for å stoppe PID-operasjonen sender den ASCII "H"; begge kommandoene er bare en enkelt karakter uten vognretur eller newline eller hva ikke. Oppvarmingsspenningen er satt til 0 V når PID-driften stoppes, så husk at temperaturen på varmeelementet gradvis reduseres til romtemperatur i en stopptilstand. Scilab kan også endre setpunktet; Dette oppnås ved å sende ASCII "S" etterfulgt av et binær (dvs. ikke-ASCII) tall som representerer settpunktet i grader Celsius. Disse tre kommandoene er innlemmet i VCPXpress tilbakeringingsfunksjonen.

 VCPXpress_API_CALLBACK(myAPICallback) { uint32_t API_InterruptCode; //get the code that indicates the reason for the interrupt API_InterruptCode = Get_Callback_Source(); //if the USB connection was just opened if (API_InterruptCode & DEVICE_OPEN) { //start the first USB read procedure Block_Read(USBRxPacket, USB_PACKET_SIZE, &USBBytesRcvd); /*we will process the received bytes when we get a callback with an RX_COMPLETE interrupt code*/ } if (API_InterruptCode & RX_COMPLETE) //USB read complete { //'C' tells the EFM8 to begin or resume PID control if(USBRxPacket(0) == 'C') { PID_ACTIVE = TRUE; } //'H' tells the EFM8 to halt PID control else if(USBRxPacket(0) == 'H') { PID_ACTIVE = FALSE; /*The heater-drive voltage is held at 0 V * while PID control is halted.*/ UpdateDAC(DAC_HEATER, 0); } //'S' indicates that the host is sending the setpoint else if(USBRxPacket(0) == 'S') { /*The setpoint temperature is restricted to * positive integers not greater than 100 * degrees C. Scilab sends the setpoint as a * normal binary number, not as ASCII characters, * so that the EFM8 doesn't have to convert * from ASCII to binary.*/ Setpoint_Temp = USBRxPacket(1); } //continue with the next USB read procedure Block_Read(USBRxPacket, USB_PACKET_SIZE, &USBBytesRcvd); } } 

PID-strømning

PID-rutinen i hovedlinjens løkke begynner nå ved å sjekke PID_ACTIVE-flagget, som initialiseres til FALSE. Utførelsen forblir på dette punktet før en "C" -kommando fra Scilab får EFM8 til å endre dette flagget til SANT. En annen viktig forskjell er at den målte temperaturen sendes til Scilab i begynnelsen av hver iterasjon. I tidligere prosjekter, Scilab først forespurt data via en USB-kommando, så sendte EFM8 dataene som svar på forespørselen. I dette prosjektet trenger Scilab ikke å be om data; EFM8 sender en trebyte målt temperaturpakke under hver iterasjon, og Scilab mottar og viser bare dataene. Dette reduserer USB-trafikken og byrden på EFM8-prosessoren, og derfor bør vi ha mindre problemer med de høyere oppdateringshastighetene som kreves for bedre visualisering av endringer i den kontrollerte variabelen. Den nåværende fastvaren bruker et oppdateringsintervall på to sekunder, som synes å gi tilstrekkelig kontroll og visualisering uten å overbelaste EFM8 eller Scilab GUI. Følgende kodeutdrag dekker PID-delen av hovedunderlaget:

 while (1) { /*First, we check PID_ACTIVE.The following while statement * suspends PID functionality until the EFM8 is commanded by * Scilab to begin or resume PID control.*/ while(PID_ACTIVE == FALSE); GatherMAX31855Data(); while(TEMP_DATA_READY == FALSE); //wait until the SPI transaction is complete Measured_Temp = ConvertMAX31855Data_to_TempC(); //send measured temperature to Scilab TransmitUSB_TempData(); Error = Setpoint_Temp - Measured_Temp; /*We don't want the integral error to get * way too large. This is a standard problem * referred to as integral windup. One solution * is to simply restrict the integral error to * reasonable values.*/ Error_Integral = Error_Integral + Error; if(Error_Integral > 50) Error_Integral = 50; else if(Error_Integral200) PID_Output = 200; else if(PID_Output < 0) PID_Output = 0; //here we convert the PID output from a float to an unsigned char Heater_Drive = PID_Output; UpdateDAC(DAC_HEATER, Heater_Drive); 

LED

Selv om det ikke er nok av seg selv, er LED-tilbakemelding fortsatt en nyttig måte å overvåke driften av systemet på. Det er også nyttig som en måte å bekrefte at dataene som vises av Scilab, stemmer overens med det som virkelig skjer i EFM8. For å gjøre LED-tilbakemeldingen mer egnet for dette andre formålet, vil vi ta en annen tilnærming i denne fasen av prosjektet: Hvis den målte temperaturen ligger innenfor ± 2 ° C av settpunktet, slår vi bare på den grønne LED-lampen. Hvis den målte temperaturen er over 2 ° C under settpunktet, slår vi bare på blå. Hvis den målte temperaturen er over 2 ° C over settpunktet, slår vi bare på rødt. Så, grønn = god, blå = for kald og rød = for varm. Fordelen med denne ordningen vil være tydelig når den målte temperaturen svinger rundt settpunktet, fordi endringene i LED-farge vil synkronisere med temperaturvariasjonene som vises i GUI. LED-kontrollkoden er inkludert i den andre delen av hovedunderløpet.

 /*LED visualization: If the measured temperature is within * plus/minus 2 degrees C of the setpoint, we turn on the * green LED. If the measured temperature is more than * 2 degrees below the setpoint, we turn on the blue LED. * If the measured temperature is more than 2 degrees * above the setpoint, we turn on the red LED.*/ if(Measured_Temp >= (Setpoint_Temp-2) & Measured_Temp <= (Setpoint_Temp+2)) { UpdateDAC(DAC_RGB_R, 0); UpdateDAC(DAC_RGB_B, 0); UpdateDAC(DAC_RGB_G, 100); } else if(Measured_Temp(Setpoint_Temp+2)) { UpdateDAC(DAC_RGB_R, 100); UpdateDAC(DAC_RGB_B, 0); UpdateDAC(DAC_RGB_G, 0); } /*Here we wait until the PID interval has expired, * then we begin a new iteration. The interval is * currently set to 2 seconds.*/ PID_WAIT = TRUE; while(PID_WAIT == TRUE); } 

Her er en lenke for å laste ned alle kilde- og prosjektfiler.

Kilde og prosjektfiler

Scilab

Her ser GUI ut når den ikke er aktiv:

Den ble designet ved hjelp av GUI Builder verktøykasse, som du kan laste ned gjennom Scilabs ATOMS modul manager:

Her er en lenke for å laste ned GUI-skriptet (det er bare en enkelt tekstfil).

GUI Script

Først bruker du "Åpne VCP Port" -knappen for å etablere en virtuell COM-portforbindelse til EFM8. Deretter velger du setpunktet. Scilab begrenser settpunktet til heltall mindre enn eller lik 100. Hvis du angir en verdi som er større enn 100, vil Scilab automatisk redusere den til 100 og vise "Setpunkt redusert til maksimum tillatt verdi, dvs. 100 ° C" i meldingsfeltet under "Åpne VCP Port" -knappen. På samme måte, hvis du skriver inn et ikke-heltall, runder Scilab det til nærmeste heltall og viser en melding i den retningen. Nå er du klar til å klikke på "Aktiver PID Control" -knappen. Setpunktet sendes ikke til EFM8 før du klikker på denne knappen, og du kan ikke endre setpunktet mens PID-kontrollen er aktiv. Dette vil være tydelig fordi innstillingsboksen for innstilt tekst er grå ut under aktiv PID-kontroll. For å endre settpunktet, må du klikke på "Halt PID Control", og deretter endre det, og klikk deretter "Aktiver PID Control" for å gjenoppta PID-operasjonen.

Når du er ferdig med å bruke GUI, klikker du først på "Halt PID Control" (med mindre PID-kontroll allerede er inaktivt), og deretter klikker du "Lukk VCP Port", og lukk deretter GUI-vinduet. Hvis du ikke følger denne fremgangsmåten, må du kanskje starte Scilab eller tilbakestille EFM8 eller noen av disse. Det er irriterende, men ikke katastrofalt.

La oss ta en rask titt på noen fremtredende deler av Scilab-skriptet. Først, dette er hvordan Scilab sender kommandoene "S" (setpunkt) og "C" (initier / gjenoppta PID-kontroll), etter at du har klikket på "Aktiver PID Control":

Setpoint- verdien er hentet fra tekstboksen som følger:

Når PID-kontrollen er aktiv, kontrollerer Scilab gjentatte ganger den virtuelle COM-port mottaksbufferen. Når tre byte er mottatt, leser de de tre byteene, konverterer dem til en temperaturverdi og legger dem til en matrise som inneholder alle målte temperaturverdier mottatt siden sist gang "Aktiver PID Control" ble klikket:

Plottet som viser målte temperaturer har også en grønn prikket linje som tilsvarer settpunktet. Følgende kode brukes til å generere settpunktslinjen:

resultater

I den forrige artikkelen så vi på (LED- og oscopabaserte) resultater for et proporsjonalt eneste system og et proporsjonalt integrert system. I begge tilfeller var kontrolloppgaven å bringe varmeelementet fra 30 ° C til et settpunkt på 50 ° C. Vi var i stand til å bestemme at 1) P-eneste systemet aldri nådde setpunktet og 2) PI-systemet oppnådde settpunktet, men med litt overskyting. La oss nå se på GUI-baserte resultater for samme kontrolloppgave. Først P-eneste systemet:

Vi ser at P-eneste systemet faktisk kommer svært nær settpunktet, men uten integrert forsterkning, faller temperaturen noe og når en steady state-verdi som er ca. 2 ° C under settpunktet. Som vi nevnte i forrige artikkel, er P-only-systemer kjent for deres følsomhet for signifikant steady state-feil.

Her er plottet for PI-systemet:

Vi kan se her at PI-systemet er faktisk verre enn vi trodde. Den når faktisk settpunktet, men det fører til mer enn bare overskygging - denne spesielle konfigurasjonen fører faktisk til vedvarende (eller i det minste langsiktig) svingning rundt settpunktet.

Konklusjon

Videoen på slutten av denne artikkelen (den kjører med 16x normal hastighet) viser LED-oppførselen som tilsvarer plottet for PI-systemet. I videoen vil du også legge merke til en viktig maskinvaredetaljer: PCB-en vi bruker for dette prosjektet har faktisk to USB-kontakter, en for strøm og en for data. En typisk USB-port kan ikke levere mer enn 500 mA. For å få den høyere strømmen vi trenger for varmeelementet, inneholder styret muligheten til å ta strøm fra en separat kontakt. Så en av USB-kablene er koblet til en USB-lader som kan levere noe som 1200 mA, og den andre er koblet til en USB-port på PCen.

I neste artikkel vil vi bruke vår fancy nye GUI for å utforske hvordan forskjellige P, I og D gevinster påvirker systemets ytelse.

Neste artikkel i serie: Embedded PID-temperaturkontroll, Del 5: Justering av gevinster

Gi dette prosjektet et forsøk for deg selv! Få BOM.