- ADC (Chuyển đổi tương tự sang kỹ thuật số) là gì
- ADC trong vi điều khiển AVR Atmega16
- Thành phần bắt buộc
- Sơ đồ mạch
- Thiết lập thanh ghi điều khiển ADC trong Atmega16
- Lập trình Atmega16 cho ADC
Một tính năng phổ biến được sử dụng trong hầu hết các ứng dụng nhúng là mô-đun ADC (Bộ chuyển đổi tương tự sang kỹ thuật số). Các Bộ chuyển đổi Analog sang kỹ thuật số này có thể đọc điện áp từ các cảm biến tương tự như Cảm biến nhiệt độ, Cảm biến nghiêng, Cảm biến dòng điện, Cảm biến linh hoạt, v.v. Trong hướng dẫn này, chúng ta sẽ tìm hiểu ADC là gì và Cách sử dụng ADC trong Atmega16. Hướng dẫn này bao gồm kết nối một chiết áp nhỏ với chân ADC của Atmega16 và 8 LED được sử dụng để hiển thị điện áp thay đổi của giá trị đầu ra ADC liên quan đến sự thay đổi trong giá trị đầu vào ADC.
Trước đây, chúng tôi đã giải thích ADC trong các bộ vi điều khiển khác:
- Cách sử dụng ADC trong ARM7 LPC2148 - Đo điện áp tương tự
- Cách sử dụng ADC trong STM32F103C8 - Đo điện áp tương tự
- Cách sử dụng ADC trong MSP430G2 - Đo điện áp tương tự
- Làm thế nào để sử dụng ADC trong Arduino Uno?
- Sử dụng Mô-đun ADC của Vi điều khiển PIC với MPLAB và XC8
ADC (Chuyển đổi tương tự sang kỹ thuật số) là gì
ADC là viết tắt của Analog to Digital Converter. Trong điện tử, ADC là một thiết bị chuyển đổi tín hiệu tương tự như dòng điện và điện áp thành mã kỹ thuật số (dạng nhị phân). Trong thế giới thực, hầu hết các tín hiệu đều là tín hiệu tương tự và bất kỳ bộ vi điều khiển hoặc bộ vi xử lý nào cũng hiểu được ngôn ngữ nhị phân hoặc kỹ thuật số (0 hoặc 1). Vì vậy, để làm cho vi điều khiển hiểu được các tín hiệu tương tự, chúng ta phải chuyển đổi các tín hiệu tương tự này thành dạng số. ADC thực hiện chính xác điều này cho chúng tôi. Có nhiều loại ADC có sẵn cho các ứng dụng khác nhau. Rất ít ADC phổ biến là flash, xấp xỉ liên tiếp và sigma-delta.
Loại ADC rẻ tiền nhất là Xấp xỉ kế tiếp và trong hướng dẫn này ADC xấp xỉ kế tiếp sẽ được sử dụng. Trong loại ADC gần đúng-kế tiếp, một loạt mã kỹ thuật số, mỗi mã tương ứng với mức tương tự cố định, được tạo liên tiếp. Một bộ đếm bên trong được sử dụng để so sánh với tín hiệu tương tự đang được chuyển đổi. Quá trình tạo ra bị dừng lại khi mức tương tự trở nên lớn hơn tín hiệu tương tự. Mã kỹ thuật số tương ứng với mức tương tự là biểu diễn kỹ thuật số mong muốn của tín hiệu tương tự. Điều này kết thúc lời giải thích nhỏ của chúng tôi về tính gần đúng liên tiếp.
Nếu bạn muốn khám phá ADC sâu hơn thì bạn có thể tham khảo hướng dẫn trước của chúng tôi về ADC. ADC có sẵn dưới dạng IC và cũng có các bộ vi điều khiển đi kèm với ADC sẵn có ngày nay. Trong hướng dẫn này, chúng tôi sẽ sử dụng ADC có sẵn của Atmega16. Hãy thảo luận về ADC có sẵn của Atmega16.
ADC trong vi điều khiển AVR Atmega16
Atmega16 có ADC 10 bit và 8 kênh sẵn có. 10 bit tương ứng với điều đó nếu điện áp đầu vào là 0-5V thì nó sẽ được chia thành giá trị 10 bit tức là 1024 mức giá trị Analog rời rạc (2 10 = 1024). Bây giờ 8 kênh tương ứng với 8 chân ADC chuyên dụng trên Atmega16, nơi mỗi chân có thể đọc điện áp Analog. Cổng hoàn chỉnh (GPIO33-GPIO40) dành riêng cho hoạt động của ADC. Theo mặc định, các chân PORTA là các chân IO chung, có nghĩa là các chân cổng được ghép nối. Để sử dụng các chân này làm chân ADC, chúng ta sẽ phải cấu hình các thanh ghi nhất định dành riêng cho điều khiển ADC. Đây là lý do tại sao các thanh ghi được gọi là thanh ghi điều khiển ADC. Hãy để chúng tôi thảo luận về cách thiết lập các thanh ghi này để bắt đầu vận hành ADC có sẵn.
Chân ADC trong Atmega16
Thành phần bắt buộc
- IC vi điều khiển Atmega16
- Bộ dao động tinh thể 16Mhz
- Hai tụ điện 100nF
- Hai tụ điện 22pF
- Nút ấn
- Dây nhảy
- Breadboard
- USBASP v2.0
- Led (Bất kỳ màu nào)
Sơ đồ mạch
Thiết lập thanh ghi điều khiển ADC trong Atmega16
1. Thanh ghi ADMUX (Thanh ghi lựa chọn bộ ghép kênh ADC) :
Thanh ghi ADMUX dùng để lựa chọn kênh ADC và chọn điện áp tham chiếu. Hình dưới đây cho thấy tổng quan về thanh ghi ADMUX. Mô tả được giải thích bên dưới.
- Bit 0-4: các bit chọn kênh.
MUX4 |
MUX3 |
MUX2 |
MUX1 |
MUX0 |
Kênh ADC đã được chọn |
0 |
0 |
0 |
0 |
0 |
ADC0 |
0 |
0 |
0 |
0 |
1 |
ADC1 |
0 |
0 |
0 |
1 |
0 |
ADC2 |
0 |
0 |
0 |
1 |
1 |
ADC3 |
0 |
0 |
1 |
0 |
0 |
ADC4 |
0 |
0 |
1 |
0 |
1 |
ADC5 |
0 |
0 |
1 |
1 |
0 |
ADC6 |
0 |
0 |
1 |
1 |
1 |
ADC7 |
- Bit-5: Nó được sử dụng để điều chỉnh kết quả sang phải hoặc trái.
ADLAR |
Sự miêu tả |
0 |
Điều chỉnh ngay kết quả |
1 |
Trái điều chỉnh kết quả |
- Bit 6-7: Chúng được sử dụng để chọn điện áp tham chiếu cho ADC.
REFS1 |
REFS0 |
Lựa chọn tham chiếu điện áp |
0 |
0 |
AREF, Vref nội bộ bị tắt |
0 |
1 |
AVcc với tụ điện bên ngoài ở chân AREF |
1 |
0 |
Kín đáo |
1 |
1 |
Tham chiếu điện áp 2,56 bên trong với tụ điện bên ngoài tại chân AREF |
Bây giờ hãy bắt đầu cấu hình các bit thanh ghi này trong chương trình để chúng ta có thể đọc và xuất Internal ADC tới Tất cả các Ghim của PORTC.
Lập trình Atmega16 cho ADC
Chương trình hoàn chỉnh được đưa ra dưới đây. Ghi chương trình trong Atmega16 bằng JTAG và Atmel studio và xoay chiết áp để thay đổi giá trị ADC. Ở đây, mã được giải thích từng dòng một.
Bắt đầu với việc tạo một hàm để đọc giá trị được chuyển đổi ADC. Sau đó chuyển giá trị kênh là 'chnl' trong hàm ADC_read .
unsigned int ADC_read (unsigned char chnl)
Giá trị kênh phải từ 0 đến 7 vì chúng tôi chỉ có 8 kênh ADC.
chnl = chnl & 0b00000111;
Bằng cách ghi '40' tức là '01000000' vào thanh ghi ADMUX, chúng tôi đã chọn PORTA0 làm ADC0 nơi đầu vào Analog sẽ được kết nối để chuyển đổi kỹ thuật số.
ADMUX = 0x40;
Bây giờ bước này liên quan đến quá trình chuyển đổi ADC, trong đó bằng cách ghi ONE vào ADSC Bit trong thanh ghi ADCSRA, chúng tôi bắt đầu chuyển đổi. Sau đó, đợi bit ADIF trả về giá trị khi quá trình chuyển đổi hoàn tất. Chúng tôi ngừng chuyển đổi bằng cách viết '1' tại Bit ADIF trong thanh ghi ADCSRA. Khi chuyển đổi hoàn tất thì trả về giá trị ADC.
ADCSRA - = (1 <
Ở đây điện áp tham chiếu ADC bên trong được chọn bằng cách đặt bit REFS0. Sau đó, bật ADC và chọn bộ định mức trước là 128.
ADMUX = (1 <
Bây giờ hãy lưu giá trị ADC và gửi đến PORTC. Trong PORTC, 8 đèn LED được kết nối sẽ hiển thị đầu ra kỹ thuật số ở định dạng 8 bit. Ví dụ chúng tôi đã trình bày thay đổi điện áp từ 0V đến 5V bằng cách sử dụng một nồi 1K.
i = ADC_read (0); PORTC = i;
Đồng hồ vạn năng kỹ thuật số được sử dụng để hiển thị điện áp đầu vào tương tự trong Chân ADC và 8 LED được sử dụng để hiển thị giá trị 8 Bit tương ứng của đầu ra ADC. Chỉ cần xoay Potentiometer và xem kết quả tương ứng trên đồng hồ vạn năng cũng như trên đèn LED phát sáng.
Mã hoàn chỉnh và video làm việc được đưa ra bên dưới.