Welcome & Happy Holidays!
Trang 1 của 2 12 CuốiCuối
Kết quả 1 đến 10 của 11
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    ADC với PIC16f877a trên IDE MPLAB X

    Chào tất cả mọi người, tiếp tục bài IO, thì hnay mình sẽ giới thiệu với mọi người về ADC trên VĐK PIC16f877a.
    + Đầu tiên mình xin giới thiệu qua về bộ ADC của PIC16f877a
    - Là bộ ADC 10bit với 8 kênh, Điện áp mẫu có thể lựa chọn bằng phần mềm sử dụng điện áp mẫu là VDD và GND hoặc lấy từ 2 chân VREF+ và VREF-
    (P/S: Nguyên tác của datasheet :
    "The A/D module has high and low-voltage reference input that is software selectable to some combination of VDD, VSS, RA2 or RA3.")
    - Các thanh ghi cấu hình bộ ADC:
    Thanh ghi ADCON0: thanh ghi cấu hình


    [IMG]http://*************/attachments/48597/[/IMG]


    Bit 7-6: Lựa chọn tần số chuyển đổi của bộ ADC


    [IMG]http://*************/attachments/48598/[/IMG]


    Bit 5-3 : Lựa chọn kênh chuyển đổi:


    [IMG]http://*************/attachments/48599/[/IMG]


    Bit 2:

    [IMG]http://*************/attachments/48600/[/IMG]


    Khi bộ ADC bắt đầu chuyển đổi, bit này ở mức 1, khi quá trình chuyển đổi hoàn thành bit này sẽ về mức 0 báo quá trình chuyển đổi hoàn tất
    Bit 1: ADON : Bit cho phép bộ ADC hoạt động
    ADON = 1: Bộ ADC được làm việc
    ADON = 0: Tắt bộ ADC

    Thanh ghi ADCON1:

    [IMG]http://*************/attachments/48609/[/IMG]



    Bit7 : ADFM:
    Do có 2 thanh ghi chưa giá trị ADC sau khi chuyển đổi, nhưng bộ ADC là ADC10bit nên sẽ có 6bit chứa giá trị '0' , việc xác định 6bit đó ở bên phía thanh ghi ADRESH hay ADRESL do bit ADFM này quyết định
    ADFM = 1 : 6bit này là 6bit cuối của thanh ghi ADRESH
    ADFM = 0: 6bit này là 6bit đầu tiên của thanh ghi ADRESL
    Bit6 : kết hợp với 2 bit7-6 của thanh ghi ADCON0 để cấu hình nguồn dao động cho bộ chuyển đối ADC
    Bit5-4: không sử dụng
    Bit 3-0: 4 bit này có chức năng cấu hình chức năng của từng chân trong bộ ADC (Mình dịch theo mình hiểu, cũng k được sát với datasheet)


    [IMG]http://*************/attachments/48602/[/IMG]



    + Còn cái phần ngắt ADC mọi người cần dùng thì hỏi nhé, mình sẽ hướng dẫn, còn mình thì rất hiếm khi dùng tới cái ngắt này.
    Thế là cơ bản về cấu hình rồi nhỉ

    *** Bây h mình hướng dẫn các bạn làm 1 bài đơn giản đọc 2 kênh ADC rồi hiển thị lên LCD

    B1: Cấu hình portA là input analog


    Mã:
    TRISA = 0xff;
    ADRESL = 0xff;
    ADRESH = 0x00;
    B2: Cấu hình bộ ADC


    Mã:
    ADCS0 = 1; //FRC (clock derived from a dedicated internal oscillator = 500 kHz max)
        ADCS1 = 0;
        ADCS2 = 0;
        // adc port config
        PCFG0 = 0;
        PCFG1 = 0;
        PCFG2 = 1;
        PCFG3 = 0; // select ADC0, ADC1, ADC3;
        ADON = 1;   // enable ADC
        ADFM = 1;   // Right justified
    B3: Viết hàm lựa chọn kênh


    Mã:
    void Hvl_ADCselectChannel(unsigned char chanel)
    {
        CHS0 = chanel;
        CHS1 = chanel>>1;
        CHS2 = chanel>>2;
    }
    B4: Viết hàm đọc ADC


    Mã:
    unsigned int Hvl_ADCRead(void)
    {
    
        uint16_t value=0;
        GO_DONE=1;
        while(GO_DONE);
        value = ADRESH << 8 | ADRESL;
        return value;
    }
    B5: Hàm main và hiển thị LCD (hàm LCD mình sẽ đính kèm trong project, các bạn tự tìm hiểu về nó nhé, cái này kinh điển quá rồi, mình không mún viết lại )


    Mã:
    int main(int argc, char** argv) {
        uint8_t str[20];
        TRISA = 0xff;
        ADRESL = 0xff;
        ADRESH = 0x00;
       // ANSELH = 0;
        ADCS0 = 1; //FRC (clock derived from a dedicated internal oscillator = 500 kHz max)
        ADCS1 = 0;
        ADCS2 = 0;
        // adc port config
        PCFG0 = 0;
        PCFG1 = 0;
        PCFG2 = 1;
        PCFG3 = 0; // select ADC0, ADC1, ADC3;
        ADON = 1;   // enable ADC
        ADFM = 1;   // Right justified
        Hvl_LCD_Init();
    
        Hvl_LCD_Puts("*************");
        __delay_ms(500);
        Hvl_LCD_Clear();
        while(1)
        {
            Hvl_ADCselectChannel(0);
            __delay_us(20);
            adc0value = Hvl_ADCRead();
            Hvl_ADCselectChannel(1);
            __delay_us(20);
            adc1value = Hvl_ADCRead();
            Hvl_LCD_Gotoxy(1,0);   
            sprintf(str,"ADC0 = %4d",adc0value);
            Hvl_LCD_Puts(str);
            Hvl_LCD_Gotoxy(1,2);
            sprintf(str,"ADC0 = %4d",adc1value);
            Hvl_LCD_Puts(str); 
            __delay_ms(300);
        }
        return (EXIT_SUCCESS);
    
    }
    [IMG]http://*************/attachments/48607/[/IMG]




    [IMG]http://*************/attachments/48608/[/IMG]


    Xong !
    Hi!

  2. #2
    Ngày tham gia
    Apr 2016
    Bài viết
    3
    add ơi cho em xin các file đính kèm được khai bao trong main với ạ.
    Em chạy lại cái chương trình mà bị báo lỗi thiếu
    Add xem lại giúp em với được ko ạ.
    Em cảm ơn!

  3. #3
    Ngày tham gia
    Jan 2016
    Bài viết
    0
    Trích dẫn Gửi bởi khanhpham92
    add ơi cho em xin các file đính kèm được khai bao trong main với ạ.
    Em chạy lại cái chương trình mà bị báo lỗi thiếu
    Add xem lại giúp em với được ko ạ.
    Em cảm ơn!
    Đều có đầy đủ trong file "adc.rar" đính kèm ở cuối bài mà bạn. Mình đang k ở hn, nếu b download file đính kèm về mà vẫn k có thì ra hn mình sẽ upload lại cho b.

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    file đính kèm báo thiếu add ak.

  5. #5
    Ngày tham gia
    Jun 2016
    Bài viết
    0
    Trích dẫn Gửi bởi khanhpham92
    file đính kèm báo thiếu add ak.
    Vậy ra hn mình sẽ ktra lại cho bạn

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    anh lộc cho em hỏi tần số hoạt động cho ADC có quan trọng không ạ? hay là chọn thế nào cũng được

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi thuygia21
    anh lộc cho em hỏi tần số hoạt động cho ADC có quan trọng không ạ? hay là chọn thế nào cũng được
    quan trọng chứ bạn nó quyết định tốc độ lấy mẫu của bộ adc mà
    thường thì mình để thời gian lấy mẫu nhanh nhất có thể

  8. #8
    Ngày tham gia
    Jun 2016
    Bài viết
    0
    Anh ơi cho em e muốn tắt chức năng ADC ở port E thì làm thế nào ạ! Em muốn lấy 3 chân để nối ra lcd mà nối xong thì LCD không chạy nối vào chân không phải chân ADC thì chạy bình thường,cho ADON=0 mà không tắt được ạ!

  9. #9
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi sword nguyen
    Anh ơi cho em e muốn tắt chức năng ADC ở port E thì làm thế nào ạ! Em muốn lấy 3 chân để nối ra lcd mà nối xong thì LCD không chạy nối vào chân không phải chân ADC thì chạy bình thường,cho ADON=0 mà không tắt được ạ!
    Bạn kiểm tra 2 thanh ghi TRISE và thanh ghi ADRESL, ADRESH đã cấu hình đúng chưa nhé

  10. #10
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi hoanglocmdc
    Bạn kiểm tra 2 thanh ghi TRISE và thanh ghi ADRESL, ADRESH đã cấu hình đúng chưa nhé
    Tức là em chỉ đang hiển thị LCD thôi ấy! e không đọc ADC mà chỉ cần sử dụng mấy chân ở port E để nối vào LCD ấy ạ! E đã cấu hình TRISE rồi nhưng mà 2 thanh ghi ADRESH và ADRESL thì chỉ khi dùng ADC mới cần thôi đúng không ạ!

 

 
Trang 1 của 2 12 CuốiCuối

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •  
Múi giờ GMT +7. Bây giờ là 10:26 AM. Diễn đàn sử dụng vBulletin® Phiên bản 4.2.5.
Bản quyền của 2018 vBulletin Solutions, Inc. Tất cả quyền được bảo lưu.
Ban quản trị không chịu trách nhiệm về nội dung do thành viên đăng.