AD采样电池电压(8V),电压经滤波电路和电阻分压(2.5V)接到AIN1输入,但对ADCR操作时出现怪现象:ADC_Sample()调用ADC_Selchan()和ADC_Enable(),外部电阻分压值不对,与电阻值不成比,而注释掉ADC_Selchan() 或 ADC_Enable(),则电压就对了。不知道是怎么回事?程序如下:<br /><br />#define ADC_Enable( ) { ADCR |= (1<<24); } // 立即启动转换<br />#define ADC_IsFinished( ) { while( (ADDR&0x80000000) == 0 ); } // 等待<br />void ADC_Selchan( UINT8 channum ) { ADCR = (ADCR&(~0xFF))|(channum); } // 选择通道<br /><br />void ADC_Init( void )<br />{ <br /> ADCR = 0 // SEL = 0 ,选择通道0<br /> | ((Fpclk / 1000000 - 1) << 8) // 时钟为1MHz<br /> | (0 << 16) // BURST = 0 ,软件控制转换操作<br /> | (0 << 17) // CLKS = 0 ,使用11clock转换<br /> | (1 << 21) // PDN = 1 , 正常工作模式<br /> | (0 << 22) // TEST1:0 = 00 ,正常工作模式<br /> | (0 << 24) // START = 1 ,直接启动ADC转换<br /> | (0 << 27); // EDGE = 0 <br /> }<br /><br />UINT32 ADC_Sample( UINT8 num )<br />{<br /> UINT32 dat=0;<br /> <br /> ADC_Selchan( num ); *<br /> ADC_Enable( ); *<br /> ADC_IsFinished( );<br /> dat = ADDR;<br /><br /> return ((dat>>6)&0x3ff);<br /> } <br /><br /><br />int main (void)<br />{<br /> UINT32 dat=0;<br /> char str[20];<br /> <br /> LCD_Init( );<br /> LCD_Cls( ); <br /> <br /> ADC_Init( );<br /> <br /> while(1)<br /> {<br /> dat = ADC_Sample( AIN1_SEL ); <br /> sprintf( str, "%4d", dat );<br /> LCD_DispStr( 8, 2, str, NORMAL_VIEW ); <br /><br /> Delay(15);<br /> }<br /> return 0;<br />}<br /> |
|