Ensto/Koodin dokumentaatio/Mittaus
Tässä koodimoduulissa on funktio ja sen apufunktio, jonka avulla AD-muuntimesta luetaan arvoja.
(Rivit 1-23)Tiedoston alussa tuodaan tarvittavia kirjastoja ja määritellään pinnit joilla suoritetaan SPI-kommunikaatiota. Meillä oli ongelmia saada SiPyn oma SPI-kommunikaatio kirjasto toimimaan, joten toteutimme sen itse pinnien avulla.
ChipPin on pinni, joka täytyy sammuttaa ennen kuin AD-muuntimen kanssa aletaan juttelemaan ja aktivoida, kun kommunikointi loppuu.
MOSI on Master-Out-Slave-In-pinni, eli se on mikrokontrollerin ulossyöttö, joka menee AD-muuntimeen. Mikrokontrolleri on siis Master ja AD-muunnin Slave.
MISO on Master-In-Slave-Out-pinni, eli sen avulla AD-muunnin siirtää dataa mikrokontrollerille.
Clock on pinni, joka lähettää AD-muuntimelle kellosignaalin. Aina kun Slave vastaanottaa uuden kellosignaalin, se ottaa vastaan uuden arvon MOSI-pinnistä tai(/ja) lähettää arvon MISO-pinniin.
Lisäksi asetetaan vref-muuttuja, joka on referenssijännite, jonka mittasimme SiPyn virtalähteestä. Mitattuja jännitteitä verrataan tähän.
(Rivit 61-69)Funktio adcRead on pääfunktio, jota kutsutaan pääohjelmasta. Se ottaa kaksi parametria; commandbits ja maxCur.
Commandbits on lista numeroita(nollia ja ykkösiä), jotka vastaavat haluttua AD-muuntimen kanavaa(mikä numerorivi vastaa mitäkin kanavaa voi nähdä AD-muuntimen dokumentaatiosta, AD-muuntimen nimi on MCP3208).
MaxCur kertoo mikä on kyseisen sensorin maksimivirta. Esimerkiksi päävaiheen sensorin alue on 0-50A, eli funktiota pitää vaiheen virtaa mitattaessa kutsua arvolla 50.
Itse funktiossa asetetaan value- ja i-muuttuja nollaan. Value-muuttujaan tallennetaan AD-muuntimen mittaustulos, joka kertoo sensorin ulostulojännitteen. While-loopin avulla otetaan kymmenestä arvosta pseudo-keskiarvo getReading-funktion avulla. Vertaamalla mitattua jännitettä referenssijännitteeseen ja kertomalla maksimivirralla, saamme varsinaisen virran, joka palautetaan.
(Rivit 23-59)Funktio getReading varsinaisesti kommunikoi AD-muuntimen kanssa. Se ottaa parametreikseen jälleen commandbits-muuttujan, mutta nyt myös ave-muuttujan. Ave on tähän mennessä laskettu pseudo-keskiarvo tehdyille mittauksille.
Aluksi asetetaan adcvalue-muuttuja nollaan. Tähän muuttujan tallennetaan AD-muuntimen ulostulo. ChipPin lasketaan alas, jotta kommunikaatio voi alkaa. Tämän jälkeen AD-muuntimelle lähetetään commandbits-lista yksi bitti kerrallaan. Tämä toimii joko laskemalla tai nostamalla MOSI-pinni. Tämän jälkeen lähetetään kellosignaali, eli kellopinni nostetaan ja lasketaan. Näin AD-muunnin tietää että sen pitää vastaanottaa yksi bitti. Lopuksi kahden viimeisen bitin, jota ei käytetä, yli hypätään kahdella kellosignaalilla.
Seuraavaksi AD-muunnin lähettää arvoja, jotka luetaan. AD-muunnin lähettää arvoja merkitsevimmästä bitistä(eli suurimman arvon) aloittaen ja se lähettää niitä 12. AD-muuntimen tarkkuus on siis 12-bittinen. Adcvalue-muuttujaan tallennetaan bittien arvot desimaalimuodossa. Bitin arvohan desimaaleina on bitinArvo*2^bitinSijaintiOikealta. Kun yksi arvo on luettu, lähetetään taas kellosignaali, joka kertoo AD-muuntimelle, että olemme valmis vastaanottamaan uuden arvon.
Lopulta lopetamme kommunikoinnin AD-muuntimen kanssa nostamalla ChipPinnin ylös. Sitten laskemme uuden pseudo-keskiarvon käyttämällä annettua arvoa ja mitattua arvoa. Mitattu arvo lasketaan adcvalue muuttujan avulla joka on väliltä 0-4095(2¹²-1, eli AD-muuntimen tarkkuus). Tämä jaetaan maksimiarvolla 4095 ja kerrotaan referenssijännitteellä. Sitten uusi jännite palautetaan.