[其他ST产品] STM32CubeMX配置ADC采样(轮询、中断、DMA)

[复制链接]
2890|76
 楼主| 工程师犹饿死 发表于 2023-4-18 23:03 | 显示全部楼层
打开工程文件,创建一数组用于存储四个通道的ADC值

for(i=0;i<4;i++){
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,10);
AD_value[i]=HAL_ADC_GetValue(&hadc1);
printf("PA%d:%d\r\n",i,AD_value[i]);
printf("PA%d:%.3f v\r\n",i,AD_value[i]*3.3/4096);
}
HAL_Delay(500);

在主循环中添加上述代码,HAL_ADC_Start必须放在for循环中,否则只能采集第一个通道的ADC值;HAL_ADC_PollForConversion用于轮询转换,是一个阻塞函数,等待转换完成,参数10是阻塞时间
 楼主| 工程师犹饿死 发表于 2023-4-18 23:04 | 显示全部楼层
5、多通道中断

多通道情况下使用中断来读取数据理论上是可行的,但是读取的数据会混淆,即无法确定读取的数据是属于哪一个通道的,因此我们不使用
 楼主| 工程师犹饿死 发表于 2023-4-18 23:04 | 显示全部楼层
6、多通道DMA
59902643eb17c80968.png
97693643eb183c3f05.png
23889643eb18ad18cf.png
 楼主| 工程师犹饿死 发表于 2023-4-18 23:04 | 显示全部楼层
开启DMA并采用circular模式

  1. uint16_t AD_value[4]={0};
 楼主| 工程师犹饿死 发表于 2023-4-18 23:05 | 显示全部楼层
定义一数组用于保存ADC采样值
26465643eb1af4a5fa.png
 楼主| 工程师犹饿死 发表于 2023-4-18 23:05 | 显示全部楼层
在外设初始化函数下面调用 HAL_ADC_Start_DMA(&hadc1,(uint32_t*)AD_value,sizeof(AD_value));启动ADC转换和DMA数据传输
99179643eb1c324bd5.png
 楼主| 工程师犹饿死 发表于 2023-4-18 23:05 | 显示全部楼层
最后在DMA接收完成中断中将采集到的ADC数据打印出来
经测试:DMA接收中断在数据接收缓冲区满了后触发,这里的缓冲区是数据AD_value[4]
 楼主| 工程师犹饿死 发表于 2023-4-18 23:06 | 显示全部楼层
注意:
通常为了方便使用一些滤波算法,我们可以将缓冲区数据创建的更大一些(为通道数的整数倍),这里我们采用了4个通道,我们可以将缓冲数组创建为AD_value[40]
则AD_value[0]、AD_value[4]、AD_value[8]…AD_value[36]均为通道IN0的值
AD_value[1]、AD_value[5]、AD_value[9]…AD_value[37]均为通道IN1的值,
AD_value[2]、AD_value[6]、AD_value[10]…AD_value[38]均为通道IN2的值,
AD_value[3]、AD_value[7]、AD_value[11]…AD_value[39]均为通道IN3的值,
 楼主| 工程师犹饿死 发表于 2023-4-18 23:06 | 显示全部楼层
83584643eb1e07a721.png
我们同样在dma接收完成中断中将数据打印出来
 楼主| 工程师犹饿死 发表于 2023-4-18 23:06 | 显示全部楼层
实验现象如上,只打印了一次数据,表示只进入了一次DMA中断中,并且主循环中的程序也不再继续执行,程序卡死了
10206643eb1eeac4a3.png
 楼主| 工程师犹饿死 发表于 2023-4-18 23:07 | 显示全部楼层
可以在进入DMA中断函数时调用HAL_ADC_Stop_DMA来关闭ADC采集,当需要采集ADC的时候再调用 HAL_ADC_Start_DMA即可,这里为了演示在中断函数结束时又重新开启了ADC
44622643eb2118a501.png
这样就能连续采集打印数据了
maqianqu 发表于 2023-5-5 13:52 | 显示全部楼层
STM32定时器触发ADC怎么配置
sheflynn 发表于 2023-5-5 18:51 | 显示全部楼层
STM32的ADC可以采集负电平吗
chenci2013 发表于 2023-5-5 19:53 | 显示全部楼层
STM32 ADC的精度能够达到多少
bartonalfred 发表于 2023-5-5 21:43 | 显示全部楼层
STM32的ADC1的时钟和对应的GPIO的时钟为什么不用同一个时钟
sheflynn 发表于 2023-5-5 22:56 | 显示全部楼层
stm32使用hal库中adc采样频率如何查看和修改?
pl202 发表于 2023-5-5 23:13 | 显示全部楼层
STM32 ADC转换如何计算
mmbs 发表于 2023-5-6 00:09 | 显示全部楼层
STM32 中的ADC有多少通道
tabmone 发表于 2023-5-7 15:08 | 显示全部楼层
stm32内部ADC通道有没有24位的?
plsbackup 发表于 2023-5-7 16:44 | 显示全部楼层
stm32 ADC的通道与引脚是如何对应的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部