PDA

View Full Version : Vấn đề khó hiểu khi dùng ADC của ds30F4011


photoman
01-03-2008, 10:57 PM
Em có một chương trình sử dụng chân AN8 của dsPic30f4011 như sau :
#define Fcy 16000000 // Hz
#define Fad 8000000 //

_FOSC(CSW_FSCM_OFF & FRC_PLL8); //Clock = 64 MHz
_FWDT(WDT_OFF);
_FBORPOR(MCLR_EN & PBOR_OFF&PWMxL_ACT_HI&PWMxH_ACT_HI);
_FGS(CODE_PROT_OFF);

unsigned int adc;

void Init_Timer1(void)
{
TMR1=0;
PR1=25000; // 100ms ; PR1=(_Fcy/prescale)*time;
_T1IF=0;
T1CON=0x8020;
_T1IE=1;
}

void _ISR _T1Interrupt(void)
{
_T1IF=0;
}

void _ISR_ADCInterrupt(void)
{
adc=ADCBUF8;
_ADIF=0;
}

void init_adc()
{
TRISBbits.TRISB8=1; // dat pin la input
ADPCFGbits.PCFG8=0; // dat che do analog cho chan

ADCON1bits.ASAM= 1; // chon che do chuyen doi tu dong.
ADCON1bits.SSRC= 7; // tu dong chuyen doi theo chu ky
ADCON1bits.FORM= 0; // dang du lieu chuyen doi la integer
ADCON1bits.ADSIDL=0; // ngung hoat dong khi o che do IDEL

ADCON2bits.VCFG=0; // chon dien ap chuan la nguon cung cap.
ADCON2bits.CSCNA=0; // khong scan cac dau vao kenh 0
ADCON2bits.CHPS=0; // chon kenh 0 de chuyen doi
ADCON2bits.BUFS=0; // chi co tac dung khi BUFM=1
ADCON2bits.SMPI=0; // ngat xuat hien sau moi lan chyen doi
ADCON2bits.BUFM=0; // thanh ghi dem o che do 16 bit
ADCON2bits.ALTS=0; // chon MUX A

ADCON3bits.ADCS=3; // chon chu ky chuyen doi Tad=2*Tcy
ADCON3bits.ADRC=0; // chon nguon clock A/D la tu xung he thong
ADCON3bits.SAMC=11; // chon thoi gian lay mau la 10 Tad

ADCHSbits.CH123NB=0; // chon dau vao am cho cac kenh 1,2,3 khi su dung MUXB
ADCHSbits.CH123SB=0; // chon dau vao duong cho cac kenh 1,2,3 khi su dung MUXB
ADCHSbits.CH0NB=0; // chon dau vao am cho kenh 0 khi su dung MUXB
ADCHSbits.CH0SB=0; // chon dau vao duong cho kenh 0 khi dung MUXB
ADCHSbits.CH123NA=0; // chon dau vao am cho cac kenh 1,2,3 khi su dung MUXA
ADCHSbits.CH123SA=0; // chon dau vao duong cho cac kenh 1,2,3 khi su dung MUXA
ADCHSbits.CH0SA=8; // chon dau vao duong cua kenh 0 la AN8
ADCHSbits.CH0NA=1; // chon dau vao am cua kenh 0 la AN1

ADCSSL =0; // khong cho phep quet tat ca cac dau vao



_ADIF=0; // xoa co ngat ADC
_ADIE=1; // cho phep ngat ADC
_ADON=1; // module ADC san sang hoat dong
}



int main(void)
{
init_adc();
_ADIE=1;
}


Chương trình tuy nhiên không hiểu sao, giá trị adc thu được luôn cố định ở một giá trị . Hơn nữa vấn đề sảy ra tương tự với AN7. Em đã thử với AN0 thì vẫn bình thường . Mong các bác giải đáp. thanks.

namqn
02-03-2008, 12:13 AM
Chỉ có chương trình thì rất khó nhận xét lỗi nằm ở đâu. Bạn nên cho biết các chân liên quan đến module ADC kết nối ra sao.

Thân,

photoman
02-03-2008, 12:21 AM
Chân AN1/VREF- : để hở không nối vào nguồn nào;
Chân AN8 : được nối trực tiếp vào chân giữ của biến trở.
Các nguồn AVdd,Avss được nối với nguồn cung cấp (lấy theo đường usb).

vấn đề là khi dùng AN0 em cũng làm như thế mà vẫn đo được ( do là cùng mạch KIT)

namqn
02-03-2008, 01:48 AM
Chân AN1/VREF- : để hở không nối vào nguồn nào;
Chân AN8 : được nối trực tiếp vào chân giữ của biến trở.
Các nguồn AVdd,Avss được nối với nguồn cung cấp (lấy theo đường usb).

vấn đề là khi dùng AN0 em cũng làm như thế mà vẫn đo được ( do là cùng mạch KIT)
Phần cứng của bạn không ổn khi dùng với code phía trên. Mạch và code của bạn khi dùng với AN0 ra sao. Bạn đã đọc tutorial của tôi về ADC chưa (tutorial 5 cho dsPIC)?

Thân,

photoman
02-03-2008, 10:17 PM
Đây là sở đồ mạch kit của em. khi dùng AN0 không có gì khác biệt.Nhưng gí trị thu đc còn thay đổi tương ứng với vặn biến trở, đằng này dùng AN8 thì chả có gì thay đổi mà cái giá trị nó trả về là trên trời rơi xuống và không đổi.Mong bác giải thích

namqn
02-03-2008, 11:22 PM
Đây là sở đồ mạch kit của em. khi dùng AN0 không có gì khác biệt.Nhưng gí trị thu đc còn thay đổi tương ứng với vặn biến trở, đằng này dùng AN8 thì chả có gì thay đổi mà cái giá trị nó trả về là trên trời rơi xuống và không đổi.Mong bác giải thích
Sơ đồ của bạn vẫn chưa thể hiện điện áp analog được đưa vào các chân AN0, AN7, và AN8 ra sao. Bạn cần lưu ý, tất cả các cặp chân Vcc, GND đều cần ít nhất một tụ decoupling 104 đặt càng gần chúng càng tốt.

Thân,

photoman
03-03-2008, 11:03 PM
hì. điện áp đưa vào của em chỉ là cắm con biến trở bên ngoài thôi. các chân analog đều để dạng jump thôi vì thế em không vẽ vào đây.Nhưng em kô hiểu sao ko sử dụng đc AN8, AN7.Mong bác chỉ điểm.ở đây e chưa nói đến vấn đề đúng hay không mà là không đo được cái gì cả.

namqn
04-03-2008, 02:55 AM
hì. điện áp đưa vào của em chỉ là cắm con biến trở bên ngoài thôi. các chân analog đều để dạng jump thôi vì thế em không vẽ vào đây.Nhưng em kô hiểu sao ko sử dụng đc AN8, AN7.Mong bác chỉ điểm.ở đây e chưa nói đến vấn đề đúng hay không mà là không đo được cái gì cả.
Điều quan trọng là bạn nối biến trở ra sao. Nếu bạn đưa điểm giữa của biến trở vào AN0, hay AN7, hay AN8, còn hai chân còn lại lần lượt nối vào VDD và GND, thì việc bạn không nối gì đến chân AN1/Vref- và viết code như vậy tất sẽ dẫn đến việc đọc được các giá trị ngẫu nhiên.

Nếu bạn nối biến trở như tôi đã nói ở trên thì bạn nên nối chân AN1/Vref- đến Avss và không sửa code gì cả (AN1/Vref- lúc này đóng vai trò Vref- cho bộ sample-and-hold CH0). Cách thứ hai là bạn sửa code lại để ADCHSbits.CH0NA=0; (như vậy chân - của bộ sample-and-hold CH0 sẽ nối vào AVss) và không thay đổi thêm gì ở phần cứng.

Tại sao bạn không bắt đầu với tutorial của tôi và chỉnh sửa lại theo nhu cầu của bạn?

Thân,

TANDEM
08-05-2009, 07:46 PM
Em đang bị mắc về ADC, nhờ các huynh chỉ giáo: Việc là em muốn đọc 2 giá trị ADC. Ở AN0 thì xuất ra Port_B còn ở AN1 thì xuất ra Port_D đối với PICF887A. Vậy em phải làm thế nào?

cuongthinh
08-05-2009, 11:17 PM
He, bạn cho adc=ADBUF8 thi làm gì mà chẳng thu được tín hiệu kô đổi. phải cho adc=ADCBUF0 chứ. kết quả chuyển đổi đưa vào đấy cơ mà