Tóm tắt : Qua bài này các bạn có thể sử dụng được ADC của AVR Giới thiệu : Phần cứng các bạn cần 1 con biến trở nối vào portA.0 Mạch ATmega16 như bài đầu . Các chế độ sẽ chọn : sử dụng chế độ ngắt ADC, tự động scan giá trị analog của port A
Ví dụ : Dùng PORTA.0 nhận giá trị từ biến trở hiển thị lên LCD theo ADC 8bit (từ 0->5V thành 0 ->255) Chú ý : trong chương trình có sử dụng hàm lcd_putnum(value); hiển thị chữ số c code 1. 2. 3. 4.
5.
/***************************************************** This program was produced by the CodeWizardAVR V1.24.8d Professional Automatic Program Generator
© Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l. 6. http://www.hpinfotech.com 7. 8. Project : 9. Version : 10.Date : 1/9/2008 11.Author : LENGOCTUAN 12.Company : VAGAM 13.Comments: 14. 15.Comments: 16. 17. 18. 19.Chip type : ATmega16 20.Program type : Application 21.Clock frequency : 8.000000 MHz 22.Memory model : Small 23.External SRAM size : 0 24.Data Stack size : 256 25.*****************************************************/ 26. 27.#include <mega16.h> 28. 29.// Alphanumeric LCD Module functions 30.#asm 31. .equ __lcd_port=0x15 ;PORTC 32.#endasm 33.#include
34. 35.#define FIRST_ADC_INPUT 0 36.#define LAST_ADC_INPUT 7 37.unsigned char adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
body | 04:39:18 10-01-08 | Posts: 20 | Thanks: 8
2
cảm ơn các bài viết của bác, em vẫn theo và thực hành thêm.
apple | 07:15:52 15-01-08 | Posts: 5
em
gặp
3
vấn
đề
rùi
Theo chỉ dẫn của bác giotdang nhưng em viết chương trình bằng asembler bác giúp em bài toán này với. sao em thấy adc nó nhiễu ghê quá -điện áp mẫu em sử dụng là chân AREF nối với Vcc -biến trở sử dụng là 100k -chon tần số biến đổi nhanh nhất (adps2..0=0) -ADC dùng ở chế độ biến đổi đơn, ở chân ADC0 và ADC1 thực hiện biến đổi ở chân ADC0 > delay100us > đua kết quả ra portb (adch) - portc(adcl)(2 port hien thị led) > biến dổi chân ADC1 > delay100us-->luu kết quả vào 2 thanh ghi xh:xl em gap 2 vấn đề như vầy: -thấy các led sáng tắt không dứt khoát -khi vặn biến trở o chan ADC1 và không văn bien tro chan ADC0 thì thấy nó nhiễu cả sang kết quả của chân ADC0 mong bac chỉ giùm, em khong biết tại sao lại thế.
giotdang | 02:21:52 16-01-08 | Posts: 190 | Thanks: 229
4
Nguyên nhân nó gây nhiễu chính là do bộ nguồn cấp cho ADC của bạn không ổn định .Để đảm bảo đo lường chính xác luôn đảm bảo AREF không được thay đổi . Mạch của bạn lại sử dụng đến 16 đèn led ( thay đổi sáng tối liên tục ) có thế làm nguồn không ổn định .Nếu các mạch thiết kế để dùng cho đo lường thường thiết kế mạch nguồn cho AREF riêng .Dù có nguồn riêng , người lập trình đều cần các phương pháp lọc số để đảm bảo giá trị đo chính xác , chống được nhiễu . [email protected]
ckdt | 05:42:08 22-01-08 | Posts: 19 | Thanks: 7
5
lcd_putchar(48+tram); lcd_putchar(48+chuc); lcd_putchar(48+donvi); a giotdang cho e hỏi về mấy câu lệnh trên nhé: trong mã ASCII 48 <=> 0 nhưng mình cộng 48 để làm gì ạ!e cũng ko biết nhiều về ngôn ngữ C.cám ơn a rất nhiều!
giotdang | 06:27:52 25-01-08 | Posts: 190 | Thanks: 229
6
mình VD: số số
cộng
48
vì
1
khi có
2
vì thế bạn phải cộng 48
hiện
thị
mã có
lên
LCD
ta
ASCII mã
hiển
thị
là ASCII
mã
ASCII
49 là
50