一、ADC功能参数配置
1.ADC时钟频率设置,最大为14Mhz
2.开启对应的ADC通道
常需要配置的参数如下图所示
3.分辨率(resolution):模拟量转化为数字量的范围,12位分辨率即为0~4095
3.连续模式:不开启连续模式每次进行ADC转换前需要调用一次启动函数,开启连续模式则完成一次转换后会接着进行下一次转换,单通道对应单次转换,多通道对应连续转换
4.DMA循环模式:正常模式下DMA完成一次转运后即停止工作,循环模式下完成一次转换后会从第一个寄存器开始循环覆盖新的数值,与ADC的连续模式配合使用,实现数据的连续循环的转换和传递
5.DMA寄存器地址自增:对于多通道数据采集需要勾选
6.扫描模式:仅在多通道下才会开启,开启后将按照通道顺序依次转换channel0-channel1-channel0-channel1-...
7.DMA Continous Requests:不经过cpu去提取转换的数据,直接交给DMA操作,可以开启
8.规则通道与注入通道:规则通道就是很规矩的意思,平时一般使用的就是这个通道;注入通道,可以理解为插入,插队的意思,是一种不安分的通道。它是一种在规则通道转换的时候强行插入要转换的一种。如果在规则通道转换过程中,有注入通道插队,那么就要先转换完注入通道,等注入通道转换完成后,再回到规则通道的转换流程。类似于中断程序,注入通道只有在规则通道存在时才会出现
9.触发方式:通过直接配置寄存器触发,通过配置控制寄存器CR2的ADON位,写1时开始转换,写0时停止转换。在程序运行过程中只要调用库函数,将CR2寄存器的ADON位置1就可以进行转换,即软件触发。
10.采样时间
采样时间是采样保持用的时间,采样时间越大,越能避免一些毛刺的干扰,但转换时间会延长 。
总结:右对齐+多通道使能扫描+使能连续+关闭间断+DMA连续请求+循环模式+地址自增+规则组+软件触发
二、读取ADC数值
单通道不开启DMA时,可通过调用GetValue函数获取数字量
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,500);
if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC))
{
return HAL_ADC_GetValue(&hadc1);
}
当开启DMA进行AD转换时调用DMA函数将转换来的数字量传递到目标变量所在地址即完成获取 不连续模式每次采集之前需手动启动ADC( HAL_ADC_Start(&hadc); )
“HAL_ADC_Start_DMA”该函数用来开启ADC的DMA功能并完成传递
HAL_ADCEx_Calibration_Start(&hadc1);
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&a,1);
DMA传递单个通道
DMA传递多个通道
HAL_ADC_Start_DMA( , , )三个参数分别为:①传递的功能②传递的数据所存放的寄存器③传递的数据长度,对应转换的通道数量
注:uint32_t*强制转换为32位地址,a1为用户定义的变量,dmadc为用户定义的二维数组
三、ADC函数