打印
[其他ST产品]

STM32CubeMX配置ADC采样(轮询、中断、DMA)

[复制链接]
手机看帖
扫描二维码
随时随地手机跟帖
41
打开工程文件,创建一数组用于存储四个通道的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是阻塞时间

使用特权

评论回复
42
工程师犹饿死|  楼主 | 2023-4-18 23:04 | 只看该作者
5、多通道中断

多通道情况下使用中断来读取数据理论上是可行的,但是读取的数据会混淆,即无法确定读取的数据是属于哪一个通道的,因此我们不使用

使用特权

评论回复
43
工程师犹饿死|  楼主 | 2023-4-18 23:04 | 只看该作者
6、多通道DMA



使用特权

评论回复
44
工程师犹饿死|  楼主 | 2023-4-18 23:04 | 只看该作者
开启DMA并采用circular模式

uint16_t AD_value[4]={0};

使用特权

评论回复
45
工程师犹饿死|  楼主 | 2023-4-18 23:05 | 只看该作者
定义一数组用于保存ADC采样值

使用特权

评论回复
46
工程师犹饿死|  楼主 | 2023-4-18 23:05 | 只看该作者
在外设初始化函数下面调用 HAL_ADC_Start_DMA(&hadc1,(uint32_t*)AD_value,sizeof(AD_value));启动ADC转换和DMA数据传输

使用特权

评论回复
47
工程师犹饿死|  楼主 | 2023-4-18 23:05 | 只看该作者
最后在DMA接收完成中断中将采集到的ADC数据打印出来
经测试:DMA接收中断在数据接收缓冲区满了后触发,这里的缓冲区是数据AD_value[4]

使用特权

评论回复
48
工程师犹饿死|  楼主 | 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的值,

使用特权

评论回复
49
工程师犹饿死|  楼主 | 2023-4-18 23:06 | 只看该作者

我们同样在dma接收完成中断中将数据打印出来

使用特权

评论回复
50
工程师犹饿死|  楼主 | 2023-4-18 23:06 | 只看该作者
实验现象如上,只打印了一次数据,表示只进入了一次DMA中断中,并且主循环中的程序也不再继续执行,程序卡死了

使用特权

评论回复
51
工程师犹饿死|  楼主 | 2023-4-18 23:07 | 只看该作者
可以在进入DMA中断函数时调用HAL_ADC_Stop_DMA来关闭ADC采集,当需要采集ADC的时候再调用 HAL_ADC_Start_DMA即可,这里为了演示在中断函数结束时又重新开启了ADC

这样就能连续采集打印数据了

使用特权

评论回复
52
maqianqu| | 2023-5-5 13:52 | 只看该作者
STM32定时器触发ADC怎么配置

使用特权

评论回复
53
sheflynn| | 2023-5-5 18:51 | 只看该作者
STM32的ADC可以采集负电平吗

使用特权

评论回复
54
chenci2013| | 2023-5-5 19:53 | 只看该作者
STM32 ADC的精度能够达到多少

使用特权

评论回复
55
bartonalfred| | 2023-5-5 21:43 | 只看该作者
STM32的ADC1的时钟和对应的GPIO的时钟为什么不用同一个时钟

使用特权

评论回复
56
sheflynn| | 2023-5-5 22:56 | 只看该作者
stm32使用hal库中adc采样频率如何查看和修改?

使用特权

评论回复
57
pl202| | 2023-5-5 23:13 | 只看该作者
STM32 ADC转换如何计算

使用特权

评论回复
58
mmbs| | 2023-5-6 00:09 | 只看该作者
STM32 中的ADC有多少通道

使用特权

评论回复
59
tabmone| | 2023-5-7 15:08 | 只看该作者
stm32内部ADC通道有没有24位的?

使用特权

评论回复
60
plsbackup| | 2023-5-7 16:44 | 只看该作者
stm32 ADC的通道与引脚是如何对应的

使用特权

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

本版积分规则