ADC module

2death

Cố Vấn CLB
Staff member
1. Chuẩn bị phần cứng:
Trong bài này chúng ta sử dụng biến trở kết nối với 1 chân ADC của PIC16F887.
Khi vặn biến trở thì mức điện áp vào chân ADC sẽ thay đổi từ 0-5V.

Sơ đồ nguyên lý (schematic):



- Các bạn có thể gắn trên breadboard, hàn trên mạch lỗ, hoặc làm mạch in.
- Biến trở có giá trị 10k (103), nên mua loại volume cho dễ vặn (tất nhiên là các loai nào khác cũng được)
- Chân ở giữa của biến trở là “chân chạy” thì các bạn hàn với trở 1k rồi nối vào 1 header để gắn vào chân ADC của PIC.

Kết nối:
+ Header source in: cấp nguồn 5VDC.
+ Header 1: Kết nối với 1 chân ADC bất kì của PIC (ANx).
- Khi vặn biến trở xuống vị trí (3) thì áp đọc vào là 0V.
- Khi vặn biến trở lên vị trí (1) --> Đọc về 5V, nếu không có điện trở R5 1kOhm hạn dòng thì chân I/O của PIC có khả năng sẽ chết.

2. Slide bài giảng: ADC.pdf

3. Sample code:
Chương trình sau đây có nhiệm vụ:
- Chọn kênh ADC là AN3.
- Cấu hình cho module ADC (xem phần chú thích trong code)
- Đọc kết quả chuyển đổi ADC và kiểm tra nếu áp ngõ vào analog > 2.5V thì bật các LEDs gắn ở PORTB lên.

Các phần cấu hình, khởi tạo, đọc kết quả ADC, ... đều được viết thành các chương trình con.
Các chú thích cần thiết được viết đầy đủ để có thể dễ dàng chỉnh sửa cấu hình khi cần.



PHP:
/****************************************************************
 *
 * www.payitforward.edu.vn
 *
 ****************************************************************/
/****************************************************************
 *
 * PIC Training Course
 *
 ****************************************************************/

/****************************************************************
 *
 *    Module        : adc_main.c
 *    Description  : Read ADC from AN3 channel
 *                         If ADC_result > 2.5V then Turn On LEDs
 *    Tool            : HI-TECH PIC
 *    Chip            : 16F887
 *     History       : 05/03/2011
 *
 *    Author        : Nguyen Tien Manh, CLB NCKH
 *    Notes          :
 *
 *
 ****************************************************************/


 /****************************************************************
 * IMPORT
 ****************************************************************/

#include <htc.h>
__CONFIG(XT & WDTDIS & PWRTEN & MCLREN & UNPROTECT & SWBOREN & 
        IESODIS & FCMDIS & LVPDIS & DEBUGDIS); //1st config. Word

__CONFIG(BORV21); //2st config. Word

#define _XTAL_FREQ     4000000


 /****************************************************************
 * EXTERN
 ****************************************************************/
/*none...*/

/*****************************************************************
GLOBAL VARIABLE
******************************************************************/
/*none...*/

/*****************************************************************
* ROUTINES
******************************************************************/
void port_init()
{
    ANSEL = 0x08;   // Chon kenh ADC AN3
    ANSELH = 0;
    TRISA3 = 1;      //RA3 phai la Input de doc ADC
    TRISB = 0;        //PortB de xuat LED nen la OutPut
    PORTB = 0xFF   // Tat het LED o portB
}

//----------------------------------------------------------------
void adc_init()
{
    // ADC conversion clock: = Fosc/8
        //            ADCS <1:0> = 00    Fosc/2
        //            ADCS <1:0> = 01    Fosc/8
        //            ADCS <1:0> = 10    Fosc/32
        //            ADCS <1:0> = 11    F_RC
    ADCS1 = 0;
    ADCS0 = 1;         
    
    // Voltage reference: Internal Vref
        //            VCFG <1:0> = 00    Internal Vref
        //            VCFG <1:0> = 11    External Vref
    VCFG1 = 0;
    VCFG0 = 0;
    
    // Select Input chanel: AN3
        //            CHS <3:0> = 0000    Select AN0
        //            CHS <3:0> = 0001    Select AN1
        //            CHS <3:0> = 0010    Select AN2
        //             ...
        //            CHS <3:0> = 1101    Select AN13
    CHS3 = 0;
    CHS2 = 0;
    CHS1 = 1;
    CHS0 = 1;
    
    // Result format: Right
        //                ADFM = 1 Right justified
        //                ADFM = 0 Left justified
    ADFM = 1; 
    
    // Turn on ADC Module
    ADON = 1;
    
    //delay to wait for adc module init.
    __delay_ms (1);
}

//----------------------------------------------------------------
//interrupt initialization
void int_init()
{
    GIE = 1;    //Global Interrupt Enable
    PEIE = 1;    //Peripheral Interrupt Enable
    ADIE = 1;    //ADC Interrupt Enable
    ADIF = 0;    //Clear ADC Interrupt Flag
}

//----------------------------------------------------------------
//Interrupt service rountine
void interrupt isr()
{
    int ADC_result;
    if (PEIE && ADIE && ADIF)
    {
        ADIF = 0;    //Clear ADC Interrupt Flag
        
        //Read ADC result
        ADC_result = (ADRESH<<8)|ADRESL;
        
        //V_in > 2.5V <=> ADC_result > 512
        if (ADC_result> 512)
        {
            PORTB = 0;    //Turn LEDs ON
        }
        else
        {
            PORTB = 0xFF;
        }
    }
}

 /****************************************************************
 * MAIN
 ****************************************************************/

/* -- void main (void)    -----------------------------------------
 *
 * Description    : Configure port, adc module and enable interrupt
 *                    then wait for ADC interrupt
 * Parameters    : none
 * Return        : don't care
 * Notes        :
 */

void main(void)
{
    port_init();
    adc_init();
    int_init();
    while(1)
    {
        __delay_us(50);    //delay between 2 AD conversions
        GODONE = 1;        //Set GODONE bit to start conversion
    };
}

/****************************************************************
 * END OF adc_main.c
 ****************************************************************/
 

lythongbk

Trứng gà
chị phương ơi cho em hỏi tại sao em copy code của bài giảng rồi built thử thì bị 1 lỗi là :
Executing: "C:\Program Files\HI-TECH Software\PICC\9.83\bin\picc.exe" --pass1 "D:\mplap\tu lam ADC\main.c" -q --chip=16F887 -P --runtime=default --opt=default -D__DEBUG=1 --rom=default --ram=default -g --asmlist "--errformat=Error [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s"
Error [192] D:\mplap\tu lam ADC\main.c; 88.1 undefined identifier "GODONE"
mà không biết làm sao hết.
mong chị giúp em với!!!!
 

Tan Sy Nguyen

Cố Vấn CLB
Staff member
bạn tìm thử trong file pic16f887.h xem thử cờ đó người ta định nghĩa là gì. có thể chỉ là GO thôi
chúc bạn may mắn
 

Manhdd

Cố Vấn CLB
Staff member
uhm. Trong bản Hi-tech mới nó là GO_DONE đó bạn!
 
Top