ANALOG TO
DIGITAL
CONVERTOR
PIC18f452
INTRO
8 ADC’s (ANO-AN7) in PIC16f877a with 10-bit resolution
The A/D module has four registers. These registers are:
Used to configure
• 8- bit A/D Control Register 0 (ADCON0) settings of ADC
• 8- bit A/D Control Register 1 (ADCON1)
• 8- bit A/D Result High Register (ADRESH)
Hold binary result of
• 8- bit A/D Result Low Register (ADRESL) converted analog
signal
What an is an analog signal??
Is D.C voltage analog?
SOME TERMINOLIGIES
1. Resolution (n-bit): width of output data given by ADC
2. Conversion time: Time taken by ADC to convert analog signal to digital
3. Step Size: smallest step after which ADC provide us a new binary number
Step Size = (Vref+ - Vref-)/(2^n)
e.g for Vref=5v, n=10 step= 5/1024 = 4.88mv
4. Digital Data Output:
Dout = (Vin/StepSize)
e.g. if n=8-bit , vref = 2.56v , calculate binary output generated by ADC if a.)Vin= 1.7v, b.) Vin=2.1v
a.) step= 2.56/256 =10mv Dout=1.7v/10mv = 170 in decimal
ADC output= binary of 170=10101011
5. Tad conversion time per bit
For 10-bits, A/D conversion time = 12 Tad
Important parameter in clk selection of ADC ----- clk must be selected such that Tad>=1.6us
INSIDE ADCON0 REGISTER
bit 7-6 ADCS1:ADCS0: A/D Conversion Clock Select bits (ADCON0 bits in bold , ADCS2 bit is in
ADCON1 reg)
<ADCS2:ADCS1:ADCS0> Clock Conversion
0 00 FOSC/2
0 01 FOSC/8
0 10 FOSC/32
0 11 FRC (clock derived from the internal A/D RC oscillator)
1 00 FOSC/4
1 01 FOSC/16
1 10 FOSC/64
1 11 FRC (clock derived from the internal A/D RC oscillator)
Rule to select this clock?
clk must be selected such that Tad>=1.6us
E.g if XTAL=10Mhz, then for FOSC/2 we have … 10M/2=5Mhz
Tad=1/5M = 200ns <1.6us .. So its not valid clk
For FOSC/6??? And FOSC/32??? /32 is correct
INSIDE ADCON0 REGISTER
bit 5-3 CHS2:CHS0: Analog Channel Select bits
000 = channel 0, (AN0)
001 = channel 1, (AN1)
010 = channel 2, (AN2)
011 = channel 3, (AN3)
100 = channel 4, (AN4)
101 = channel 5, (AN5)
110 = channel 6, (AN6)
111 = channel 7, (AN7)
bit 2 GO/DONE’: A/D Conversion Status bit indicates whether conversion completed or not?
When ADON = 1:
1 = A/D conversion in progress (setting this bit starts the A/D conversion which is automatically
cleared by hardware when the A/D conversion is complete)
0 = A/D conversion not in progress
bit 1 Unimplemented: Read as '0'
bit 0 ADON: A/D On bit
1 = A/D converter module is powered up
0 = A/D converter module is shut-off and consumes no operating current
INSIDE ADCON1 REGISTER
bit 7 ADFM: A/D Result Format Select bit
1 = Right justified. Six (6) Most Significant bits of ADRESH are read as ’0’.
0 = Left justified. Six (6) Least Significant bits of ADRESL are read as ’0’.
bit 6 ADCS2: A/D Conversion Clock Select bit
Used to select clock source as explained in ADCON0
bit 5-4 Unimplemented: Read as '0'
INSIDE ADCON1 REGISTER
bit 3-0 PCFG3:PCFG0: A/D Port Configuration Control bits
A = Analog input
D = Digital I/O
C/R =
# of analog input channels /
# of ADC voltage references
PIC ADC INTERNAL BLOCK
DIAGRAM
ADC CODING STEPS
Load ADCON0 reg Load ADCON1 reg
Set Analog Channel Give Some delay of
as i/p • Result format? about 1ms to
• Channel?
• Pin settings? capture i/p
• Clk Source?
completely
• ADON bit?
Wait till conversion
Goto next step Take binary result is complete by Start conversion by
according your from ADRESL and checking DONE bit setting GO bit to hi
requirement ADRESH registers
PROGRAM : WRITE A MIKRO-C PROGRAM TO GET DATA FROM CHANNEL0 (AN0/RA0) OF ADC AND
DISPLAYS THE SAMPLED RESULT ON PORTC AND PORTD. THIS IS DONE EVERY QUARTER OF
SECOND.
void main(void) What would be amendment in
{ this program if we want to
TRISC=0; display result of AN0 to PORTS,
then wait for 1 sec and then
TRISD=0;
display result of AN1 and then
TRISA.TRISA0=1; repeat this process
ADCON0= 0x81; // Fosc/64, Channel 0, A/D is on continuously???
ADCON1= 0xCE; // Right justified, Fosc/64, AN0 =Analog
while(1)
{
delay_ms(1); //Give A/D Channel time to sample
ADCON0.GO_DONE=1; //Start Converting
while(ADCON0.GO_DONE == 1); //wait for completion of conversion
PORTC=ADRESL; // Display low byte on PORT C
PORTD=ADRESH; //Display high byte on PORT D
delay_ms(250); //wait for one quarter of second
}
}
MIKROC LIBRARY FUNCTIONS FOR ADC
unsigned Adc_Read(char channel);
It returns 10-bit unsigned digitized number
of the specified analog channel. NOTE:
1. Don’t forget to do TRIS settings of analog
channel being used!!!
2. Also call function Adc_init() function to initialize
ADC module with RC internal clock.
// CODE: Fetch 10-bit digitized value against analog signal at AN2
unsigned int result; //variable to store data
TRISA.TRISA2=1; //AN2 as ip
Adc_init(); //initialize ADC module with internal RC clock
result = Adc_Read(2); //10-bit digitized result stored in result
PRACTICE: Do the code done in previous slides using library functions.
A/D CONVERTER ELECTRICAL
CHARACTERISTICS
Go through TABLE 22-21 of DATASHEET.
SCENA
RIO
Thermistor attached with AN2 of PIC….
Switch on AC relay attached with pin RC0 of PIC
And switch off HEATER relay attached with RD0 of PIC
whenever temp>30 degree celcius
Switch off AC relay attached with pin RC0 of PIC
And switch on HEATER relay attached with RD0 of PIC
whenever temp<25 degree celcius
Switch on both AC and HEATER relay otherwise