Fórum témák

» Több friss téma
Cikkek » Arduino tápfeszültségének mérése
Arduino tápfeszültségének mérése
Szerző: Josi777, idő: Feb 2, 2021, Olvasva: 10815, Oldal olvasási idő: kb. 3 perc
Lapozás: OK   4 / 6

Miután az IDE nem tartalmazza az ADC regisztereinek a megváltoztatásához szükséges utasításokat, ezért azt magunknak kell végrehajtani. De szerencsére tartalmaz olyan lehetőséget, mellyel képesek vagyunk a processzor regisztereinek az érékét megváltoztatni. Ezek az _SFR_BYTE() és _BV() makrók. Ezek segítségével készítünk magunknak egy-egy makrót, mellyel a kívánt regiszter értékét tudjuk változtatni és kiolvasni. Ez a két makró a következő:

  1. #define sbi(sfr, bit)
  2. #define bit_is_set(sfr, bit)

Az elsővel egy regiszter meghatározott bitjét tudjuk megváltoztatni, míg a másodikkal egy regiszter egyik bitjének az állapotát ismerhetjük meg. Az első makróban a |= operandus egy bitenkénti VAGY művelet, aminek a végrehajtása után az eredmény a regiszterbe kerül. A második makróban az & operandus bitenkénti ÉS művelet, amivel ellenőrizni tudjuk egy regsziter bármelyik bitjének az állapotát.
A regiszter címét az sfr -ben, míg a bit számát a bit -ben kell megadni, majd létrehozunk 2 változót. Az egyikbe a tápfeszültség értéke fog kerülni, míg a másik egy számláló, amiben a mérés gyakoriságát tudjuk beállítani. Felesleges ugyanis minden egyes loop ciklusban megmérni egy lassan változó értéket. Célszerű a mérés gyakoriságát néhány másodpercben meghatározni. Itt használhatnánk a millis() függvényt is, de mivel a mérés gyakorisága nem igényel pontos időzítést, így inkább egy másik módszert használtam.

A setup() függvényben beállítjuk az ADMUX regiszter azon bitjeinek az értékét, melyekre szükségünk van.

  1. ADMUX = (0 << ADLAR) | (1 << REFS0) | (14 << MUX0)

Az ADMUX regiszter ADLAR nevű bitje határozza meg az átalakítás utáni érték hogyan helyezkedjen el a két regiszterben. Ugyanis a két regiszter 16 bites, míg az ADC csak 10 bites értéket ad. Lehetőségünk van, hogy ez a 10 bit a 16 bites regiszterben balra vagy jobbra legyen. Ezt jelenti az ADLAR megnevezés: Left Adjust Result. Mi ide nullát állítunk be, így nem lesz balra eltolva, azaz normál módon fog tárolódni. A REFS0 bit azt határozza meg, hogy az ADC pozitív referencia feszültség bemenete hova csatlakozzon. Nekünk ez a tápfeszültség. (Zárójelben jegyzem meg, hogy be lehet állítani a negatív referencia feszültség forrását is, de annak a megváltoztatására nincs szükségünk, így azt a GND-n hagyjuk.) Végül a MUX 4 bites értékét állítjuk be 14-re, azaz ezzel mondjuk meg, hogy az ADC bemenete a belső referencia feszültségre legyen csatlakoztatva.
Ezután elindítunk egy mérést:

  1. sbi(ADCSRA, ADSC)

Ezt a már korábban említett sbi() makróval tesszük. Az ADC ADCSRA regiszterének az ADSC bitjét 1-re állítjuk (ADC Start Conversion), ezzel jelezve, hogy el akarjuk indítani az ADC-t, majd várakozunk, hogy az analóg jel átalakítása befejeződhessen, de legfőképp azért, hogy a bekapcsolás utáni feszültség stabilizálódjon és ne mérjünk hamis értéket. Ez a várakozás függhet a lapkához csatlakoztatott áramkörtől és a tápfeszültség stabilitásától is, ezért ezt az értéket lehet, hogy szükséges megváltoztatni; vagy azt a módszert is választhatjuk - amennyiben nem szeretnénk a delay() függvényt használni -, hogy az első n darab mérést figyelmen kívül hagyjuk.
A loop-ban egy számláló értékét csökkentjük, majd a 0 értéknél elvégezzük az ADC kimeneti regisztereinek a kiolvasását. De ezt attól tesszük függővé, hogy végzett-e már az ADC az átalakítással.

  1. while(bit_is_set(ADCSRA,ADIF))

Itt addig várunk, amíg az ADIF jelző nem vált át 1-es értékre, ezzel jelezve, hogy bekerül a kimeneti regiszterekbe az analóg feszültségnek megfelelő érték. Elvileg erre nem lenne szükség, de azért van benne mégiscsak a programban, hogy ha valamilyen oknál fogva minden egyes loop ciklusban szükségünk lenne a tápfeszültség értékére, akkor is megfelelő értéket kapjunk.
Ez után történik a tápfeszültség értékének a kiszámítása.

Tapfeszultseg=(1024*1.1)/(ADCL+256*ADCH)

Ez után elindítjuk a következő ADC konverziót:

  1. sbi(ADCSRA, ADSC)

Majd a tápfeszültség értékét kiküldjük a soros monitorra:

  1. Serial.println(Tapfeszultseg);

Valamint beállítjuk azt az értéket, hogy hány loop ciklus után legyen ismét kiszámítva a tápfeszültség értéke:

  1. szamlalo=100000;


A cikk még nem ért véget, lapozz!
Következő: »»   4 / 6
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem