Mikrovaldiklio vidinio analogas-kodas keitiklio valdymas (4)
Praėjusiame straipsnyje aptarėme keitiklio veikimo principus bei paklaidas. Šiame straipsnyje pasimokysime valdyti mikrovaldiklio vidinį analogas-kodas keitiklį.
Prisijunk prie technologijos.lt komandos!
Laisvas grafikas, uždarbis, daug įdomių veiklų. Patirtis nebūtina, reikia tik entuziazmo.
Sudomino? Užpildyk šią anketą!
Jeigu dar neskaitėte pirmosios straipsnio dalies apie keitiklius analogas kodas ir jų veikimą, tą galite padaryti paspaudę šią nuorodą.
PIC18F14L22 mikrovaldiklyje įdiegtas 10 skilčių 12 kanalų analogas-kodas keitiklis, kurio struktūrinė schema pateikta 1 pav.
Mikrovaldiklis gali atlikti dvylikos kanalų (AN0 – AN11) įtampos keitimą, reikiamas kanalas parenkamas specialiojo registro ADCON0 bitų CHS<3:0> pagalba.
Keitiklio darbo laikinė diagrama pateikta 2 pav.
Iš 2 pav. matyti, kad įtampos keitimo procesas susideda iš dviejų pagrindinių dalių – vidinio keitiklio kondensatoriaus įkrovimo (Asquisition time) bei įtampos keitimo laiko (Conversion). Įjungus keitiklį bei nustačius paleidimo (GO) bitą, vidinis keitiklio kondensatorius prijungimas prie analoginio įėjimo ir įkraunamas iki matuojamos įtampos lygio. Šis kondensatorius padeda išvengti datavimo paklaidos, kuri atsirastų, jei įėjimo įtampa pakistų keitimo metu.
Įkrovus kondensatorius atjungiamas nuo analoginio įėjimo ir pradedamas keitimo procesas. Žinant šių procesų trukmę, galima apskaičiuoti laiką, reikalingą vienai įtampos vertei pakeisti į kodą:
Visas_keitimo_laikas = įkrovimo_laikas + keitimo_laikas + iškrovimo laikas;
Šioje formulėje nurodytas įkrovimo_laikas gali būti nustatytas nuo 2TAD iki 20TAD ir priklauso nuo įvairių sąlygų – aplinkos temperatūros, mikrovaldiklio maitinimo įtampos, matuojamos įtampos šaltinio impedanso ir t.t. Keitimo laikas yra lygus 11TAD, kondensatoriaus iškrovimo ir naujo kanalo perjungimo laikas 2TAD. Analogas-kodas keitiklio periodas TAD rekomenduojamas 1-4 μs, todėl visas keitimo laikas gali būti apie 15-130 μs.
Norint pradėti įtampos keitimą, reikia atlikti šiuos pagrindinius žingsnius:
-
1 žingsnis. Nustatyti atitinkamą mikrovaldiklio išvadą kaip analoginį įėjimą;
-
2 žingsnis. Nustatyti analogas-kodas keitiklio atramines įtampas;
-
3 žingsnis. Nustatyti rezultatu lygiavimą, keitimo dažnį bei kondensatoriaus įkrovimo laiką;
-
4 žingsnis. Nustatyti įėjimo kanalą bei įjungti keitiklį;
-
5 žingsnis. Paleisti keitimą.
Programos pavyzdys:
/****************************************************
* Programa C kalba "Analogas-kodas keitiklis"
* Mikrovaldiklis: PIC18F14K22
* Daznis: 16MHz
*****************************************************/
/** I N C L U D E S *********************************/
#include <p18cxxx.h>
/** C O N F I G U R A T I O N ***********************/
#pragma config FOSC = IRC //vidinis RC rezonatorius
#pragma config WDTEN = OFF //Watchdog Off
#pragma config LVP = OFF //Low voltage program Off
/** F U N C T I O N S *******************************/
void delay (unsigned int ms)
{
unsigned int i;
while (ms--) {
for (i = 0; i < 332; i++)
;
}
}
/** M A I N *****************************************/
void main(void)
{
float skaicius = 0; //kintamasis skaiciui
OSCCONbits.IRCF2 = 1; //Vidinis RC rezonatorius
OSCCONbits.IRCF1 = 1; //nustatomas 16MHz
OSCCONbits.IRCF0 = 1;
ANSEL = 0b00000010; //AN1 - analoginis iejimas
ANSELH = 0b0000;
PORTA = 0;
TRISA = 0b00010; //RA1 - iejimas
PORTB = 0;
TRISB = 0;
PORTC = 0;
TRISC = 0; //visi PORTC isvadai - isejimai
//Analogas-kodas keitiklio nustatymai ir ijungimas
ADCON1 = 0x00; //Vref+ = Vdd, Vref- = Vss
ADCON2 = 0b10111101; //lygiavimas-des., Fosc/16, Tacq=20Tad
ADCON0 = 0b00000101; //AN1 kanalas, ijungiamas keitiklis
while (1)
{
ADCON0bits.GO = 1; //Paleidziamas keitimas
while (ADCON0bits.GO == 1); //Laukiama keitimo pabaigos
// keitimo rezultatas – kodas
skaicius = ((unsigned int)ADRESH << 8) | (unsigned int)ADRESL;
//keitimo rezultatas - itampa
skaicius = skaičius * 0.00488;
//
//vartotojo programos kodas – rezultato atvaizdavimas ar pan.
//
delay(100); //100ms velinimas
} //end while()
}
Pateiktame programos pavyzdyje atliekamas AN1 kanalo įtampos (mikrovaldiklio išvadas RA1) keitimas. Komanda
skaicius = ((unsigned int)ADRESH << 8) | (unsigned int)ADRESL;
nuskaitomas įtampą atitinkantis 10 skilčių kodas nuo 0 iki 1023. Šį kodą padauginus iš 0,00488 V, gausime įėjimo įtampos reikšmę voltais.