Học liệu

Module ADC trong AVR

  • 16/01/2019
  • Học liệu

. Chuyển đổi dữ liệu tương tự (analog) sang dữ liệu số (digital).

      Trong các ứng dụng đo lường và điều khiển bằng vi điều khiển bộ chuyển đổi tương tự-số (ADC) là một thành phần rất quan trọng. Dữ liệu trong thế giới của chúng ta là các dữ liệu tương tự (analog). Ví dụ nhiệt độ không khí buổi sáng là 25oC và buổi trưa là 32oC, giữa hai mức giá trị này có vô số các giá trị liên tục mà nhiệt độ phải “đi qua” để có thể đạt mức 32oC từ 25oC, đại lượng nhiệt độ như thế gọi là một đại lượng analog. Trong khi đó, rõ ràng vi điều khiển là một thiết bị số (digital), các giá trị mà một vi điều khiển có thể thao tác là các con số rời rạc vì thực chất chúng được tạo thành từ sự kết hợp của hai mức 0 và 1. Ví dụ chúng ta muốn dùng một thanh ghi 8 bit trong vi điều khiển để lưu lại các giá trị nhiệt độ từ 0oC đến 255 oC, như chúng ta đã biết, một thanh ghi 8 bit có thể chứa tối đa 256 (28) giá trị nguyên từ 0 đến 255, như thế các mức nhiệt độ không nguyên như 28.123 oC sẽ không được ghi lại. Nói cách khác, chúng ta đã “số hóa” (digitalize) một dữ liệu analog thành một dữ liệu digital. Quá trình “số hóa” này thường được thực hiện bởi một thiết bị gọi là “bộ chuyển đổi tương tự - số hay đơn giản là ADC (Analog to Digital Converter).

      Có rất nhiều phương pháp chuyển đổi ADC, tôi không có ý định giải thích cụ thể các nguyên lý chuyển đổi này trong bài học về AVR, tuy nhiên tôi sẽ giới thiệu một cách chuyển đổi rất cơ bản và phổ biến để các bạn phần nào nắm được cách mà một bộ ADC làm việc. Phương pháp chuyển đổi mà tôi nói là phương pháp chuyển đổi trực tiếp (direct converting)  hoặc flash ADC.  Các bộ chuyển đổi ADC theo phương pháp này được cấu thành từ một dãy các bộ so sánh (như  opamp), các bộ so sánh được mắc song song và được kết nối trực tiếp với tín hiệu analog cần chuyển đổi. Một điện áp tham chiếu (reference) và một mạch chia áp được sử dụng để tạo ra các mức điện áp so sánh khác nhau cho mỗi bộ so sánh. Hình 1 mô tả một bộ chuyển đổi flash ADC có 4 bộ so sánh, Vin là tín hiệu analog cần chuyển đổi và giá trị sau chuyển đổi là các con số tạo thành từ sự kết hợp các mức nhị phân trên các chân Vo. Trong hình 1, bạn thấy rằng do anh hưởng của mạch chia áp (các điện trở mắc nối tiếp từ điện áp +15V đến ground), điện áp trên chân âm (chân -) của các bộ so sánh sẽ khác nhau. Trong lúc chuyển đổi, giả sử điện áp Vin lớn hơn điện áp “V-“ của bộ so sánh 1 (opamp ở phía thấp nhất trong mạch) nhưng lại nhỏ hơn điện áp V- của các bộ so sánh khác, khi đó ngõ Vo1 ở mức 1 và các ngõ Vo khác ở mức 0, chúng ta thu được một kết quả số. Một cách tương tự, nếu tăng điện áp Vin ta thu được các tổ hợp số khác nhau. Với mạch điện có 4 bộ so sánh như trong hình 1, sẽ có tất cả 5 trường hợp có thể xảy ra, hay nói theo cách khác điện áp analog Vin được chia thành  5 mức số khác nhau. Tuy nhiên, bạn chú ý là các ngõ Vo không phải là các bit của tín hiệu số ngõ ra, chúng chỉ là đại diện để tổ hợp thành tín hiệu số ngõ ra, dễ hiểu hơn chúng ta không sử dụng được các bit Vo trực tiếp mà cần một bộ giải mã (decoder). Trong bảng 1 tôi trình bày kết quả sau khi giải mã ứng với các tổ hợp của các ngõ Vo.

      Độ phân giải (resolution): như trong ví dụ trên, nếu mạch điện có 4 bộ so sánh, ngõ ra digital sẽ có 5 mức giá trị. Tương tự nếu mạch điện có 7 bộ so sánh thì sẽ có 8 mức giá trị có thể ở ngõ ra digital, khoảng cách giữa các mức tín hiệu  trong trường hợp 8 mức sẽ nhỏ hơn trường hợp 4 mức. Nói cách khác, mạch chuyển đổi với 7 bộ so sánh có giá trị digital ngõ ra “mịn” hơn khi chỉ có 4 bộ, độ “mịn” càng cao  tức độ phân giải (resolution) càng lớn. Khái niệm độ phân giải được dùng để chỉ số bit cần thiết để chứa hết các mức giá trị digital ngõ ra. Trong trường hợp có 8 mức giá trị ngõ ra, chúng ta cần 3 bit nhị phân để mã hóa hết các giá trị này, vì thế mạch chuyển đổi ADC với 7 bộ so sánh sẽ có độ phân giải là 3 bit. Một cách tổng quát, nếu một mạch chuyển đổi ADC có độ phân giải n bit thì sẽ có 2n mức giá trị có thể có ở ngõ ra digital. Để tạo ra một mạch chuyển đổi flash ADC có độ phân giải n bit, chúng ta cần đến 2n-1 bộ so sánh, giá trị này rất lớn khi thiết kế bộ chuyển đổi ADC có độ phân giải cao, vì thế các bộ chuyển đổi flash ADC thường có độ phân giải ít hơn 8 bit. Độ phân giải liên quan mật thiết đến chất lượng chuyển đổi ADC, việc lựa chọn độ phân giải phải phù hợp với độ chính xác yêu cầu và khả năng xử lý của bô điều khiển. Trong 2 mô tả một ví dụ “số hóa” một hàm sin analog thành dạng digital.

      Điện áp tham chiếu (reference voltage): Cùng một bộ chuyển đổi ADC nhưng có người muốn dùng cho các mức điện áp khác nhau, ví dụ người A muốn chuyển đổi điện áp trong khoảng 0-1V trong khi người B muốn dùng cho điện áp từ 0V đến 5V. Rõ ràng nếu hai người này dùng 2 bộ chuyển đổi ADC đều có khả năng chuyển đổi đến điện áp 5V thì người A đang “phí phạm” tính chính xác của thiết bị. Vấn đề sẽ được giải quyết bằng một đại lượng gọi là điện áp tham chiếu - Vref (reference voltage). Điện áp tham chiếu thường là giá trị điện áp lớn nhất mà bộ ADC có thể chuyển đổi. Trong các bộ ADC, Vref thường là thông số được đặt bởi người dùng, nó là điện áp lớn nhất mà thiết bị có thể chuyển đổi. Ví dụ, một bộ ADC 10 bit (độ phân giải) có Vref=3V, nếu điện áp ở ngõ vào là 1V thì giá trị số thu được sau khi chuyển đổi sẽ là: 1023x(1/3)=314. Trong đó 1023 là giá trị lớn nhất mà một bộ ADC 10 bit có thể tạo ra (1023=210-1). Vì điện áp tham chiếu ảnh hưởng đến độ chính xác của quá trình  chuyển đổi, chúng ta cần tính toán để chọn 1 điện áp tham chiếu phù hợp, không được nhỏ hơn giá trị lớn nhất của input nhưng cũng đừng quá lớn.

Chuyển đổi ADC trên AVR.

      Chip AVR ATmega32 của Atmel có tích hợp sẵn các bộ chuyển đổi ADC với độ phân giải 10 bit. Có tất cả 8 kênh đơn (các chân ADC0 đến ADC7), 16 tổ hợp chuyển đổi dạng so sánh, trong đó có 2 kênh so sánh có thể khuyếch đại. Bộ chuyển đổi ADC trên AVR không hoạt động theo nguyên lý flash ADC mà tôi đề cập ở phần trên, ADC trong AVR là loại chuyển đổi xấp xỉ lần lượt (successive approximation ADC).

      ADC trên AVR cần được “nuôi” bằng nguồn điện áp riêng ở chân AVCC, giá trị điện áp cấp cho AVCC không được khác nguồn nuôi chip (VCC) quá +/-0.3V. Nhiễu (noise) là vấn đề rất quan trọng khi sử dụng các bộ ADC, để giảm thiểu sai số chuyển đổi do nhiễu, nguồn cấp cho ADC cần phải được “lọc” (filter) kỹ càng. Một cách đơn giản để tạo nguồn AVCC là dùng một mạch LC kết nối từ nguồn VCC của chip như minh họa trong hình 3, đây là cách được gợi ý bởi nhà sản xuất AVR.

      Điện áp tham chiếu cho ADC trên AVR có thể được tạo bởi 3 nguồn: dùng điện áp tham chiếu nội 2.56V (cố định), dùng điện áp AVCC hoặc điện áp ngoài đặt trên chân VREF. Một lần nữa, bạn cần chú ý đến noise khi đặt điện áp tham chiếu, nếu dùng điện áp ngoài đặt trên chân VREF thì điện áp này phải được lọc thật tốt, nếu dùng điện áp tham chiếu nội  2.56V hoặc AVCC thì chân VREF cần được nối với một tụ điện. Việc chọn điện áp tham chiếu sẽ được đề cập chi tiết trong phần sử dụng ADC.
      Các chân trên PORTA của chip ATmega32 được dùng cho bộ ADC, chân PA0 tương ứng kênh ADC0 và chân PA7 tương ứng với kênh ADC7.

1. Thanh ghi.

      Có 4 thanh trong bộ ADC trên AVR trong đó có 2 thanh ghi data chứa dữ liệu sau khi chuyển đổi, 2 thanh ghi điều khiển và chứa trạng thái của ADC.

      - ADMUX (ADC Multiplexer Selection Register): là 1 thanh ghi 8 bit điều khiển việc chọn điện áp tham chiếu, kênh và chế độ hoạt động của ADC

 

2. Sử dụng ADC- Chuyển đổi đơn kênh.

      Khái niệm đơn kênh được hiểu là đại lượng cần chuyển đổi là các điện áp đặt trực tiếp trên các chân analog của chip, giá trị điện áp này được so sánh với 0V của chip, hay nói một cách khác, điện áp cần chuyển đổi và chip AVR có “mass chung”. Chúng ta sẽ minh họa cách sử dụng ADC trên AVR ở chế độ đơn kênh bằng ví dụ đọc và hiển thị giá trị ADC trên các LED 7 đoạn. Như minh họa trong hình 4, chúng ta sẽ dùng 4 LED để hiển thị 4 chữ số của kết quả, do chúng ta đều biết ADC trên AVR có độ phân giải 10 bit nên kết quả chuyển đổi tối đa là 1023, 4 LED là đủ để hiển thị kết quả này. 4 chip 7447 được dùng để điều khiển 4 LED, chúng ta cần 16 đường để xuất dữ liệu hiển thị lên 4 LED vì thế PORTB và PORTC sẽ được dùng cho mục đích này. 4 bit cao của PORTC(PC4:7) chứa chữ số hàng nghìn của kết quả, 4 bit thấp PC0:3 chứa chữ số hàng trăm, 4 bit cao của PORTB(PB4:7) dùng xuất chữ số hàng chục và 4 bit PB0:3 dành cho chữ số hàng đơn vị. Đại lượng cần chuyển đổi là điện áp trên chân ADC0 (kênh 0 của ADC, chân 0 trong PORTA chip ATmega32), điện áp được tạo ra bằng một biến trở RV1. Thay đổi giá trị biến trở, điện áp rơi trên ADC0 thay đổi và được cập nhật trực tiếp trên các LED. Giá trị hiển thị trên LED không phải là giá trị điện áp mà là giá trị tương đối sau khi chuyển đổi. Trong ví dụ này, tôi sẽ trình bày dạng tổng quát, việc đọc ADC và hiển thị LED được viết trong các chương trình con tương ứng. Bằng cách này, các bạn có thể dễ dàng sửa đổi và mở rộng ví dụ sau này.

 

Các tin khác