Вы находитесь на странице: 1из 7

   

ADC Using PIC16F877A Contents

In this tutorial we are going to discuss how to use the inbuilt PIC16f877A ADC.
We will be reading the ADC values from chanel Zero and transmitted on UART at 9600 baudrate.

PIC16F877A ADC pins


PIC16F877A has an inbuilt 10 bit Successive Approximation ADC which is multiplexed among 8 input pins.
The A/D module has high and low-voltage reference input that is software selectable to some combination of VDD, VSS,
RA2 or RA3. With 5v as the Vref the resolution of Pic16f877a ADC can be determined as below: $$resolution of ADC =
Vref/(2^{10}-1) = 5/1023 =0.004887 = 4.887mv$$

The below table shows the ADC input pins multiplexed with other GPIO pins.
The ADC pin can be enabled by configuring the corresponding ACON1 register.
When the ADC function is selected for a pin ,then other Digital signals are disconnected from the ADC input pins.

Adc Channel Pic16f877a Pin Pin Function

0 RA0 AN0

1 RA1 AN1

2 RA2 AN2/VREF-

3 RA3 AN3/VREF+

4 RA5 AN4
2 RE0 AN5

3 RE1 AN6

4 RE2 AN7

ADC Registers
The below table shows the registers associated with PIC16F877A ADC.

Register Description

ADCON0 Used to Turn ON the ADC, Select the Sampling Freq and also Start the conversion.

ADCON1 Used to configure the gpio pins for ADC

ADRESH Holds the higher byte of ADC result

ADRESL Holds the lower byte of ADC result

Now lets see how to configure the individual registers for UART communication.

ADCON0

7 6 5 4 3 2 1 0

ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/DONE — ADON

ADCS2-ADCS0:A/D Conversion Clock Select bits

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)

GO/DONE: A/D Conversion Status bit


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

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
ADCON1
7 6 5 4 3 2 1 0

ADFM ADCS2 — — PCFG3 PCFG2 PCFG1 PCFG0

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’.

ADCS2: A/D Conversion Clock Select bit


Check ADCS1:ADCS0 of ADCON0 register.

PCFG3-PCFG0: A/D Port Configuration Control bits


Hardware Connections

Code
Below is the sample code to read the ADC value of channel0 and send it on UART at 9600 baud rate.
1 #include<pic16f877a.h>

2
3 #define SBIT_ADON 0

4 #define SBIT_CHS0 3
5 #define SBIT_ADFM 7

6
7 void delay(int cnt)
8 {

9 while(cnt--);
10 }

11
12 void ADC_Init()

13 {
14 ADCON0=0x00; // sampling freq=osc_freq/2,ADC off initially

15 ADCON1=(1<<SBIT_ADFM); // All pins are configured as Analog pins and ADC result is right justified
16 }

17
18
19 int ADC_Read(int adcChannel)
20 {

21 ADCON0 = (1<<SBIT_ADON) | (adcChannel<SBIT_CHS0); //select required channel and turn ON adc


22
23 delay(1000); //Acquisition Time(Wait for Charge Hold Capacitor to get charged )

24
25 GO=1; // Start ADC conversion

26 while(GO_DONE==1); // Wait for the conversion to complete


27 // GO_DONE bit will be cleared once conversion is complete

28
29 return((ADRESH<<8) + ADRESL); // return right justified 10-bit result

30 }
31
32
33 int main()

34 {
35 int adcValue=0;

36
37 TRISB = 0x00; // Configure PORTB and PORTD as output to display the ADC values on LEDs
38 TRISD = 0x00;

39
40
41 ADC_Init(); //Initialize the ADC module
42
43 while(1)
44 {

45 adcValue = ADC_Read(0); // Read the ADC value of channel zero


46
47 PORTB = (adcValue & 0xff); //Adc value displayed on LEDs connected to PORTB,PORTD
48 PORTD = (adcValue>>8) & 0x03; // PORTB will display lower 8-bits and PORTD higher 2-bits

49 }
50 }

pic16f877a_adcTest.c hosted with ❤ by GitHub view raw

Using ExploreEmbedded Libraries


1 #include "adc.h"
2 #include "uart.h"

3
4
5
6 int main()

7 {
8 int adcValue;

9
10 ADC_Init(); /* Initialize the ADC module */
11 UART_Init(9600); /* Initialize UART at 9600 baud rate */

12
13 while(1)

14 {

15 adcValue = ADC_GetAdcValue(0); // Read the ADC value of channel zero


16 UART_Printf("ADC0 Value:%4d \n\r",adcValue); // Send the value on UART

17 }

18
19 return (0);
20 }

pic16f877a_ADC.c hosted with ❤ by GitHub view raw

Downloads
Download the complete project folder from the below link:
Hardware design Files and Code Library

Have a opinion, suggestion , question or feedback about the article let it out here!

Category: PIC Tutorials

Subscribe to hear about our latest Explorations!

name@example.com SUBSCRIBE

Contact About Warranty Terms & Conditions Reward points 

   
Now shipping worldwide from India with 

Вам также может понравиться