打印
[N32G03x]

ADC单次转换使用问题

[复制链接]
427|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
画个朴昧|  楼主 | 2022-12-21 10:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AD, ADC, dc
本帖最后由 画个朴昧 于 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,可以以此为基础添加延时的时间。




使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

47

帖子

4

粉丝