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.
#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.