STM8L ADC采样奇怪现象
请教大家,下面程序中,我只用通道1时能正常采集 ,只用通道2时也能正常采集,但是如果同时使用通道1和通道2时,通道1和通道2显示的数据为通道2的数值,通道1 就不能正常采集,这个问题出在什么地方呢?程序如下
uint8_t ADC_CH;
uint16_t ADCdata1;
uint16_t ADCdata2;
uint16_t ADC_GetCh1(uint8_t ch)
{ uint16_t tmpreg = 0;
ADC1_CR1_bit.ADON = 1; //唤醒ADC
ADC1_SQR4_bit.CHSEL_S1 =1; //设置通道1有效
//ADC_ITConfig(/*ADC1, */ADC_IT_EOC, ENABLE); //设置ADC采样中断
ADC1_CR1_bit.START = 1; //启动转化
while(ADC1_SR_bit.EOC == 1); //等待转换结束
tmpreg = (uint16_t)(ADC1_DRH);
tmpreg = (uint16_t)((uint16_t)((uint16_t)tmpreg << 8) | ADC1_DRL);
ADC1_SR_bit.EOC = 0; //清除中断标志
ADC1_CR1_bit.ADON = 0; //关闭 ADC
ADC1_SQR4_bit.CHSEL_S1 =0; //清除设置通道1
return tmpreg;
}
uint16_t ADC_GetCh2(uint8_t ch){
uint16_t tmpreg = 0;
ADC1_CR1_bit.ADON = 1; //唤醒ADC
ADC1_SQR4_bit.CHSEL_S2 =1; //
//ADC_ITConfig(/*ADC1, */ADC_IT_EOC, ENABLE); //设置ADC采样中断
ADC1_CR1_bit.START = 1; //启动转化
while(ADC1_SR_bit.EOC == 0); //等待转换结束
tmpreg = (uint16_t)(ADC1_DRH);
tmpreg = (uint16_t)((uint16_t)((uint16_t)tmpreg << 8) | ADC1_DRL);
ADC1_SR_bit.EOC = 0; //清除中断标志
ADC1_CR1_bit.ADON = 0; //关闭 ADC ADC_Cmd(/*ADC1,*/ ENABLE);
ADC1_SQR4_bit.CHSEL_S2 =0; //清除设置通道2
return tmpreg;
}
int main( void )
{ u16 adc1 = 234;
u16 adc2 = 587;
CLK_CKDIVR = 0x00; //内部时钟为1分频 = 16Mhz
OLED_AInit(); //OLED显示初始化
CLK_PCKENR2_bit.PCKEN20 = 1; //打开ADC的时钟
PA_DDR_bit.DDR4 = 0; //设置PA->4 为输入
PA_CR1_bit.C14 = 0; //设置为悬空输入
PA_CR2_bit.C24 = 0; //设置中断禁止
PA_DDR_bit.DDR5 = 0; //设置PA->5 为输入
PA_CR1_bit.C15 = 0; //设置为悬空输入
PA_CR2_bit.C25 = 0; //设置中断禁止
ADC1_CR1_bit.RES = 0; //设置12位分辨率
ADC1_CR1_bit.CONT = 0; //设置为单次转换模式
// ADC1_CR1_bit.CONT =1 ; //设置为连续转换模式
ADC1_CR2_bit.PRESC = 1; ////ADC时钟进行2分频
ADC1_CR2_bit.SMTP1 = 7; //
while(1)
{ adc1 = ADC_GetCh1(1); //ADC1采样函数
adc2 = ADC_GetCh2(2); //ADC2采样函数
OLED_ShowcADC1(adc1);
OLED_ShowcADC2(adc2);
}
return 0;
}