Proportionaalinen on vain yksi tapa reagoida järjestelmän virheeseen. Suhteellisen ohjauksen ongelmana on, että se ei pysty havaitsemaan trendejä ja sopeutumaan niihin. Tämä on integraalisäädön tehtävä.
Kuvan 6 vasemmalla puolella on toinen esimerkkikuvaaja järjestelmän virheestä ajan funktiona. Taas se voi olla robotin etäisyys kohteesta, tai se voi olla nesteen taso säiliössä tai lämpötila tehtaan uunissa. Ehkäpä kohde, jota robotti seuraa, jatkaa etääntymistään robotista nopeudella, jota robotti ei saa kiinni. Ehkä uunin luukun tiiviste on kulunut; ehkä nesteen otto säiliöstä on epätavallisen suuri. Syystä riippumatta, koska proportionaalista ei ole suunniteltu reagoimaan trendeihin, se ei voi havaita ja korjata ongelmaa. Tässä tulee kuvaan mukaan integraaliohjaus.
Integraali mittaa virhearvojen ja aika-akselin välistä aluetta. Jos virhe ei palaudu nollaan, virheen pinta-ala kasvaa ja kasvaa. Kuvan 6 oikealla puolella näkyy, miten integraalilähtö voi reagoida tällaiseen kehitykseen. Kun virhekäyrän ja aika-akselin välinen alue kasvaa, lähtö kasvaa suhteessa tähän alueeseen. Tämän seurauksena lähtö ohjaa toimilaitetta yhä voimakkaammin korjaamaan virhettä.
Mitä sitten tapahtuu, kun virhe ei ole suora viiva, kuten kuvassa 8 esitetty käyrä? Sen määrittää integroinnin laskutoimitus, käyrän ja akselin välinen alue. Integraaliohjauksen tapauksessa, kun virheen kanssa kuluu enemmän aikaa, käyrän alapuolinen pinta-ala kasvaa, ja niin kasvaa myös arvo, jota integraalilaskenta käyttää ajamaan järjestelmän virhettä vastaan. Jos virhekäyrä laskee aika-akselin alapuolelle, negatiivisen alueen kertyminen vähentää positiivisen alueen kertymisen. Oikein viritettynä integraaliohjaus voi auttaa järjestelmää hioutumaan nollavirheeseen.
BASIC Stamp voi approksimoida käyrän alla olevaa virhettä numeerisella integroinnilla. Kuvassa 9 näytetään, miten käyrän alla olevaa virhettä voidaan approksimoida laskemalla yhteen virhekäyrän ja aika-akselin väliin jäävien pienten suorakulmioiden pinta-alat. Kunkin laatikon pinta-ala on virhe kerrottuna mittausten välisellä ajalla. Laskemalla yhteen kaikki laatikoiden pinta-alat saat likimääräisen arvion käyrän alle jäävästä pinta-alasta.
Sikäli kuin mittaukset ovat tasaisin väliajoin, voit kutsua kunkin laatikon leveydeksi arvoa 1. Tämä tekee matematiikasta paljon yksinkertaisempaa kuin se, että yrittäisit ottaa huomioon näytteiden välillä kulkevan 20 ms:n pituisen ajanjakson, näytteiden välillä kulkevan 5 minuutin pituisen ajanjakson tai minkälaiseksi näytteenottotaajuudeksikaan ei pääse tulemaan. Sen sijaan, että kertoisit virheen näytteiden välisellä aikaväliosuudella ja lisäisit sitten seuraavaan virheeseen kerrottuna ajalla, voit vain kertoa jokaisen virhenäytteen ajalla 1. Tuloksena on, että voit vain pitää virhemittausten juoksevaa kokonaissummaa integraalilaskentaa varten. Tässä on esimerkki siitä, miten tämä tehdään PBASICilla:
' Calculate integral term.error(Accumulator) = error(Accumulator) + error(Current)i = Ki * error(Accumulator)
Seuraava esimerkkiohjelma suorittaa numeerisen integroinnin virhesignaalille ja säätää ulostulon vastaavasti. Kuten proportionaalisäädössä, on olemassa vakio, joka skaalaa integrointilähdön haluttuun arvoon. Yksinkertaisuuden vuoksi käytämme taas Ki:lle arvoa 10. Kuvassa 10 esitetään ohjaussilmukan lohkokaavio. Termi Kp ∫ edt viittaa Kp:hen kerrottuna virheen integraalilla ajan suhteen. Toisin sanoen Kp kerrottuna virhekäyrän ja aika-akselin välisellä kertyneellä pinta-alalla.
Esimerkkiohjelma – IntegralAlgorithm.bs2
- Syötä, tallenna ja suorita IntegralAlgorithm.bs2.
- Syötä tämä arvosekvenssi vianmääritysterminaalin lähetys-ikkunaruutuun: 3 3 3 3 3 3 3 3 3. Huomaa, kuinka integraalitulos kasvaa joka kerta, kun 3 toistetaan. Se on integraalin tehtävä, havaita kehityssuuntaukset ja lisätä asemaa sen korjaamiseksi tarpeen mukaan.
- Kokeile nyt tätä sekvenssiä: 1 2 3 4 5 4 3 2 1 0 -1 -2 -3 -4 -3 -2 -1 0. Tämän käyrän alle jäävä pinta-ala on 0, koska negatiivinen pinta-ala on sama kuin positiivinen pinta-ala. Tähän tulokseen myös integraalilaskenta päätyy, kun olet lopettanut sekvenssin syöttämisen.
' IntegralAlgorithm.bs2' Demonstrates how integral control influences error correction' in a feedback loop. ' {$STAMP BS2}' {$PBASIC 2.5} SetPoint CON 0 ' Set pointKi CON 10 ' Integral constant Current CON 0 ' Array index for current errorAccumulator CON 1 ' Array index for accumulated error sensorInput VAR Word ' Inputerror VAR Word(2) ' Two element error arrayi VAR Word ' Integral termdrive VAR Word ' Output DO DEBUG "Enter sensor input value: " DEBUGIN SDEC sensorInput ' Calculate error. error(Current) = SetPoint - sensorInput ' Calculate integral term. error(Accumulator) = error(Accumulator) + error(Current) i = Ki * error(Accumulator) ' Calculate output. drive = i ' Display values. DEBUG CR, CR, "ERROR", CR, SDEC ? SetPoint, SDEC ? sensorInput, SDEC ? error(Current), CR, "INTEGRAL", CR, SDEC ? Ki, SDEC ? error(accumulator), SDEC ? i, CR, "OUTPUT", CR, SDEC ? i, SDEC ? drive, CR, CR LOOP
Miten IntegralAlgorithm.bs2 toimii
Tämä ohjelma on ProportionalAlgorithm.bs2 muokattuna suorittamaan sen sijaan integraalilaskennan. Nyt on kaksi erilaista virhetyyppiä, joita pitää seurata, joten siellä virhemuuttujan array laajennettiin kahteen elementtiin. Muuttuja error(0) seuraa nykyistä virhettä ja error(1) seuraa kertynyttä virhettä. Vakiot Current CON 0 ja Accumulator CON 1 tekevät kirjanpidosta hieman järkevämpää error(current) ja error(accumulator).
Toinen muutos, joka tehtiin, on se, että virhe kumuloituu ja integraalilähtö lasketaan näillä kahdella lausekkeella:
' Calculate integral term.error(Accumulator) = error(Accumulator) + error(Current)i = Ki * error(Accumulator)
Sinun vuoro – integraalilähtön kiristäminen
Kuten olet ehkä tajunnut syöttämällä toistuvasti 3:n vianmäärityksen debug-päätteeseen, integraalikäyttölaitteen ulostulo voi tosiaankin lähteä juoksemaan. Voit käyttää MIN- ja MAX-operaattoreita estämään integraaliohjausta menemästä ulostulon kanssa liian pitkälle. Toistetaan servon offset-toiminto ja rajoitetaan ulostulo 650:stä 850:een.
- Muutetaan lauseke drive = i lausekkeeksi drive = i + Offset MIN 650 MAX 850.
- Ajeta ohjelma ja tarkista, että integraalilähtö on rajoitettu arvoihin 650:n ja 850:n välillä. Kokeile syöttää 2 toistuvasti ja sitten -2 toistuvasti.