本帖最后由 画个朴昧 于 2022-12-21 10:32 编辑
部分用户再使用《ADC_SingleRead》例程测试采集2个以上通道时会出现,第一次获取的AD值为0,至此多个通道的AD值出现了错位现象。
1.SDK中的配置,ADC_CLK由HCLK进行16分配而来,这样ADC的工作时钟与主频时钟存在同步问题。
2.我们看一下历程中获取单次采集获取ADC的函数
uint16_t ADC_GetData(uint8_t ADC_Channel)
{
uint16_t dat;
ADC_ConfigRegularChannel(ADC, ADC_Channel, 1, ADC_SAMP_TIME_56CYCLES5);
/* Start ADC Software Conversion */
ADC_EnableSoftwareStartConv(ADC,ENABLE);
while(ADC_GetFlagStatus(ADC,ADC_FLAG_ENDC)==0){
}
ADC_ClearFlag(ADC,ADC_FLAG_ENDC);
ADC_ClearFlag(ADC,ADC_FLAG_STR);
dat=ADC_GetDat(ADC);
return dat;
}
函数中等待ADC_FLAG_ENDC置1,标志模拟端输入信号已经逐次逼近转换完成,但不意味着转换的结果已经搬移到ADC->DAT寄存器,由于代码指令执行速率(主频)与ADC_CLK不一致,当程序执行到“dat=ADC_GetDat(ADC);”时,数据不一定已经搬移到ADC->DAT中,从而出现了第一次获取的AD值为0,至此多个通道的AD值出现了错位现象。
为了避免这种情况,可以:1.提高ADC工作时钟;2.获取ADC->DAT数据前加一些延时,当ADC_FLAG_ENDC置1后,数据搬移到ADC->DAT还需要1/2个ADC_CLK,可以以此为基础添加延时的时间。
|