Thứ Tư, 28 tháng 11, 2018

Bài 14. PIC 18F450 Chuyển Đổi ADC

Giới thiệu

  • Khi chúng ta giao diện cảm biến cho vi điều khiển, đầu ra của cảm biến nhiều lần tương tự trong tự nhiên. Nhưng vi điều khiển xử lý tín hiệu số.
  • Do đó chúng tôi sử dụng ADC ở giữa cảm biến và vi điều khiển. Nó chuyển đổi tín hiệu analog thành kỹ thuật số và đưa nó vào bộ vi điều khiển.
  • Có một số lượng lớn các ứng dụng của ADC như trong một ứng dụng sinh trắc học, Giám sát môi trường, Phát hiện rò rỉ khí vv
Vì vậy, bây giờ chúng ta hãy xem ADC trong PIC18F4550.
  • PIC18f4550 có bộ ADC 13 kênh 13 bit sẵn có.
  • 13 kênh của ADC được đặt tên là AN0-AN12. Nó có nghĩa là chúng ta có thể kết nối 13 cảm biến khác nhau cùng một lúc.
  • ADC 10 bit có nghĩa là:
  • Nó sẽ cung cấp số đếm kỹ thuật số trong khoảng 0-1023 (2 ^ 10).
Tính toán giá trị đầu ra kỹ thuật số

\ Độ phân giải ADC lớn = \ tfrac {Vref} {2 ^ n-1}                      \ Đầu ra kỹ thuật số lớn = \ tfrac {Vin} {Độ phân giải}


  • Để giữ cho mọi thứ đơn giản, chúng ta hãy xem xét rằng Vref là 5V,
           Đối với giá trị 0 / o kỹ thuật số 0Vin = 0
           Đối với giá trị 0 / p kỹ thuật số 5Vin = 1023 (10 bit)
           Đối với giá trị p / p kỹ thuật số 2.5Vin = 512 (10 bit)

Ghim cho kênh ADC

Các kênh ADC PIC18F4550


Đăng ký ADC của PIC18F4550

Các thanh ghi ADRESH (byte cao) và ADRESL (byte thấp) được sử dụng kết hợp để lưu trữ dữ liệu số được chuyển đổi tức là dữ liệu số. Nhưng dữ liệu chỉ rộng 10 bit nên sáu bit còn lại không được sử dụng.
ADCON0 : Đăng ký điều khiển A / D 0
ADCON0 Đăng ký
CHS3: CHS0 : Kênh tương tự chọn bit
 CHS3: CHS0
Kênh truyền hình
  Tên kênh
0000
Kênh 0
AN0
0001
Kênh 1
AN1
0010
Kênh 2
AN2
0011
Kênh 3
AN3
0100
Kênh số 4
AN4
0101
Kênh 5
AN5
0110
Kênh 6
AN6
0111
Kênh 7
AN7
1000
Kênh 8
AN8
1001
Kênh 9
AN9
1010
Kênh 10
AN10
1011
Kênh 11
AN11
1100
Kênh 12
AN12
GO / DONE ' : Bit trạng thái chuyển đổi A / D
Khi ADON = 1
          1 = Đang chuyển đổi A / D
          0 = A / D không hoạt động
ADON : A / D chuyển đổi kích hoạt / ON bit
1 = A / D chuyển đổi là ON (Bắt đầu chuyển đổi).
0 = Chuyển đổi A / D bị tắt.
ADCON1 : Đăng ký kiểm soát A / D 1
VCFG1 : bit cấu hình tham chiếu điện áp
1 = Vref -
0 = Vss
VCFG0 : bit cấu hình tham chiếu điện áp
1 = Vref +
0 = Vdd
PCFG3: PCFG0 : Các bit cấu hình cổng A / D:
Khi chốt ADC trong PIC18F4550 được ghép với nhiều chức năng khác. Vì vậy, các bit được sử dụng để de-multiplex chúng và sử dụng như pin đầu vào tương tự.
ADCON2 : Đăng ký kiểm soát A / D 2
ADCS2: ADCS0 : Các bit chọn chuyển đổi đồng hồ A / D:
Các bit này được sử dụng để gán đồng hồ cho ADC.
111 = F RC Clock bắt nguồn từ bộ tạo dao động A / D RC
110 = FOSC / 64
101 = FOSC / 16
100 = FOSC / 4
011 = F RC Clock bắt nguồn từ bộ dao động A / D RC
010 = FOSC / 32
001 = FOSC / 8
000 = FOSC / 2
ADFM : A / D Định dạng kết quả lựa chọn bit:
Kết quả 10 bit sẽ được đặt trong ADRESH (8-bit) và ADRESL (8-bit).
Xem xét dữ liệu 10 bit như sau:
1 = Right Rightified. Tuy nhiên, các bit 8 bit thấp hơn được giữ trong ADRESL và phần còn lại của MSB hai bit được giữ trong ADRESH. Và còn lại 6 bit (bit 2-7) của ADRESH đầy 0.                                                                 
0 = Căn trái. Tuy nhiên, 8 bit trên được giữ trong ADRESH và còn lại hai bit thấp hơn được đặt trong ADRESL ở vị trí bit 7-6. Và 6 bit thấp hơn còn lại của ADRESL chứa đầy 0.


ACQT2: ACQT0 : Thời gian chuyển đổi A / D Chọn bit:
Người dùng có thể lập trình thời gian mua lại.
Sau đây là thời gian chờ đợi tối thiểu trước khi có thể bắt đầu việc mua lại tiếp theo.
TAD = (Thời gian chuyển đổi A / D)
000 = 0 TAD. Thời gian chuyển đổi mặc định cho chuyển đổi quảng cáo.
001 = 2 TAD
010 = 4 TAD
011 = 6 TAD
100 = 8 TAD
101 = 12 TAD
110 = 16 TAD
111 = 20 TAD

Các bước lập trình

Khởi tạo
  1. Cấu hình đăng ký ADCON1 để chọn điện áp tham chiếu bằng cách sử dụng các bit VCFG1: VCFG0 và cũng cấu hình các chân cổng mà chúng tôi yêu cầu như một đầu vào tương tự sử dụng các bit PCFG3: PCFG0.
  2. Cấu hình ADCON2 Đăng ký để chọn định dạng kết quả A / D, đồng hồ A / D và thời gian chuyển đổi.
void ADC_Init()
{    
    TRISA = 0xFF; /* Set as input port */
    ADCON1 = 0x0E; /* Ref vtg is VDD and Configure pin as analog pin */
    ADCON2 = 0x92; /* Right Justified, 4Tad and Fosc/32. */
    ADRESH=0;  /* Flush ADC output Register */
    ADRESL=0;   
}   
Chuyển đổi A / D và Đọc các giá trị kỹ thuật số
  1. Cấu hình đăng ký ADCON0 để chọn một kênh mà chúng tôi yêu cầu sử dụng CHS3: CHS0.
  2. Bắt đầu chuyển đổi A / D bằng cách đặt bit ADON và Go / done 'bit của thanh ghi ADCON0.
  3. Chờ cho G0 / thực hiện 'bit được xóa khi chuyển đổi được hoàn thành.
  4. Sau đó sao chép dữ liệu số được lưu trữ trong ADRESH và ADRESL Register.
int ADC_Read(int channel)
{
    int digital;

    /* Channel 0 is selected i.e.(CHS3CHS2CHS1CHS0=0000) & ADC is disabled */
    ADCON0 =(ADCON0 & 0b11000011)|((channel<<2) & 0b00111100);  
    
    ADCON0 |= ((1<<ADON)|(1<<GO)); /*Enable ADC and start conversion*/

    /* Wait for End of conversion i.e. Go/done'=0 conversion completed */
    while(ADCON0bits.GO_nDONE==1);

    digital = (ADRESH*256) | (ADRESL); /*Combine 8-bit LSB and 2-bit MSB*/
    return(digital);
}

Ứng dụng
  • Ở đây chúng ta sẽ phát triển một ứng dụng ngắn sử dụng ADC nội bộ của PIC18f4550.
  • Trong này, chúng tôi sẽ giao diện chiết áp 1K được sử dụng để thay đổi điện áp.
  • Điện áp thay đổi này được áp dụng cho AN0 (kênh 0) của ADC và hiển thị giá trị này trên màn hình LCD 16x2.

Sơ đồ


Giao diện POT tới PIC18F4550 ADC

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <P18F4550.h>
#include "config_intosc.h" /* Header File for Configuration bits */
#include "LCD_8bit_file.h" /* Header File for LCD Functions */

void ADC_Init();
int ADC_Read(int);

#define vref 5.00  /* Reference Voltage is 5V*/
void main()
{    
    char data[10];    
    int digital;  
    float voltage;
    OSCCON=0x72;  /*Set internal Osc. frequency to 8 MHz*/
    LCD_Init();   /*Initialize 16x2 LCD*/
    ADC_Init();   /*Initialize 10-bit ADC*/
    
    LCD_String_xy(1,1,"Voltage is...");

    while(1)
    {        
        digital=ADC_Read(0);

 /*Convert digital value into analog voltage*/
        voltage= digital*((float)vref/(float)1023);  

 /*It is used to convert integer value to ASCII string*/
        sprintf(data,"%.2f",voltage);

        strcat(data," V"); /*Concatenate result and unit to print*/
        LCD_String_xy(2,4,data);/*Send string data for printing*/                
    }
    
}

void ADC_Init()
{    
    TRISA = 0xff;  /*Set as input port*/
    ADCON1 = 0x0e;    /*Ref vtg is VDD & Configure pin as analog pin*/    
    ADCON2 = 0x92;    /*Right Justified, 4Tad and Fosc/32. */
    ADRESH=0;     /*Flush ADC output Register*/
    ADRESL=0;   
}

int ADC_Read(int channel)
{
    int digital;
    ADCON0 =(ADCON0 & 0b11000011)|((channel<<2) & 0b00111100);

    /*channel 0 is selected i.e.(CHS3CHS2CHS1CHS0=0000)& ADC is disabled*/
    ADCON0 |= ((1<<ADON)|(1<<GO));/*Enable ADC and start conversion*/

    /*wait for End of conversion i.e. Go/done'=0 conversion completed*/
    while(ADCON0bits.GO_nDONE==1);

    digital = (ADRESH*256) | (ADRESL);/*Combine 8-bit LSB and 2-bit MSB*/
    return(digital);
}

Code mô phỏng

1 nhận xét:

  1. chào bác. e có xem hướng dẫn bài của bác rất dễ hiểu. có phần code mô phỏng sao e ko down dc ạ? bác xem lại dùm.

    Trả lờiXóa