STM32H7使用ADC的注意事项与所遇问题

jiui0 Lv2

进行ADC配置时候需要注意

以下是个人对各个参数的理解

设置参数 内容
IN5 Single-ended与Differential,单值输入和差分输入
Clock Prescaler ADC时钟分频,分频后结果要小于36MHz
Resolution 采样位数,决定ADC的采样精度
Scan Conversion Mode 当开启多通道时需要开启,进行通道的扫描
Continuous Conversion Mode 持续转换模式,意思是一经触发之后自动开启下一次转换,之后将忽略对应触发(除了软件一次采样后手动关闭,即当开启定时器触发时需要关闭)
Discontinuous Conversion Mode 单次转换模式,意思是经过一次转换后直接结束,需要自己再次开启(用什么函数)#单次转换模式ADC只采集一次数据就停止采集,使用单次转换模式需要转换通道数大于1
End Of Conversion Selection end of sequence of conversion/end of single conversion
Overrun behaviour 有prevered和overwritten,主要决定如果要采样的数据超过给的空间,是让其溢出还是从头开始写
Conversion Data Management Mode DMA Circular Mode/DMA One shot mode/Regular Conversion data stored in DR register only/DFSDM Mode

根据内容与自己的选择进行ADC的配置,需要采数据并且对其进行处理的话,需要将DMA开成Normal

关于HalfWord问题

“这里的数据类型应与DMA配置的Data Width对应。我使用的MCU其ADC转换精度为12位,因此使用HalfWord(16bit)足以,因此配置时两边都使用了默认的HalfWord,该配置使DMA每次从ADC搬运16bit数据到地址testbuffer,下一波数据搬运到testbuffer+16bit的地址中,再下一次到testbuffer+2*16bit。”

此段来自于以下的链接博客,讲的比较清楚


2023/3/15 1:55

以下问题在一篇博客的表格中有了答案

在此贴出链接

[引用链接1]: https://blog.csdn.net/tpytpytpy/article/details/122563117 “ADC+DMA踩坑及傻瓜式解析”


碰到的问题

DMA的单次模式和循环模式的选择与ADC的连续转换模式和单次转换模式

image-20230311222118929

2023/3/11

目前问题:当进行采波时会不连续

image-20230311223915720

猜测:猜测是DMA的循环模式导致的间断点,因为目前是只采集一次,但是软件触发,只开了一次,而DMA一直在循环搬运导致数据出现问题?

调试打算:

  1. 将ADC改成单次转换模式,并将DMA改成单次模式,观察现象。
  2. 如果没有间断点,说明软件触发对于连续转换模式是有用的,它导致了转换的停止,但DMA没有停止,故产生不连续波。
  3. 如果不是,寻找其他原因。

如果ADC的连续转换模式意思是完成转换后自己开启,那么还有触发的事情吗???/未解之谜

调试结果:

  1. Continuous Conversion Mode设为DisableConversion Data Management Mode设为DMA one shot

    结果:没有进入HAL_ADC_ConvCpltCallback函数,无法输出波形
  2. Continuous Conversion Mode设为EnableConversion Data Management Mode设为DMA Circular Mode,DMA的模式设为normal

    结果进入HAL_ADC_ConvCpltCallback函数,波形正常,间断消失
    image-20230312142038580

结论

  1. ADC连续转换模式可以由软件触发和停止,用HAL_ADC_Stop_DMA和HAL_ADC_Start_DMA对其进行控制,但是如果用TIM进行触发的话,请关闭ADC连续转换模式,因为它的开启会使得ADC的步调不听定时器的话。

  2. DMA选项页的Mode的normalcircular

    1
    HAL_ADC_Start_DMA(&hadc1,testbuffer,BUFF_NUM);
    1 1 1 1 1 1 2 2 2 2
    2 1 1 1 1 1 2 2 2 2

    如上图表格中,第一行代表单次模式,第二行代表DMA,先接收6个数据,然后接收5个数据,单次模式就会数据溢出,而DMA循环模式就会自动重启从第一个开始存,本程序中接收的数据是固定的,可以选择normal模式,选择circular会导致前面数据被覆盖,然后导致截断,总而言之,Circular就是采集BUFF_NUM后会自动重新到数组第一位继续搬运,而Normal则是采集BUFF_NUM之后自动停止,等待下一次HAL_ADC_Start_DMA的调用

  3. 仍旧没搞清楚Conversion Data Management Mode,看cubemx的描述意思应该是使用DMA一次性传还是循环传,DMA One shot和ADC的单次转换模式类似,需要重复调用函数(?存疑)

遇到问题:波形抖动

image-20230702084051330

正确的配置

2023/7/1

经过更加深入的了解,其实配置不像之前想的那么复杂,比较常规的配置方法是ADC+DMA+TIM触发+软件位开启和关闭,以下是我的常规配置,在程序中,每次采样转换完成后,软件控制位置0,处理完后打开即可达到自己想要的配置效果。

image-20230701185459999

  • タイトル: STM32H7使用ADC的注意事项与所遇问题
  • 作者: jiui0
  • で作成されました : 2023-03-12 00:03:26
  • で更新されました : 2023-11-10 11:59:37
  • リンク: https://github.com/JIU10/2023/03/12/STM32H7使用ADC的注意事项与所遇问题/
  • 著作権宣言: この文章は CC BY-NC-SA 4.0 を使用して許可します。
 コメント