2015. június 1., hétfő

Digitális voltmérő

Üdvözöllek Kedves Olvasó!



A mai cikkemben egy olyan voltmérő berendezést ismerhetsz meg, amely bármely eszközbe és programba beépíthető akár mint önálló eszköz is funkcionálhat.












Amikor elkezdtem rajta dolgozni még ötletem nem volt, hogy hogyan oldjam meg. Eleinte a legkomolyabb, legerősebb PIC-ekre írtam meg a programot, bonyolult képletekkel és komoly IC terhelő feladatokkal.

Végül aztán valami felindulásból elölről kezdtem az egész projektet és megtaláltam az ideális megoldást arra, hogy hogyan lehet könnyen és egyszerűen a voltot megmérni.

Ezzel az egyszerű voltmérővel 0-tól 50 voltig 0.01 Volt pontossággal lehet mérni, viszont ehhez drága alkatrészek szükségesek.

Az áramkörben lévő két ellenállásnak a lehető legpontosabbnak kell lennie.

A program felépítése:
float volt_read;
char ii[2];

void main() {
  ADC_Init();
  UART1_Init(9600);
  Delay_ms(200);
  while(1) {
    volt_read=ADC_Read(0);
    volt_read=volt_read*50/1023;
    FloatToStr(volt_read, ii);
    URART1_Write(ii);
    Delay_ms(300);
  }
}

Ennyi lenne a teljes program.

Hex fájlt most sajnos nem tudok közzétenni, mivel a programot fejből írtam meg ebben a pillanatban, és nincs ilyen egyszerű megoldás készen.

A működése röviden:
Az IC analóg lábai közül a 0-s számún mérjük az értéket.

Mivel 50 volt a méréshatár így ez 50-nél 1023-at adna, emiatt kell az 1023-as szorzás, majd az 50-el való osztás, aminek segítségével megkapjuk a pontos eredményt.

A float változó jellegéből kifolyólag 5 tizedesjegy pontossággal fogjuk megkapni az eredményünket, melyet ezek után az UART sima szövegként fog elküldeni a célhoz.

Ez természetesen kiváltható LCD-re való kiírással vagy 7 szegmenses kijelzőre való kiírással. 

Az áramkör, tehát a fizikai rész mindösszesen csak 2 ellenállást tartalmaz, egy 9kOhm-os darabot ami a mért pozitívra kötendő valamint egy 1kOhm-ost ami pedig a földre. Ezek találkoznak az analóg lábnál.

--[9kOhm]---,-----<> A0
            |
--[1kohm]---'

Ha nagyobb pontosságot szeretnénk akkor a 9kOhm-os ellenállás után beköthetünk egy apró potmétert, amivel finomhangolni tudjuk az áramkört.
Fontos, hogy nagy eséllyel nem találtok 9kohm-os ellenállást az általatok látogatott boltban, így érdemes két 18kOhm-osat venni és azokat párhuzamosan kötni.

Az program jelenlegi formájában minimum egy 18F szériába tartozó processzort igényel. Amennyiben például egy 16F877-essel szeretnénk használni a FloatToStr függvényt le kell cserélni a következő műveletsorra valamint hozzá kell adni 4 új változót:
unsigned char d1, d2, d3, d4;
...
d1=volt_read/1000;
d2=(volt_read%1000)/100;
d3=((volt_read%1000)%100)/10;
d4=((volt_read%1000)%100)%10;

Emellett ebben az esetben érdemes a float-ot long-ra átírni, ezzel helyet és energiát spórolunk az IC-n.

Ezzel a következőre változik a küldés menete:
UART1_Write(d1+48);
UART1_Write(d2+48);
UART1_Write_Text(",");
UART1_Write(d3+48);
UART1_Write(d4+48);

Más a programon belül nem változik, azt leszámítva, hogy a char ii[2] sor teljesen elhagyható, ebben a programban nem jön elő, kész program így:

float volt_read;
unsigned char d1, d2, d3, d4;

void main() {
  ADC_Init();
  UART1_Init(9600);
  Delay_ms(200);
  while(1) {
    volt_read=ADC_Read(0);
    volt_read=volt_read*5000/1023;

    d1=volt_read/1000;
    d2=(volt_read%1000)/100;
    d3=((volt_read%1000)%100)/10;
    d4=((volt_read%1000)%100)%10;

    UART1_Write(d1+48);
    UART1_Write(d2+48);
    UART1_Write_Text(",");
    UART1_Write(d3+48);
    UART1_Write(d4+48);

    Delay_ms(300);
  }
}

Ha tetszett a cikk térj vissza máskor is, újabb érdekességek várnak majd.
Az áramkör és a program felépítésében örömmel segítek és a már ismert hovanhenrik1@gmail.com címen örömmel válaszolok a kérdéseidre.

Ha segítség kell a megépítésben, programégetésben keress fel.

Hamarosan jelentkezem a következő 2 hét anyagával amit a modellezőknek szánok.
Első héten az autókat buszokat kamionokat veszem a listába majd a repülőket és a hajókat árasztom el különböző fényes ötletekkel.

Nincsenek megjegyzések:

Megjegyzés küldése