什么是ADC,ADC也叫做模数转换,既将外面的模拟信号转换为数字信号。
模拟信号:连续变化的物理量表示的信息,其信号的幅度,或频率,或相位随时间作连续变化,或在一段连续的时间间隔内,其代表信息的特征量可以在任意瞬间呈现为任意数值的信号。
数字信号:将数据表示为离散值序列的信号。在任何给定时间,它只能取有限数量值中的一个。这与代表连续值的模拟信号形成对比,在任何给定时间,它代表一个连续数值范围内的实数。
而ADC则进行将模拟信号转化为数字信号,那他是怎样进行转换的呢。
我们使用的32单片机有以下
下面开始进行ADC的频率配置,配置的频率就是ADC采样的速度,根据参考手册进行设置。我们这款32单片机则不能配置超过14M的频率。
下面对ADC的端口进行配置
下面则是默认参数的所有设置
如果你想就直接使用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里面引入头文件,然后进行以下的操作:
在初始化那里添加下面的这行代码,用于ADC的采样校准
然后通过函数读取就可以实现获取ADC采的值 :a1 = ADC_IN_1();
下面就可以开始进行DMA进行单通道ADC的采集,我们使用的单片机只有ADC1才有DMA所有使用ADC1。
同时DMA还可以用到这些外设的上面。
下面进行CubeMX图形界面的配置:
首先将单次转换切换到连续转换,这样才可以进行连续的采集。
这样设置过后,就可以实现连续循环的采集我们的信号,从而使信号连续不间断。
配置完后,还需要将DMA的初始化函数放到ADC初始化函数的前面,这样才可以实现ADC的用DMA进行传输信号。
接上来在main.c中开启ADC的DMA传输,加入下面的代码就行。
既将从ADC读取的值,通过DMA传输到自定义变量a1中,从而实现DMA单通道的ADC采集。
下面继续配置CubeMX进行双通道的配置
从新定义两个数组进行存储数据,因为采集的是连续的数据,则采用数组的方式进行存储
下一步将DMA里的参数修改为定义的数组,并将传输次数改为2,这样电第一次传输是adc1的,第二次就是adc2的。
然后数据就在这个自定义的数组当中了,就进行对应的操作就行。
总结:
如果不使用DMA进行传输则需要自己进行ADC采集的配置,如果使用了ADC那么就不需要去配置,只需要开启ADC的DMA传输,并自定义变量来装这个采集的值就行了,然后再根据采集的值进行下一步操做。