Mục lục:

Giới thiệu về ADC trong Vi điều khiển AVR - cho người mới bắt đầu: 14 bước
Giới thiệu về ADC trong Vi điều khiển AVR - cho người mới bắt đầu: 14 bước

Video: Giới thiệu về ADC trong Vi điều khiển AVR - cho người mới bắt đầu: 14 bước

Video: Giới thiệu về ADC trong Vi điều khiển AVR - cho người mới bắt đầu: 14 bước
Video: VI ĐIỀU KHIỂN Chương 4: Hoạt động của bộ chuyển đổi ADC 2024, Tháng bảy
Anonim
Giới thiệu về ADC trong Vi điều khiển AVR | cho những người mới bắt đầu
Giới thiệu về ADC trong Vi điều khiển AVR | cho những người mới bắt đầu

Trong hướng dẫn thid, bạn sẽ biết mọi thứ về ADC trong vi điều khiển avr

Bước 1: ADC là gì?

Bộ chuyển đổi ADC hay Analog to Digital cho phép một bộ chuyển đổi điện áp tương tự sang giá trị kỹ thuật số mà vi điều khiển có thể sử dụng. Có nhiều nguồn tín hiệu tương tự mà người ta có thể muốn đo. Có sẵn các cảm biến tương tự để đo nhiệt độ, cường độ ánh sáng, khoảng cách, vị trí và lực, chỉ là một số cảm biến.

Bước 2: Cách hoạt động của ADC trong AVR- Vi điều khiển

AVR ADC cho phép bộ vi điều khiển AVR chuyển đổi điện áp tương tự sang các giá trị kỹ thuật số với ít hoặc không có bộ phận bên ngoài. ATmega8 có ADC xấp xỉ liên tiếp 10 bit. ATmega8 có ADC 7 kênh tại PortC. ADC có một chân cấp điện áp tương tự riêng biệt, AVCC. AVCC không được chênh lệch quá ± 0,3V so với VCC. Tham chiếu điện áp có thể được tách ra bên ngoài tại chân AREF. AVCC được sử dụng làm tham chiếu điện áp. ADC cũng có thể được đặt để chạy liên tục (chế độ chạy tự do) hoặc chỉ thực hiện một chuyển đổi.

Bước 3: Công thức chuyển đổi ADC

Công thức chuyển đổi ADC
Công thức chuyển đổi ADC

Trong đó Vin là điện áp trên chân đầu vào đã chọn và Vref là tham chiếu điện áp đã chọn

Bước 4: Làm thế nào để cấu hình ADC trong ATmega8?

Làm thế nào để cấu hình ADC trong ATmega8?
Làm thế nào để cấu hình ADC trong ATmega8?

Các thanh ghi sau được sử dụng để triển khai ADC trong ATmega8

Lựa chọn bộ ghép kênh ADC

Bước 5: Lựa chọn ADLAR

Lựa chọn ADLAR
Lựa chọn ADLAR
Lựa chọn ADLAR
Lựa chọn ADLAR

Kết quả điều chỉnh trái của ADC Bit ADLAR ảnh hưởng đến việc trình bày kết quả chuyển đổi ADC trong thanh ghi dữ liệu ADC. Viết một vào ADLAR để điều chỉnh kết quả bên trái. Nếu không, kết quả được điều chỉnh đúng

Khi quá trình chuyển đổi ADC hoàn tất, kết quả được tìm thấy trong ADCH và ADCL Khi ADCL được đọc, Thanh ghi dữ liệu ADC không được cập nhật cho đến khi ADCH được đọc. Do đó, nếu kết quả được điều chỉnh và không yêu cầu độ chính xác quá 8 bit, thì chỉ cần đọc ADCH là đủ. Nếu không, ADCL phải được đọc trước, sau đó là ADCH. Bit chọn kênh tương tự Giá trị của các bit này chọn đầu vào tương tự nào được kết nối với ADC.

Bước 6: Lựa chọn ADCSRA

Lựa chọn ADCSRA
Lựa chọn ADCSRA
Lựa chọn ADCSRA
Lựa chọn ADCSRA

• Bit 7 - ADEN: ADC Enable Ghi bit này vào một sẽ kích hoạt ADC. Bằng cách ghi nó thành 0, ADC bị tắt

• Bit 6 - ADSC: ADC Bắt đầu Chuyển đổi Trong chế độ Chuyển đổi Đơn, ghi bit này vào một bit để bắt đầu mỗi chuyển đổi. Trong chế độ Chạy miễn phí, ghi bit này vào một bit để bắt đầu chuyển đổi đầu tiên.

• Bit 5 - ADFR: Chọn ADC Chạy Miễn phí Khi bit này được đặt (một), ADC sẽ hoạt động ở chế độ Chạy Tự do. Trong chế độ này, ADC lấy mẫu và cập nhật liên tục các Thanh ghi dữ liệu. Xóa bit này (không) sẽ chấm dứt chế độ Chạy Miễn phí.

• Bit 4 - ADIF: Cờ ngắt ADC Bit này được đặt khi quá trình chuyển đổi ADC hoàn tất và các thanh ghi dữ liệu được cập nhật. Ngắt hoàn thành chuyển đổi ADC được thực thi nếu bit ADIE và bit I trong SREG được đặt. ADIF bị xóa bởi phần cứng khi thực thi Véc tơ xử lý ngắt tương ứng. Ngoài ra, ADIF được xóa bằng cách ghi một logic vào cờ.

• Bit 3 - ADIE: Kích hoạt ngắt ADC Khi bit này được ghi vào một và bit I trong SREG được đặt, thì Ngắt hoàn thành chuyển đổi ADC sẽ được kích hoạt.

• Bits 2: 0 - ADPS2: 0: ADC Prescaler Chọn Bits Theo biểu dữ liệu, bảng định sẵn này cần được đặt sao cho tần số đầu vào ADC nằm trong khoảng từ 50 KHz đến 200 KHz. Đồng hồ ADC được lấy từ đồng hồ hệ thống với sự trợ giúp của ADPS2: 0 Các bit này xác định hệ số phân chia giữa tần số XTAL và đồng hồ đầu vào tới ADC.

Bước 7: Nếu bạn muốn lấy giá trị ADC, bạn cần phải hoàn thành một số công việc được liệt kê dưới đây

  • Đặt giá trị ADC
  • Định cấu hình chân đèn LED đầu ra
  • Định cấu hình Phần cứng ADC
  • Bật ADC
  • Bắt đầu chuyển đổi từ tương tự sang kỹ thuật số
  • WHILE Forever

NẾU Giá trị ADC Cao hơn thì Đặt giá trị, Bật LED ELSE Tắt LED

Bước 8: Đặt giá trị ADC

Mã: uint8_t ADCValue = 128;

Bước 9: Định cấu hình Pin LED đầu ra

Mã: DDRB | = (1 << PB1);

Bước 10: Cấu hình phần cứng ADC

Định cấu hình Phần cứng ADC

Điều này được thực hiện thông qua việc thiết lập các bit trong thanh ghi điều khiển cho ADC. Đầu tiên, hãy đặt prescalar cho ADC. Theo datasheet, prescalar này cần được thiết lập để tần số đầu vào ADC nằm trong khoảng từ 50 KHz đến 200 KHz. Đồng hồ ADC có nguồn gốc từ đồng hồ hệ thống. Với tần số hệ thống là 1MHz, bộ đếm trước là 8 sẽ dẫn đến tần số ADC là 125 Khz. Tỷ lệ đặt trước được đặt bởi các bit ADPS trong thanh ghi ADCSRA. Theo biểu dữ liệu, tất cả ba bit ADPS2: 0 phải được đặt thành 011 để có được 8 bộ đếm trước.

Mã: ADCSRA | = (0 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

Tiếp theo, hãy đặt điện áp tham chiếu ADC. Điều này được điều khiển bởi các bit REFS trong thanh ghi ADMUX. Sau đây đặt điện áp tham chiếu thành AVCC.

Mã: ADMUX | = (1 << REFS0);

Để đặt kênh được chuyển qua bộ ghép kênh thành ADC, các bit MUX trong thanh ghi ADMUX cần được đặt tương ứng. Vì chúng tôi đang sử dụng ADC5 ở đây

Mã: ADMUX & = 0xF0; ADMUX | = 5;

Để đưa ADC vào chế độ chạy tự do, hãy đặt bit ADFR được đặt tên phù hợp trong thanh ghi ADCSRA:

Mã: ADCSRA | = (1 << ADFR);

Một thay đổi cài đặt cuối cùng sẽ được thực hiện để giúp việc đọc giá trị ADC đơn giản hơn. Mặc dù ADC có độ phân giải 10 bit, nhưng nhiều thông tin này thường không cần thiết. Giá trị 10 bit này được chia thành hai thanh ghi 8 bit, ADCH và ADCL. Theo mặc định, 8 bit thấp nhất của giá trị ADC được tìm thấy trong ADCL, với hai bit trên là hai bit thấp nhất của ADCH. Bằng cách thiết lập bit ADLAR trong thanh ghi ADMUX, chúng ta có thể căn trái giá trị ADC. Điều này đặt 8 bit cao nhất của phép đo vào thanh ghi ADCH, với phần còn lại trong thanh ghi ADCL. Nếu sau đó chúng ta đọc thanh ghi ADCH, chúng ta nhận được giá trị 8 bit đại diện cho phép đo 0 đến 5 volt của chúng ta dưới dạng một số từ 0 đến 255. Về cơ bản, chúng ta đang chuyển phép đo ADC 10 bit thành 8 bit. Đây là mã để đặt bit ADLAR:

Mã số:

ADMUX | = (1 << ADLAR); Điều đó hoàn tất việc thiết lập phần cứng ADC cho ví dụ này. Cần đặt thêm hai bit trước khi ADC bắt đầu thực hiện các phép đo.

Bước 11: Bật ADC

Để bật ADC, hãy đặt bit ADEN trong ADCSRA:

Mã: ADCSRA | = (1 << ADEN);

Bước 12: Bắt đầu chuyển đổi từ tương tự sang kỹ thuật số

Để bắt đầu các phép đo ADC, bit ADSC trong ADCSRA cần được đặt:

Mã: ADCSRA | = (1 << ADSC);

Tại thời điểm này, ADC sẽ bắt đầu liên tục lấy mẫu điện áp được trình bày trên ADC5. Mã cho đến thời điểm này sẽ giống như sau:

Bước 13: WHILE Forever

Việc duy nhất cần làm là kiểm tra giá trị ADC và đặt các đèn LED để hiển thị chỉ báo cao / thấp. Vì số đọc ADC trong ADCH có giá trị lớn nhất là 255, nên giá trị thử nghiệm của th được chọn để xác định xem điện áp là cao hay thấp. Một câu lệnh IF / ELSE đơn giản trong vòng lặp FOR sẽ cho phép chúng tôi bật đúng đèn LED:

Mã số

if (ADCH> ADCValue)

{

PORTB | = (1 << PB0); // Bật đèn LED

}

khác

{

PORTB & = ~ (1 << PB0); // Tắt đèn LED

}

Bước 14: Cuối cùng, mã hoàn thành là

Mã số:

#bao gồm

int main (void)

{

uint8_t ADCValue = 128;

DDRB | = (1 << PB0); // Đặt LED1 làm đầu ra

ADCSRA | = (0 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // Đặt ADC prescalar thành 8 - // 125KHz tốc độ mẫu 1MHz

ADMUX | = (1 << REFS0); // Đặt tham chiếu ADC thành AVCC

ADMUX | = (1 << ADLAR); // Điều chỉnh bên trái kết quả ADC để cho phép dễ dàng đọc 8 bit

ADMUX & = 0xF0;

ADMUX | = 5; // Các giá trị MUX cần được thay đổi để sử dụng ADC0

ADCSRA | = (1 << ADFR); // Đặt ADC thành Chế độ chạy tự do

ADCSRA | = (1 << ADEN); // Bật ADC

ADCSRA | = (1 << ADSC); // Bắt đầu chuyển đổi A2D trong khi (1) // Vòng lặp mãi mãi

{

if (ADCH> ADCValue)

{

PORTB | = (1 << PB0); // Bật LED1

}

khác

{

PORTE & = ~ (1 << PB1); // Tắt LED1

}

}

trả về 0;

}

Lần đầu xuất bản hướng dẫn này Bấm vào đây

Đề xuất: