do-an-vi-dieu-khien-avr-ung-dung-do-nhiet-do-hien-thi-lcd-1602

Đồ án vi điều khiển avr - ứng dụng đo nhiệt độ hiển thị lcd 1602

Linh Kiện FPT 08/05/2020

Đồ Án Vi Điều Khiển AVR - Ứng Dụng Đo Nhiệt Độ Hiển Thị LCD 1602

 

Đồ Án Vi Điều Khiển AVR

 

 

Download Tài Liệu: Tại đây

Bạn Có File Tài Liệu - Hãy Share Cho Chúng Tôi: linhkienfpt.share@gmail.com

Thank You!!!!!

 

ATmega8: 

ATMega

– Vi xử lý ATmega8 có tốc độ xử lý tối đa lên tới 16MHz, đây là một tốc độ phù hợp với yêu cầu kỹ thuật của sản phẩm là thời gian đáp ứng không quá 1s.

– Vi xử lý ATmega8 có bộ nhớ đủ lớn: dung lượng bộ nhớ chương trình: 8 KB, bộ nhớ EEPROM: 512 Byte và dung lượng bộ nhớ RAM là 1 KB.

– Vi xử lý ATmega8 có khả năng chuyển đổi tương tự – số (ADC) với độ phân giải 10bit, như vậy từ mức 0V đến mức điện áp tham chiếu sẽ có 1024 mức giá trị điện áp số, với khoảng chia nhỏ như vậy sẽ hạn chế được sai số khi làm tròn. Cấu tạo của bộ ADC của ATmega8 là các khuếch đại thuật toán có trở kháng vào rất lớn nên coi như không có dòng vào,  nên khi đưa điện áp Vout của cảm biến vào bộ ADC thì kết cấu dòng điện trong mạch không thay đổi.

– Mức điện áp cung cấp và điện áp tham chiếu của ATmega8 vào khoảng từ 3 đến 5V, đây cũng là mức điện áp nằm trong khoảng khuyến nghị đối với cảm biến LM35 nên hai thiết bị này có thể dùng chung nguồn.

 

Giới thiệu bộ ADC trên AVR:

        ADC (Analog to Digital Converter) Chuyển đổi tín hiệu tương tự sang kỹ thuật số. Trên AVR được tích hợp 8 kênh ADC với độ phân giải 10bit, tức điện áp sẽ được chuyển đổi thành 1024 mức level dạng bậc thang.

        ADC được ứng dụng rất nhiều như đo nhiệt độ, đọc giá trị điện áp, tính dòng điện, đọc phím nhấn theo thang điện trở (trong tivi...), biến đổi tín hiệu âm thanh sang kỹ thuật số để lưu trữ,.... ADC có độ phân giải càng cao thì càng khó chế tạo và từ đó giá thành cũng tỉ lệ thuận, nhưng với AVR bạn khỏi phải no chuyện giá thành của các chip ADC, nó đã được tích hợp bên trong tất cả các chip AVR kể cả dòng nhỏ gọn như ATtiny.

Thiết kế nguồn cho bộ ADC:

 

bộ ADC trên AVR

 

Chân AVCC là chân cấp nguồn cho bộ ADC của AVR, riêng không chung với VCC của chip nha chú ý điều này.

Chân AREF là chân chọn điện áp tham chiếu ngoài của bộ ADC (AREF Max=5V) nó sẽ so sánh áp tham chiếu để cho ra các mức logic tương ứng kiểu tỷ lệ %. VD: AREF=5V, ADC input =2.5V tức bằng 50% AREF thì giá trị ADC là 1024/2=512.

Thiết kế nguồn như trên là lý tưởng cho các bộ ADC của AVR, nhưng trong thực tế nhằm giảm độ cồng kềnh và đã có các mạch nguồn ổn định thì ta chỉ cần có một con tụ lọc 104 là đủ

Công thức tính giá trị điện áp chuyển đổi:

           ADC 10bit: Vin = (Vref*ADC)/1024

           ADC 8bit: Vin = (Vref*ADC)/256

           Trong đó:

                        Vref là điện áp tham chiếu (Đơn vị: V)

                        ADC là giá trị sau chuyển đổi.

Các thanh ghi tham gia điều khiển ADC:

- ADMUX (ADC Multiplexer Selection Register) Là thanh ghi chọn điện áp tham chiếu và chọn kênh ADC

 

7 6 5 4 3 2 1 0
REFS1 REFS0 ADLAR   -   MUX3 MUX2 MUX1 MUX0

Trong đó:

    REFS1 và REFS0 Là 2bit chọn điện áp tham chiếu để so sánh, ta có bảng sau:

REFS1 REFS0 Giá trị điện áp
0 0 Bằng AREF đưa vào, mã HEX 0x00
0 1 Bằng AVCC đưa vào, mã HEX 0x40
1 0 Dự trữ - Không sử dụng
1 1 2.56V onchip, mã HEX 0xC0

     Tại sao lại có phần mã HEX trên thì ta sẽ xét trong phần lập trình.... Giá trị này là khi ADLAR=0

    ADLAR là bit sắp xếp 2 thanh ghi ADCH và ADCL, do bộ chuyển đổi ADC là 10bit nên ta phải có 2 thanh ghi 8bit để lưu giá trị chuyển đổi, việc sắp xếp này sẽ tùy vào sở thích của lập trình viên.

Các thanh ghi tham gia điều khiển ADC

 

MUX3:0 Là 4bit chọn kênh ADC có giá trị thập phân từ 0-7 tương ứng với kênh ADC0-ADC7. MUX3:0=1110: VBG=1.3V,  MUX3:0=1111: 0V GND

- ADCSRA Là thanh ghi điều khiển bộ ADC:

7 6 5 4 3 2 1 0
ADEN ADSC ADFR ADIF ADIE ADPS2 ADPS1 ADPS0

Trong đó:

   ADEN: Là bit cho phép bộ ADC hoạt động, nếu ta không set bit này lên 1 thì bộ ADC không hoạt động.

   ADSC là bit cho phép bộ ADC chuyển đổi, khi quá trình chuyển đổi hoàn tất bit này sẽ tự động được xóa về 0 và ta muốn bộ ADC chuyển đổi tiếp ta bắt buộc phải set lại bit này.

   ADFR Là bit cho chế độ liên tục chuyển đổi, Nếu set bit này thì bộ ADC sẽ liên tục chuyển đổi.

   ADIF là bit cờ ngắt, khi quá trình chuyển đổi hoàn tất thì bit này tự động được set lên 1, ta sẽ kiểm tra bit này để đảm bảo quá trình đọc ADC không bị lỗi.

   ADIE là bit cho phép ngắt bộ ADC. Khi chuyển đổi hoàn tất sẽ có một ngắt xảy ra nếu cho phép ngắt ADC

   ADPS2:0 là 3bit chọn xung nhịp cho bộ ADC, tốc độ chuyển đổi phụ thuộc vào 3 bit này. Chú ý chế độ 10bit sẽ chuyển đổi chậm hơn chế độ 8bit. Ta có bảng sau:

ADPS2 ADPS1 ADPS0 Xung nhịp
0 0 0 Fosc/2
0 0 1 Fosc/2
0 1 0 Fosc/4
0 1 1 Fosc/8
1 0 0 Fosc/16
1 0 1 Fosc/32
1 1 0 Fosc/64
1 1 1 Fosc/128

 

 

Lập trình đọc ADC theo kênh:

Khai báo thay thế đầu chương trình:

        #define ADC_VREF 0x00  //Lấy điện áp AREF để so sánh

Khởi tạo trong hàm main:

        ADMUX=ADC_VREF; //Đặt áp tham chiếu ban đầu
        ADCSRA=0x85; //Khởi tạo ADC, xung clock Fosc/32

Chương trình con đọc ADC đơn kênh 10bit:

unsigned int read_adc(unsigned char adc_input)
{
        ADMUX=adc_input | ADC_VREF;  //Chọn kênh ADC và điện áp so sánh
        ADCSRA|=0x40; //Start ADC
        while (!(ADCSRA & 0x10)); //Kiểm tra cờ ADC
        ADCSRA|=0x10;
        return ADCW; //Giá trị ADC 10bit
}

Chương trình con đọc ADC đơn kênh 8bit:

unsigned char read_adc(unsigned char adc_input)
{
        ADMUX=adc_input | ADC_VREF;  //Chọn kênh ADC và điện áp so sánh
        ADCSRA|=0x40; //Start ADC
        while (!(ADCSRA & 0x10)); //Kiểm tra cờ ADC
        ADCSRA|=0x10;
        return ADCH; //Giá trị ADC 8bit
}

Sử dụng hàm: adc=read_adc(0); //abc chứa giá trị ADC kênh 0

Lập trình đọc ADC sử dụng ngắt:

Khi ứng dụng của bạn đòi hỏi tốc độ mà nó lại bị giới hạn ở vòng lặp kiểm tra cờ ADC (vì quá trình chuyển đổi ADC sẽ mất một khoảng thời gian 13-260us) thì giải pháp là sử dụng ngắt, ngắt sẽ cho VXL hoạt động như đang chạy đa nhiệm. Khi nào chuyển đổi xong ta mới đọc giá trị, nó sẽ cải thiệt rất nhiều khi phải chờ vài trăm us để đọc dc ADC, khoảng thời gian đó ta có thể làm được rất nhiều việc khác vì AVR có tốc độ rất cao với chu kỳ lệnh T=1/Fosc khoảng vài chục ns (nano giây) tùy vào thạch anh mắc vào chip từ 1-16Mhz.

Việc sử dụng ngắt rất đơn giản ta chỉ việc khởi động ADC, chọn kênh, điện áp so sánh, set bit ngắt và Run. Chương trình ngắt sẽ như sau:

Khai báo thay thế đầu chương trình:

  #define ADC_VREF 0xC0  //Lấy điện áp 2.56V onchip để so sánh

Khởi tạo trong hàm main:

 ADMUX = 1 | ADC_VREF;  //Chọn kênh ADC1 và điện áp so sánh
 ADCSRA = 0xCD; //Start ADC, Fosc/32, Cho phép ngắt

  #asm("sei")  //Ngắt cục bộ

Chương trình ngắt:

unsigned int adc_data; //Biến lưu giá trị ADC

interrupt [ADC_INT] void adc_isr(void)
{

     adc_data=ADCW; //Lấy giá trị ADC 10bit

     ADCSRA|=0x40; //Tiếp tục chuyển đổi

}

Lập trình đọc nhiệt độ từ cảm biến nhiệt độ LM35 hiển thị lên LCD16x2

   LM35 là cảm biến nhiệt độ đầu ra là tín hiệu analog, cứ 10mV tương ứng với 1 độ C, VD: 250mV là 25 độ C

   Việc đọc giá trị từ cảm biến này rất đơn giản do nó có áp OUTPUT MAX nhỏ hơn 2.56V lên ta sử dụng luôn áp nội của AVR để so sánh sẽ chính xác hơn là dùng ổn áp ngoài cấp vào AREF.

   Với áp nội thì chúng ta không phải tính toán nhiều mà ở chế độ ADC8bit có 256 thang điện áp tương ứng 0-2.55V, từ đó suy ra cứ một giá trị ADC là ứng với 10mV. VD ADC=25 ứng với 25oC của LM35.

 

Ta sẽ có Code như sau:

#include >
#include <delay.h>
#include <alcd.h>
#define ADC_VREF 0xe0 //Lay ap 2.56V, ADLAR=1
unsigned char read_adc(unsigned char adc_input){
         ADMUX=adc_input | ADC_VREF; //Chon kenh ADC va ap so sanh
         ADCSRA|=0x40; //Start ADC
         while (!(ADCSRA & 0x10)); //Kiem tra co ADC
         ADCSRA|=0x10;
         return ADCH; //ADC 8bit
}
void temp(unsigned char z){ //Chuyen doi hien thi
         lcd_puts("Nhiet do: ");
         lcd_putchar((z/100)+48);
         lcd_putchar((z%100/10)+48);
         lcd_putchar((z%10)+48);
         lcd_puts("oC");
}
void main(void){
         ADMUX=ADC_VREF;
         ADCSRA=0x86; //Fosc/64
         lcd_init(16);
         lcd_puts("Do nhiet do...");
         delay_ms(2000);
         lcd_clear();
         lcd_puts("LinhkienFPT.vn");
         while (1){
                  lcd_gotoxy(0,1);
                  temp(read_adc(0)); //Show Temp
         }
}

 

Cửa hàng linh kiện điện tử FPT chuyên cũng cấp linh phụ kiện điện tử, mạch khuếch đại âm thanh, dụng cụ cầm taydụng cụ cơ khí.... Bán linh kiệnMua linh kiện
Là cửa hàng linh kiện điện tử tại Hà Nội cung cấp nhiều mặt hàng đa dạng phục vụ nhu cầu tìm kiếm của quý khách. Ship cod toàn quốc.
Mọi chi tiết xin liên hệ : Linh kiện FPT

SĐT&Zalo : 090.755.1135
Hotline : 088.688.1135
Địa chỉ : Số 6 Tương Mai, Hoàng Mai, Hà Nội

Thanks and Best regards

Bình luận
Nội dung này chưa có bình luận, hãy gửi cho chúng tôi bình luận đầu tiên của bạn.
VIẾT BÌNH LUẬN