画个朴昧 发表于 2022-12-21 10:00

ADC单次转换使用问题

本帖最后由 画个朴昧 于 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,可以以此为基础添加延时的时间。




页: [1]
查看完整版本: ADC单次转换使用问题