1,前言
单片机型号:STM32F407
编程环境 :STM32CubeMX + Keil v5
硬件连接 :串口1,ADC1CH5--->PA5
注:本工程在4,STM32CubeMX配置UART串口工程基础上完成。
本工程在5,STM32CubeMX配置ADC工程基础上完成。
2,STM32CubeMX配置ADC工程
首先开启ADC1通道5的采样,在Analog(1)下方点击ADC1(2)启用模数转换器1.点击通道IN5(3)开启该通道,此时我们会在(4)位置看到PA5已经设置完成。
想要配置其他ADC和其他通道请参考下表:
接下来进行ADC的配置,在Configuration(1)配置下点击Parameter Settings(2)参数设置。修改Resolution(3)采样精度为12bit,也可以选择其他精度。再修改Continuous Conversion Mode(4)点击Enalbe使能,启动连续采样功能。
3,STM32CubeMX配置ADC的DMA
继续进行进行ADC+MDA的配置,在Configuration配置下点击Parameter Settings参数设置,再DMA Continuous Requests(1)勾选Enable,使能DMA传输。
在Configuration(1)配置下点击DMA Settings(2)进行DMA参数设置。添加新的DMA传输Stream流,如图(3)中标注。
4,STM32HAL库常用ADC函数
1,启动 ADC 转换函数HAL_ADC_Start。输入量hadc为ADC句柄。
/**
* @brief 启用 ADC 并开始转换常规通道。
* @param指向 ADC_HandleTypeDef 结构的 hadc 指针,其中包含
* 指定 ADC 的配置信息。
* @retval HAL 状态
*/
HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc)
2,轮询常规转换完成函数HAL_ADC_PollForConversion。输入量hadc为ADC句柄,输入量Timeout为超时时间。
/**
* @brief 轮询常规转换完成
* @note ADC 转换标志 EOS(序列结束)和 EOC(序列结束
* conversion) 被此功能清除。
* @param指向 ADC_HandleTypeDef 结构的 hadc 指针,其中包含
* 指定 ADC 的配置信息。
* @param Timeout Timeout(超时)值(以毫秒为单位)。
* @retval HAL 状态
*/
HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout)
3,ADC获取结果函数HAL_ADC_GetValue。输入量hadc为ADC句柄。
/**
* @brief 从常规通道的数据寄存器中获取转换值。
* @param指向 ADC_HandleTypeDef 结构的 hadc 指针,其中包含
* 指定 ADC 的配置信息。
* @retval 换算值
*/
uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc)
4,DMA方式启动ADC采样函数HAL_ADC_Start_DMA。输入量hadc为ADC句柄,输入量pData为内存地址,输入量Length为传输的数据长度。
/**
* @brief 在最后一次传输后启用 ADC DMA 请求(单 ADC 模式)并启用 ADC 外设
* @param指向 ADC_HandleTypeDef 结构的 hadc 指针,其中包含
* 指定 ADC 的配置信息。
* @param pData 目标 Buffer 地址。
* @param长度 要从 ADC 外设传输到内存的数据长度。
* @retval HAL 状态
*/
HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc、uint32_t* pData、uint32_t Length)
5,编程实战
首先先增加两个变量。
/* USER CODE BEGIN PV */
uint16_t ADC_Value[100]={0};
float Volt;
/* USER CODE END PV */
接着编写while(1)循环中的内容如下。
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC_Value, 100);
for(uint8_t i=0;i<100;i++)
{
Volt = ((float)(ADC_Value[i]*3.3))/4096;
HAL_Delay(20);
printf("A:%1.2f\r\n",Volt);
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
编译后运行烧录,结果如下。