一. ADC单通道配置(轮询模式)
打开STM32CubeMX,选择STM32103C8芯片,设置基本配置。
在ADC单通道配置中,当只进行一次ADC转换:需配置成“单次转换模式”,扫描模式关闭。ADC通道转换一次后,就停止转换。等待再次使能后才会重新转换。
在ADC单通道配置中,当进行多次ADC转换:需配置成“连续转换模式”,扫描模式关闭。ADC通道转换一次后,接着进行下一次转换,不断的转换。
扫描模式:如果 只使用一个通道,默认DIEABLE,如果使用了多个通道会自动设置为ENABLE。
连续转换模式;如果设置了DISABLE,则是使用单次转换。如果设置为ENABLE模式,则是使用连续模式。它们的区别是连续转换是将所有开启的通道的数据转换完成后才停止转换,单次转换是则是只转换一次数据后就停止转换,要再次转换则需再次触发转换。
配置好ADC单通道转换模式后,会发现时钟配置报错
点进去查看,发现是这里报错,说明ADC时钟频率不能大于14MHz
这里将ADC分频器设置为/6
设置好之后,设置存储路径,选择所用IDE,然后点击GENERATE CODE创建工程,open project打开工程进行全局编译。
二. HAL库中ADC转换的重要函数
启动ADC函数: HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc);
/**
* @简介 开启ADC,开启常规组转换,无中断功能
* @参数 hadc: ADC实例指针
* @返回值 函数执行状态
*/
HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc);
阻塞式ADC转换函数:HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout);
/**
* @简介 等待常规组A/D转换完成。
* @参数 hadc,ADC实例指针。
* @参数 Timeout,超时时间。
* @返回值 HAL_StatusTypeDef,函数执行状态。
*/
HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout);
ADC转换结果读取函数:uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc);
/**
* @简介 获取ADC常规组转换完成结果
* @参数 hadc,ADC实例指针。
* @返回值 uint32_t,ADC转换结果。
*/
uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc);
关闭ADC函数:HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc);
/**
* @简介 停止常规组(和注入通道)的ADC转换,禁止ADC外设
* @参数 hadc: ADC实例指针
* @返回值 函数执行状态
*/
HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc)
以上函数在stm32f1xx_hal_adc.c文件中
三. 实现ADC单通道转换
在main.c文件的main函数中的while下写入以下代码:
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_ADC_Start(&hadc1); // 开启ADC转换
if(HAL_OK == HAL_ADC_PollForConversion(&hadc1,10)){ // 等待ADC转换完成
printf("adc value: %d\r\n",HAL_ADC_GetValue(&hadc1)); // 得到ADC转换数据后通过串口发送到串口助手展示
printf("voltage value: %.2f\r\n",HAL_ADC_GetValue(&hadc1)*3.3/4096);
}
HAL_ADC_Stop(&hadc1); // 关闭ADC转换
HAL_Delay(500);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
为了是实验数据更加直观,这里的PA1引脚口连接到PS2双轴按键摇杆的X轴上进行数据读取,并发送到上位机。
可以发现数据正常读取到了。
四. ADC多通道配置(轮询模式)
打开STM32CubeMX,选择STM32103C8芯片,设置基本配置。
间断模式:允许用户通过设置一个或多个转换序列,并通过设置转换序列的长度来指定要进行的连续转换的次数。
在ADC多通道配置中,只进行一次ADC转换:配置为“单次转换模式”,扫描模式使能,开启间断模式。开启ADC的多个通道,按照配置的顺序依次转换一次后,就停止转换。等待再次使能后才会重新转换
在ADC多通道配置中,进行连续ADC转换:配置为“连续转换模式”,扫描模式使能,开启间断模式。开启ADC的多个通道,按照配置的顺序依次转换一次后,接着进行下一次转换,不断的转换。
设置好之后,设置存储路径,选择所用IDE,然后点击GENERATE CODE创建工程,open project打开工程进行全局编译。
五. 实现ADC多通道转换
在main.c文件的main函数中的while下写入以下代码:
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
for(int i = 0; i<2;i++){
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,10);
adc_value[i] = HAL_ADC_GetValue(&hadc1);
}
HAL_ADC_Stop(&hadc1);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
在main.c文件中的Private variables下的USER CODE BEGIN PV注释对中写入以下代码
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
unsigned int adc_value[2];
/* USER CODE END PV */
编译下载到开发板上,连接上位机。