STM32CubeMX在F103上的ADC注入通道配置异常问题

前言

最近业余时间在搞无刷电机FOC的控制,其中有一部分是关于流过电机三相绕组电流采集的,需要用到STM32内置的ADC,核心是需要使用注入通道以确保ADC数据采集的实时性,但是我在STM32配置完ADC的几个通道后,将几个采集通道逐个接地,发现仅有最后一个通道读取ADC值有效,故写下写这篇博客,以防后面的同志遇到和我一样的问题不知道怎么处理。

STM32CubeMX配置

配置外部时钟源和调试方式我就不具体说明了,直切正题:
adc1配置,我配置了2~6通道,其中2、3为规则通道,4、5、6为注入通道,并将注入通道的触发源设定为定时器1的事件触发;且配置ADC的中断,这里就不放图了。注入通道转换完的数据是存放到adc句柄的Instance下的JDR1到JDR4中,可将这些数据直接取出即可。
STM32CubeMX在F103上的ADC注入通道配置异常问题_第1张图片
设置定时器1,使能事件触发
STM32CubeMX在F103上的ADC注入通道配置异常问题_第2张图片
设置完成后直接生成项目
在main.c文件的USER CODE BEGIN PV后添加如下代码

/* USER CODE BEGIN PV */
uint16_t ADC_result[2];
uint16_t InJAdc_result[3];
/* USER CODE END PV */

main函数内的USER CODE BEGIN 2加入如下代码

/* USER CODE BEGIN 2 */
	__HAL_ADC_ENABLE_IT(&hadc1, ADC_IT_JEOC);
	__HAL_TIM_ENABLE(&htim1);
	HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC_result, 2);
	HAL_ADCEx_InjectedStart(&hadc1);
  /* USER CODE END 2 */

在main.c文件的USER CODE BEGIN 4 添加如下代码,确保转换完后立即可将读取的AD值刷新到我定义的数据区

void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef * hadc)
{
	InJAdc_result[0] = hadc->Instance->JDR1;
	InJAdc_result[1] = hadc->Instance->JDR2;
	InJAdc_result[2] = hadc->Instance->JDR3;
}

之后编译、下载、调试,监视InJAdc_result[3]这个数组,如果没有BUG的存在则数据应该已经正常转换了,但是我的有BUG!!!!!!!!!!!!

此时打开STM32CubeMX生成的ADC初始化文件adc.c文件中,找到ADC初始化函数的注入通道相关部分就会发现问题:
STM32CubeMX在F103上的ADC注入通道配置异常问题_第3张图片
图中针对ADC_CHANNEL_5和ADC_CHANNEL_6这两个通道在做初始化时并没有配置注入RANK号,所以注入RANK号会始终默认为ADC_CHANNEL_4下面的ADC_INJECTED_RANK_1,所以ADC注入通道1会被重复刷新,未被配置的通道RANK2和3就会全部默认会ADC_CHANNEL_0,所以我在异常情况下将ADC_CHANNEL_0接地,会将除了1通道外所有通道拉低。

解决方法就是在ADC_CHANNEL_5和ADC_CHANNEL_6的后面添加对应的注入通道RANK号,如下图
STM32CubeMX在F103上的ADC注入通道配置异常问题_第4张图片
此时再编译下载

ADC_CHANNEL_4接地
STM32CubeMX在F103上的ADC注入通道配置异常问题_第5张图片
ADC_CHANNEL_5接地
STM32CubeMX在F103上的ADC注入通道配置异常问题_第6张图片
ADC_CHANNEL_6接地
STM32CubeMX在F103上的ADC注入通道配置异常问题_第7张图片
一切正常,打完收工,该博客可转载,但要附上出处!!!!!!

你可能感兴趣的:(stm32,单片机,嵌入式硬件)