PDA

View Full Version : Gặp vấn đề ADC trong Dspic30F4011


biendt
25-10-2009, 04:19 PM
EM đang làm về ADC trong Dspic thì gặp vấn đề giá trị của ADC ko biến đổi. Chương trình đã theo mẫu của mọi người đã làm chạy nhưng ko ăn thua :
chương trình ADC của em trong phần biến đổi ADC là :
void Init_ADC10(void) {
ADCON1bits.FORM = 0;
ADCON1bits.SSRC = 7;
ADCON1bits.ASAM = 1;
//viec chuyen doi A/D
ADCON2 = 0x0000;
ADCHS = 0x0000 ; //Kenh 0 doc tin hieu giua AN8 va AVss
ADCSSL =0x0000; //Khong quet cac ngo vao
ADCON3 = 0x0103; //Dung 1 TAD cho lay mau, dung clock he thong,
// TMR3 = 0; //Xoa thanh ghi dem cua Timer 3
// PR3 = 0x03E8; //Nguong delay cho TMR3 la khoang 1 ms
// T2CON = 0x8010; //Prescale = 1:8, bat cho TMR3 chay

_ADIF = 0; //Xoa co ngat ADC
_ADIE = 1; //Cho phep ngat ADC
_ADON = 1; //Bat module ADC
_ASAM = 1; //Khoi dong che do tu dong lay mau
} //Khoi dong che do tu dong lay mau

void _ISR _ADCInterrupt(void)
{
ADCValue = ADCBUF0;
_ADIF = 0;

}

Hiện thị lên LCD. Giá trị trên LCD cứ bằng 0 hoài. Em sợ ngắt của ADC ko xẩy ra. Vì đã có ngắt của Timer 1 rồi (Để tạo delay). Các pác giúp em mới!

biendt
25-10-2009, 04:57 PM
ADCON3 = 0x0103; //Dung 1 TAD cho lay mau, dung clock he thong,
Cái này ko bit mình tính kiểu gì? sao lại có cái tận dùng 31 TAD? MOng các pác giải thích dùm!

biendt
25-10-2009, 05:14 PM
Em thấy nó sai ở chỗ thanh ghi : ADCCON1 !
Nếu em để ADCON1 = 0x0040 thì ko được? và 0x0060 cũng ko được?
Mà em phải để là ADCON1 = 0x00E0 thì mới được?
Mong các pác giải thích dùm!

tungnh
25-10-2009, 09:04 PM
Bạn đã cấu hình _ASAM = 1 và Ở thanh ghi ADCON1 = 0x00E0 cấu hình cho SSRC<2:0> = 111, tức là chế độ tự động chuyển đổi ( auto convert ).
Bạn nên đọc tài liệu Dspic30F_reference_manual phần ADC,

biendt
25-10-2009, 09:40 PM
Cho em hỏi là ADCON3 đựoc tính như thế nào? Để tốc độ chuyển ADC cần phải đảm bào những gì?
Pác có thể cho em cái tài liệu Dspic30F_reference_manual đựoc ko?

namqn
25-10-2009, 09:43 PM
Cho em hỏi là ADCON3 đựoc tính như thế nào? Để tốc độ chuyển ADC cần phải đảm bào những gì?
Pác có thể cho em cái tài liệu Dspic30F_reference_manual đựoc ko?
Tài liệu của dsPIC thì cứ vào Microchip mà download, việc gì phải đi xin. Link cho tài liệu nói trên ở đây:
http://ww1.microchip.com/downloads/en/DeviceDoc/70064E.pdf

Tôi luôn luôn đề cập đến các tài liệu tham khảo trong các tutorial, đáng buồn là có nhiều người không quan tâm đến những thông tin như vậy.

Thân,

biendt
25-10-2009, 10:49 PM
Anh nam cho em hỏi là tại sao trong khi tính toán trong Dspic lại không đúng vậy anh?
Em lấy ví dụ trong mạch đo nhiệt độ với ADC 10 bit.
t = ((ADCValue-559)*49)/100

Vói giá trị ADC đo đựoc là 832 thì giá trị t = 125 như vậy là ko đúng với công thức tính toán! Giá trị này bị lệch (Giá trị t thực của nó khi ADC = 832 là t = 134 mới đún) Mong anh chỉ giáo!

namqn
25-10-2009, 11:06 PM
Anh nam cho em hỏi là tại sao trong khi tính toán trong Dspic lại không đúng vậy anh?
Em lấy ví dụ trong mạch đo nhiệt độ với ADC 10 bit.
t = ((ADCValue-559)*49)/100

Vói giá trị ADC đo đựoc là 832 thì giá trị t = 125 như vậy là ko đúng với công thức tính toán! Giá trị này bị lệch (Giá trị t thực của nó khi ADC = 832 là t = 134 mới đún) Mong anh chỉ giáo!
Bạn chưa cho biết đang dùng cảm biến gì, độ chính xác ra sao, nên rất khó nhận xét.

Module ADC chỉ chuyển đổi giá trị ngõ vào tương tự thành giá trị số tương ứng, giá trị này tùy thuộc vào giá trị điện áp nguồn cấp cho module ADC và điện áp tham chiếu (nếu khác với điện áp nguồn của module). Việc tính toán thế nào còn tùy vào quan hệ giữa đại lượng đo và điện áp ngõ ra của cảm biến, độ chính xác của cảm biến, độ trôi nhiệt, ...

Thân,

biendt
26-10-2009, 04:56 AM
Em dùng cảm biến LM335 (Cảm biến nhiệt). Em hiện thị cả kết quả ADC đọc được lên LCD. Nhưng thấy kết quả tính ra nhiệt độ tử giá trị ADC này lại khác so với giá trị tính toán bằng tay của mình (Tức là CPU tình sai trong công thức t = ((ADCValue-559)*49)/100)
Nếu mà em thay đổi biểu thức trên bằng : t = ((ADCValue-559)*0.49 thì giá trị của t nhẩy lên 1 số rất lớn so với giá trị ADC đo được? em khai báo biến t là unsigned int

namqn
26-10-2009, 09:08 AM
Em dùng cảm biến LM335 (Cảm biến nhiệt). Em hiện thị cả kết quả ADC đọc được lên LCD. Nhưng thấy kết quả tính ra nhiệt độ tử giá trị ADC này lại khác so với giá trị tính toán bằng tay của mình (Tức là CPU tình sai trong công thức t = ((ADCValue-559)*49)/100)
Nếu mà em thay đổi biểu thức trên bằng : t = ((ADCValue-559)*0.49 thì giá trị của t nhẩy lên 1 số rất lớn so với giá trị ADC đo được? em khai báo biến t là unsigned int
Cơ sở nào để bạn kết luận dsPIC tính sai?

Bạn có đo giá trị điện áp ngõ vào và giá trị điện áp nguồn bằng một volt kế chính xác cao hay không? Bạn có biết rằng ứng với nhiệt độ 25 độ C, LM335 có thể cho ra điện áp từ 2.92 đến 3.04 V hay không? Bạn có biết LM335 chưa được chuẩn hóa có thể có sai số nhiệt độ đến 9 độ C trong dải nhiệt độ cho phép hay không?

Không rõ bạn lấy công thức trên ở đâu? Bạn có hiểu rõ công thức đó hay không?

Thân,

biendt
26-10-2009, 12:44 PM
Em nhầm trong code một chút anh à! Trong ngắt ADC lại bật cho ADC hoạt động! Em sửa lại rồi và OK!

tungnh
26-10-2009, 07:27 PM
Em nhầm trong code một chút anh à! Trong ngắt ADC lại bật cho ADC hoạt động! Em sửa lại rồi và OK!
Hãy bắt đầu làm việc với Pic thông qua các tutorial của anh Nam và đọc kỹ datasheet , sẽ hiệu quả hơn rất nhiều.