[VI ĐIỀU KHIỂN PIC] - BÀI 7: ANALOG (ADC) CỦA PIC TRONG CCS - BeeLab

Sunday, June 4, 2017

[VI ĐIỀU KHIỂN PIC] - BÀI 7: ANALOG (ADC) CỦA PIC TRONG CCS


I.  GIỚI THIỆU 
Ở chương  này khảo sát  vi điều khiển giao tiếp với vi mạch chuyển đổi tương tự sang số (ADC) và vi điều khiển có tích hợp ADC để thực hiện các ứng dụng trong đo lường và điều khiển.

Sau khi kết thúc chương này bạn có thể  kết nối vi điều khiển không có tích hợp bộ chuyển đổi ADC với các vi mạch ADC, sử dụng  được  vi điều khiển có tích hợp ADC, biết trình tự thực hiện quá trình chuyển đổi ADC, biết tính toán độ phân giải,  chuyển đổi và tính trung bình kết quả.

II.  ADC CỦA VI ĐIỀU KHIỂN PIC 16F887 

Vi điều khiển PIC 16F877A  có bộ chuyển đổi tín hiệu tương tự sang tín hiệu số ADC 10 bit đa hợp 8 kênh và PIC 16F887 có 14 kênh. Mạch ADC dùng cho các ứng dụng giao tiếp với tín hiệu tương tự  có thể nhận  từ các cảm biến như cảm biến nhiệt độ LM35, cảm biến áp suất, cảm biến độ ẩm,  cảm biến khoảng cách, …

Phần này sẽ khảo sát chi tiết khối ADC của PIC, các thanh ghi của khối ADC, trình tự thực hiện chuyển đổi, tập lệnh lập trình C cho ADC  và ứng dụng ADC để đo nhiệt độ.

pic-microcontrollers-examples-in-assembly-language-chapter-07-fig7-6

1.  KHẢO SÁT ADC CỦA PIC 16F887

ADC của PIC16F887 có sơ đồ khối như hình 7-1:


pic-microcontrollers-examples-in-assembly-language-chapter-07-fig7-1
Chức năng các thành phần:
  AN0 đến AN13 (analog) là 14 ngõ vào của 14 kênh tương tự được đưa đến mạch đa hợp. 

  CHS<3:0> là các ngõ vào chọn kênh của bộ đa hợp tương tự. 

  Tín hiệu kênh tương tự đã chọn sẽ được đưa đến bộ chuyển đổi ADC.

  Điện áp tham chiếu dương Vref+ có thể lập trình nối với nguồn cung cấp dương AVDD

hoặc điện áp tham chiếu bên ngoài nối với ngõ vào Vref+ của chân AN3, bit lựa chọn là 

VCFG0.

  Điện áp tham chiếu âm Vref-  có thể lập trình nối với nguồn cung cấp AV

SS hoặc điện áp tham chiếu bên ngoài nối với ngõ vào Vre- của chân AN2, bit lựa chọn là VCFG1.

  Hai ngõ vào Vref+ và Vref- có chức năng thiết lập độ phân giải cho ADC.

  Bit  ADON  có  chức  năng  cho  phép  ADC  hoạt  động  hoặc  tắt  bộ  ADC  khi  không  hoạt 

động để giảm công suất tiêu tán, ADON bằng 1 thì cho phép, bằng 0 tắt.

  Kết  quả  chuyển  đổi  là  số  nhị  phân  10  bit  sẽ  lưu vào  cặp  thanh  ghi  16  bit  có  tên  là ADRESH và ADRESL, 10 bit kết quả lưu vào thanh ghi 16 bit nên có dạng lưu là canh lề trái và canh lề phải tùy thuộc vào bit lựa chọn có tên ADFM.

ADC có 14 kênh nhưng mỗi thời điểm chỉ chuyển đổi 1 kênh và chuyển đổi  kênh nào thì phụ thuộc vào 4 bit chọn kênh CHS4:CHS0. Hai ngõ vào điện áp tham chiếu dương và âm có thể lập trình nối với nguồn VDD và VSS hoặc nhận điện áp tham chiếu từ bên ngoài qua 2 chân RA3 và RA2.

Khối ADC độc lập với CPU nên có thể hoạt động khi CPU đang ở chế độ ngủ do xung cung cấp cho ADC lấy từ dao động RC bên trong của khối ADC.

2.  KHẢO SÁT CÁC THANH GHI CỦA PIC 16F887

Khối ADC có 4 thanh ghi:

Thanh ghi lưu kết quả byte cao: ADRESH (A/D Result High Register)
Thanh ghi lưu kết quả byte thấp: ADRESL (A/D Result Low Register)
Thanh ghi điều khiển ADC thứ 0: ADCON0 (A/D Control Register 0)
Thanh ghi điều khiển ADC thứ 1: ADCON1 (A/D Control Register 1)
a.  Thanh ghi ADCON0 (ADC Control register)chứa các bit điều khiển khối ADC như sau:
pic-microcontrollers-examples-in-assembly-language-chapter-07-fig7-4


Bit 7-6  ADCS<1:0>: Các bit  lựa chọn xung chuyển đổi AD (AD Conversion Clock Select bits) :
00 = FOSC/201 = FOSC/810 = FOSC/3211 = FRC  (xung clock lấy từ bộ dao động nội bên trong có tần số lớn nhất là 500 kHz)




Bit 5-3  CHS<3:0>: Các bit lựa chọn kênh tương tự (Analog Channel Select bits) như bảng 7-1:



Bit 1 DONE/GO: bit báo trạng thái chuyển đổi ADC (A/D Conversion status bit)
Khi cho GO/DONE = 1 để bắt đầu thực hiện quá trình chuyển đổi.

Sau khi chuyển đổi xong thì mạch chuyển đổi làm bit GO/DONE xuống mức 0.

Bit 0  ADON: bit mở nguồn cho ADC hoạt động (AD ON bit):

         ADON = 1 có chức năng mở nguồn cho khối chuyển đổi ADC hoạt động.

         ADON = 0 sẽ tắt nguồn khối chuyển đổi ADC để giảm công suất tiêu thụ.

b.  Thanh ghi ADCON1 thiết lập các chân của port là tương tự hoặc xuất nhập số IO. 

pic-microcontrollers-examples-in-assembly-language-chapter-07-fig7-5


Bit 7  ADFM: bit lựa chọn định dạng kết quả ADC (AD Result Format Select bit):
ADFM = 1: có chức năng canh lề phải, 6 bit MSB của ADRESH có giá trị là "0".

ADFM = 0: có chức năng canh lề trái, 6 bit LSB của ADRESL có giá trị là "0".

Bit 5  VCFG1: bit lựa chọn điện áp tham chiếu (Voltage reference bit)

VCFG1 = 1: có chức năng nối điện áp tham chiếu Vref- với ngõ vào AN3.

VCFG1 = 0: có chức năng nối điện áp tham chiếu Vref- với VSS.

Bit 4  VCFG0: bit lựa chọn điện áp tham chiếu (Voltage reference bit)

VCFG0 = 1: có chức năng nối điện áp tham chiếu Vref+ với ngõ vào AN3.

VCFG0 = 0: có chức năng nối điện áp tham chiếu Vref+ với VDD

Bit 6, 3-0: chưa dùng nếu đọc sẽ có giá trị là „0‟

c.  Thanh ghi ADRESH và ADRESL

Cặp thanh ghi 16 bit ADRESH:  ADRESL dùng để lưu kết quả chuyển đổi 10 bit của ADC sau khi chuyển đổi xong. Do kết quả chỉ có 10 bit nhưng lưu trong cặp thanh ghi 16 bit   nên có 2 kiểu định dạng tùy  thuộc vào bit ADFM (ADC Format). 

Hình sau trình bày 2 kiểu định dạng của cặp thanh ghi kết quả:

pic-microcontrollers-examples-in-assembly-language-chapter-07-fig7-2

Chức năng của canh lề phục vụ cho 2 khả năng xử lý kết quả: nếu lấy kết quả 10 bit để xử lý thì nên chọn chế độ canh lề phải, còn nếu lấy kết quả 8 bit thì chọn chế độ canh lề trái và chỉ lấy kết quả của thanh ghi byte cao ADRESH, bỏ đi 2 bit có trọng số thấp nhất của thanh ghi ADRESL và chú ý đến tính toán giá trị, trong chương trình C nếu không khai báo thuộc tính ADC 10 bit thì phần mềm tự động lấy giá trị 8 bit cao.

3.  LỰA CHỌN NGUỒN XUNG CHO CHUYỂN ĐỔI ADC

Tần số xung clock cho bộ chuyển đổi ADC được lựa chọn bằng phần mềm bởi các bit ADCS nằm trong thanh ghi ADCON0. Có 4 lựa chọn cho nguồn xung clock như sau:

FOSC/2
FOSC/8
FOSC/32
FRC lấy từ bộ dao động bên trong.
Tần số xung clock tùy chọn phụ thuộc vào tần số bộ dao động như bảng 7-2:


Thời gian chuyển đổi ADC cho mỗi bit được xác định  bởi chu kỳ  TAD.  Để chuyển đổi  hoàn tất 10 bit sẽ dùng tối thiểu 11 chu kỳ TAD
pic-microcontrollers-examples-in-assembly-language-chapter-07-fig7-7
pic-microcontrollers-examples-in-assembly-language-chapter-07-fig7-3


4.  TRÌNH TỰ THỰC HIỆN CHUYỂN 
Để thực hiện chuyển đổi ADC thì phải thực hiện các bước sau:
  • Bước 1: Cấu hình cho port:Cấu hình cho các port ở chế độ ngõ vào tương tự.Không được định cấu hình cho các port ở chế độ xuất dữ liệu.
  • Bước 2: Cấu hình cho module ADC: Chọn xung clock cho chuyển đổi ADC.Định cấu hình cho điện áp chuẩn.Chọn kênh ngõ vào tương tự cần chuyển đổi.Chọn định dạng cho 2 thanh ghi lưu kết quả.Mở nguồn cho ADC.
  • Bước 3: Thiết lập cấu hình ngắt ADC nếu sử dụng: Xóa cờ báo ngắt ADIF của ADC.Cho bit ADIE bằng 1 để cho phép ADC ngắt.Cho bit PEIE bằng 1 để cho phép ngắt ngoại vi.Cho bit GIE bằng 1 để cho phép ngắt toàn cục.
  • Bước 4: Chờ hết thời gian ổn định theo yêu cầu.
  • Bước 5: Bắt đầu chuyển đổi bằng cách cho bit GO/DONE lên 1.
  • Bước 6: Kiểm tra chuyển đổi ADC kết thúc bằng cáchKiểm tra liên tục bit GO/DONE nếu về 0 thì quá trình chuyển đổi kết thúc. Nếu dùng ngắt thì chờ ngắt ADC  xảy ra.
  • Bước 7: Đọc cặp thanh ghi kết quả (ADRESH: ADRESL), xóa bit ADIF nếu dùng ngắt.
  • Bước 8: Thực hiện chuyển đổi kế tiếp. 

III.ADC trong CCS:​
Những sự lựa chọn này cho phép người sử dụng định hình thể và sử dụng bộ chuyển đổi từ tín hiệu tương tự sang tín hiệu số.Chúng chỉ có sẵn trên thiết bị với phần cứng ADC.Sự lựa chọn cho những chức năng và chỉ dẫn thay đổi phụ thuộc vào con chip và đã được liệt kê trong phần header file của thiết bị.Trên 1 vài thiết bị có 2 bộ ADC độc lập. đối với những chip này bộ ADC thứ 2 được định hình thể để sử dụng chức năng cài đặt ADC thứ cấp(Ví dụ setup_ADC2)
Những chức năng có liên quan:
1. Cài đặt chế độ ADC
Cú pháp: 

setup_adc (mode);
setup_adc2(mode);

Thông số: mode - chế độ tín hiệu tương tự sang tín hiệu số.Sự lựa chọn hợp lý thay đổi phụ thuộc vào thiết bị. Xem những thiết bị có tập tin .h cho tất cả sự lựa chọn.Một vài sự lựa chọn tiêu biểu bao gồm:
ADC_OFFADC_CLOCK_INTERNALADC_CLOCK_DIV_32

- Trả về: Không được định nghĩa

- Chức năng: Định hình thể chuyển từ tín hiệu tương tự sang tín hiệu số

- Tiện lợi:Chỉ có trong những thiết bị có bộ chuyển đổi tín hiệu tương tự sang tín hiệu số

- Yêu cầu:Những hằng số đã được định nghĩa trong tập tin .h của thiết bị

Ví dụ:
setup_adc_ports( ALL_ANALOG );
setup_adc(ADC_CLOCK_INTERNAL );
set_adc_channel( 0 );
value = read_adc();
setup_adc( ADC_OFF );

Ví dụ những tập tin: ex_admm.c

Xem thêm: 

setup_adc_ports(),
set_adc_channel(),
read_adc(),
#device, ADC overview, xem tập tin header của thiết bị đã được chọn

2. Thiết lập những chân ADC có sẵn để chuyển từ tín hiệu tương tự sang tín hiệu số

Cú pháp:

setup_adc_ports (value)
- Thông số: value Một hằng số được định nghĩa trong tập tin .h của thiết bị
Trả về: Không được định nghĩa
- Chức năng:Cài đặt những chân ADC là tín hiệu tương tự,tín hiệu số hoặc một sự kết hợp và điện áp tham chiếu để sử dụng khi tính tóan giá trị ADC.Sự kết hợp các chân tín hiệu tương tự đã được cho phép thay đổi phụ thuộc vào con chip và được định nghĩa bằng cách sử dụng từng bit OR để ghép những chân đã được chọn cùng với nhau.Kiểm tra thiết bị bao gồm tập tin các chân và điện áp tham chiếu đã được sắp đặt trong danh sách hòan chỉnh.
- Hằng số:
ALL_ANALOGNO_ANALOG là hợp lý cho tất cả con chip.
Một vài ví dụ khác định nghĩa chân là:
ANALOG_RA3_REF Kích họat tất cả các chân tín hiệu tương tự và chân RA3 là điện áp tham chiếu
RA0_RA1_RA3_ANALOG Chỉ có chân RA0,RA1,RA3 là tín hiệu tương tự
- Tiện lợi: Chức năng này có sẵn trong các thiết bị với phần cứng Analog/Digital
- Yêu cầu: Những hằng số đã được định nghĩa trong tập tin .h của thiết bị
Ví dụ:
- Tất cả các chân analog
setup_adc_ports( ALL_ANALOG );
- Chân A0,A1,A3 là analog,và tất cả các chân còn lại là digital. Điện áp +5V được sử dụng như điện áp tham chiếu
setup_adc_ports( RA0_RA1_RA3_ANALOG );
- Chân A0,A1 là analog,chân A3 được sử dụng cho điện áp tham chiếu và tất cả các chân còn lại là digital
setup_adc_ports( A0_RA1_ANALOGRA3_REF );
Ví dụ những tập tin: ex_admm.c 
Xem thêm:
setup_adc();
read_adc();
set_adc_channel();
ADC overview
3. Chỉ rõ những kênh dung để sử dụng cho việc gọi Analog/Digital
Cú pháp: 
set_adc_channel (chan);
- Thông số: Chân là số kênh được chọn.Số chân bắt đầu tại 0 và đã được đặt nhãn trong datasheet AN0,AN1
Trả về:Không được định nghĩa
- Chức năng: Chỉ rõ những kênh được sử dụng cho việc gọi lệnh READ_ADC().Hãy biết rằng bạn phải chờ 1 khoảng thời gian ngắn sau khi thay đổi kênh trước khi bạn có thể nhận được giá trị đọc hợp lý.Thời gian thay đổi phụ thuộc vào trở kháng của nguồn đầu vào.Khỏang 10us nói chung là tốt cho hầu hết các ứng dụng.Bạn không cần thay đổi kênh trước mỗi lần đọc nếu kênh không thay đổi
- Tiện lợi: Chức năng này có sẵn trong các thiết bị với phần cứng Analog/Digital
- Yêu cầu: Không cần thứ gì
Ví dụ:
set_adc_channel(2);
delay_us(10);
value = read_adc();
Ví dụ những tập tin: ex_admm.c 
Xem thêm:
read_adc(), setup_adc(), setup_adc_ports(), ADC overview
4. Bắt đầu quá trình chuyển đổi và đọc giá trị.Chế độ này có thể cũng điều khiển chức năng.
Cú pháp: 
value = read_adc ([mode])
- Thông số: mode là một thông số không bắt buộc.Nếu được sử dụng giá trị có thể:
ADC_START_AND_READ (Liên tục đọc,và đây là mặc định)
ADC_START_ONLY (Bắt đầu quá trình chuyển đổi và trả về giá trị)
ADC_READ_ONLY (Đọc kết quả chuyển đổi cuối cùng)
- Trả về: 8 bit hoặc 16 bit số nguyên phụ thuộc vào #DEVICE ADC= directive (directive:lời chỉ dẫn,8 hoặc 16).
- Chức năng: Đây là chức năng đọc giá trị số từ bộ chuyển đổi tín hiệu tương tự sang tín hiệu số. Gọi lệnh setup_adc(), setup_adc_ports() and set_adc_channel() nên được làm vài lần trước khi chức năng này được gọi. Dãy giá trị trả về phụ thuộc vào số lượng bit bộ chuyển đổi Analog/Digital trong con chip và sự sắp đặt trong DEVICE ADC= directive như sau:
#DEVICE 8 bit 10 bit 11 bit 12 bit 16 bit
ADC=8 00-FF 00-FF 00-FF 00-FF 00-FF
ADC=10 x 0-3FF X 0-3FF x
ADC=11 x x 0-7FF x x
ADC=16 0-FF00 0-FFC0 0-FFEO 0-FFF0 0-FFFF
Lưu ý: X không được định nghĩa
Tiện lợi: Chức năng này có sẵn trong các thiết bị với phần cứng Analog/Digital
Yêu cầu: Những chân cố định đã được định nghĩa trong tập tin .h của thiết bị
Ví dụ:
setup_adc( ADC_CLOCK_INTERNAL );
setup_adc_ports( ALL_ANALOG );
set_adc_channel(1);
while ( input(PIN_B0)
{
     delay_ms( 5000 );
     value = read_adc();
     printf("A/D value = %2x\n\r", value);
}
read_adc(ADC_START_ONLY);
sleep();
value=read_adc(ADC_READ_ONLY);
Ví dụ tập tin: ex_admm.c, ex_14kad.c
Xem thêm : 
setup_adc(),
set_adc_channel(),
setup_adc_ports(),
#DEVICE, ADC overview
ADC_done():Trả về 1 nếu bộ chuyển đổi đã hòan thành việc chuyển đổi của nó
Tiền xử lý có liên quan:
#DEVICE ADC=xx : Định hình thể read_adc rồi trả về kính thước.Ví dụ, sử dụng 1 con PIC với 10 bit A/D bạn có thể sử dụng 8 hoặc 10 cho xx- 8 sẽ trả về bye có trọng số cao nhất,10 sẽ trả về tòan bộ giá trị đọc A/D 10 bit
Các ngắt có liên quan:
INT_AD: Ngắt xảy ra khi quá trình chuyển đổi đã hòan tất
INT_ADOF: Ngắt xảy ra khi quá trình chuyển đổi trong thời gian chờ
Các tập tin có liên quan:
Không có,tất cả chức năng được cài đặt sẵn
Các thông số getenv() có liên quan:
ADC_CHANNELS Số kênh Analog/Digital
ADC_RESOLUTION Số lượng bit trả về bởi lệnh read_adc

code mẫu
float bientro;

void main()

{

   setup_adc_ports(AN0);//chon port AN0

   setup_adc(ADC_CLOCK_DIV_2);//thoi gian 0.1us

   lcd_init();

   while(TRUE)

   {

      //TODO: User Code

      set_adc_channel(0);//chon kenh 0 

      delay_us(100);//on dinh
      bientro=read_adc();//doc gia tri AN0
      lcd_gotoxy(1,1);
      printf(lcd_putc,"ADC: %f",bientro);
   }
}

Thế nào là ADC và sử dụng nhiều ADC