STM32CubeMX关于ADC采集DMA传输

什么是ADC,ADC也叫做模数转换,既将外面的模拟信号转换为数字信号。

模拟信号:连续变化的物理量表示的信息,其信号的幅度,或频率,或相位随时间作连续变化,或在一段连续的时间间隔内,其代表信息的特征量可以在任意瞬间呈现为任意数值的信号。

数字信号:将数据表示为离散值序列的信号。在任何给定时间,它只能取有限数量值中的一个。这与代表连续值的模拟信号形成对比,在任何给定时间,它代表一个连续数值范围内的实数。

而ADC则进行将模拟信号转化为数字信号,那他是怎样进行转换的呢。

b37e6a1340584d93b2f798b8abef967f.png

我们使用的32单片机有以下

f353a3d7132c43e386a40ac3b245e2d4.png

7ee55f81bd8f4063888042079fd76cc1.png

 下面开始进行ADC的频率配置,配置的频率就是ADC采样的速度,根据参考手册进行设置。我们这款32单片机则不能配置超过14M的频率。

3641a8c0c5d64c2098fb6aca8c941cf5.png

 下面对ADC的端口进行配置

7789489153a648568ea927713f009791.png

 下面则是默认参数的所有设置

14374545f595426a89d5d39f06de0c06.png

 如果你想就直接使用ADC,则只需要添加以下的设置,就可以实现ADC数据的采集了,这里我们采用了模块化编程的思想,既用一个adc.c和adc.h文件来进行操作。

adc.c

uint16_t ADC_IN_1(void) //ADC采集程序
{
	HAL_ADC_Start(&hadc1);//开始ADC采集
	HAL_ADC_PollForConversion(&hadc1,500);//等待采集结束
	if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))//读取ADC完成标志位
	{
		return HAL_ADC_GetValue(&hadc1);//读出ADC数值
	}
	return 0;
}

adc.h

#ifndef ADC_ADC_H_
#define ADC_ADC_H_

#include "stm32f1xx_hal.h" //HAL库文件声明
extern ADC_HandleTypeDef hadc1;

uint16_t ADC_IN_1(void);

#endif /* ADC_ADC_H_ */

然后在main.c里面引入头文件,然后进行以下的操作:

d4e3947db6d0433a8458576de0d05d78.png

 在初始化那里添加下面的这行代码,用于ADC的采样校准c502e113531342569bc0ca6b0eb2ff34.png

 然后通过函数读取就可以实现获取ADC采的值        :a1 = ADC_IN_1();

        下面就可以开始进行DMA进行单通道ADC的采集,我们使用的单片机只有ADC1才有DMA所有使用ADC1。

a84a32937a464dbca165d7980b6e2747.png

 同时DMA还可以用到这些外设的上面。

9d3fb14131ac4702a352ae10874be078.png

下面进行CubeMX图形界面的配置:

403317732a4b48a2b9f9b425449dc55d.png

 首先将单次转换切换到连续转换,这样才可以进行连续的采集。

50f56afaea1a4417adb5459c52f50a23.png

8e1d4a535244469fb3df8b0c3742f4db.png

 这样设置过后,就可以实现连续循环的采集我们的信号,从而使信号连续不间断。

 2f6d2132529848e99dcbacd3709bedd9.png

 074926439b3f4b6890d207c7dc04c3d8.png

        配置完后,还需要将DMA的初始化函数放到ADC初始化函数的前面,这样才可以实现ADC的用DMA进行传输信号。

57c731f8b9764fb7939704b9bddecd4c.png

32fdddac7963418f93b7eba064fa54b2.png 接上来在main.c中开启ADC的DMA传输,加入下面的代码就行。

a6d6e5ce3b024cd39f908b8364b066ff.png

 既将从ADC读取的值,通过DMA传输到自定义变量a1中,从而实现DMA单通道的ADC采集。

 下面继续配置CubeMX进行双通道的配置

1e58eba21848481b8fc412e2945fe544.png

 从新定义两个数组进行存储数据,因为采集的是连续的数据,则采用数组的方式进行存储

cf8c72a1ba584bb6bfdf5acdbd9ed192.png

 下一步将DMA里的参数修改为定义的数组,并将传输次数改为2,这样电第一次传输是adc1的,第二次就是adc2的。

4241d034aec14ebb9272d8b74c8da1eb.png

然后数据就在这个自定义的数组当中了,就进行对应的操作就行。 

总结:

        如果不使用DMA进行传输则需要自己进行ADC采集的配置,如果使用了ADC那么就不需要去配置,只需要开启ADC的DMA传输,并自定义变量来装这个采集的值就行了,然后再根据采集的值进行下一步操做。

 

  • 4
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啵啵520520

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值