STM32ADC实验二:cubemx实现多通道连续采集(非DMA)

STM32是支持ADC多通道连续采集的,配置如下:

与单通道的配置不同:

1.在于采集通道数为2,并且设置两个通道的rank(等级),先采通道4再采通道5。这个在我理解看来就是采集的先后顺序。

2.并且开启轮询和连续,若不轮询或者连续,那么采集完通道四就不会采集通道5了。

但是存放ADC值的寄存器只有一个,那么我在获取当前ADC值的时候如何知道当前轮询到哪个通道了呢?因为ADC的句柄并没有一个显示当前通道的成员。

原子采用的方式是每次采集时把ADC1的通道配置一下再采集,下一次采集再更换通道,再配置。那么本质不还是单通道采集吗?

网上查找到的连续多通道采集大多都是DMA,非DMA的我还真没找到。这就很奇怪了,明明STM32支持多通道连续采集,如何切换通道?找遍HAL库的ADC部分也没有这个函数。

一、我以为只要开启一遍ADC(HAL_ADC_Start(&hadc1); )他会连续采集完通道4和5。然而并不会,因为存放数据的寄存器只有一个,所以这个肯定需要“人为”去读取数据后再次开启ADC的,而事实也的确如此。

但是如何在采集完通道4的时候获取数据呢?我又怎么知道ADC采集的是通道4还是通道5呢?这只能我们在写程序的时候知道是第几次采集了。

在HAL_ADC_Start最后会判断软件控制模式,将CR2的SWSTART位置一,意为转向下一个通道。但是当前采集的还是第一个通道,下一次采集就直接采集通道5了。

二、这就是HAL_ADC_PollForConversion(&hadc1,50);               //表示等待转换完成,第二个参数表示超时时间,单位ms.  的作用了,该函数的意义就在于等待EOC标志,并且在等到EOC标志后清除标志(我们设置的为ADC一个通道转换完毕后置EOC标志)。

三、所以第一个ADC采集的是通道4,而第二个是通道5,循环!第三个是通道4。。。

因此代码如下:

//main.c
main()
{
    while(1)
    {
        HAL_ADC_Start(&hadc1);  
	HAL_ADC_PollForConversion(&hadc1,50);       		//表示等待转换完成,第二个参数表示超时时间,单位ms.    
	_fAdcValue = (float)ADC_GetValue2();			//获取ADC1(channel5)的数值

	HAL_ADC_Start(&hadc1);  
	HAL_ADC_PollForConversion(&hadc1,50);       		//表示等待转换完成,第二个参数表示超时时间,单位ms.    
	_fAdcValue = (float)ADC_GetValue1();			//获取ADC1(channel5)的数值
    }
}
//adc.c
uint16_t ADC_GetValue1(void)
{
	if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC)) 
	{		
		_u16Value1 = (uint16_t)HAL_ADC_GetValue(&hadc1);			//读取ADC转换数据,数据为12位。查看数据手册可知,寄存器为16位存储转换数据,
																	//数据右对齐,则转换的数据范围为0~2^12-1,即0~4095.	
	}
	printf("ADC1_CH5: %d\r\n", _u16Value1);
	return _u16Value1;
} 
uint16_t ADC_GetValue2(void)
{
	if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC)) 
	{		
		_u16Value2 = (uint16_t)HAL_ADC_GetValue(&hadc1);			//读取ADC转换数据,数据为12位。查看数据手册可知,寄存器为16位存储转换数据,
																	//数据右对齐,则转换的数据范围为0~2^12-1,即0~4095.	
	}
	printf("ADC1_CH1: %d\r\n", _u16Value2);
	return _u16Value2;
}

实验结果如下图:

用HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc);来开启ADC的方式我也试过,在回调函数中获取ADC的数值,多通道的话就得加上全局变量,知道当前是哪个通道下。

结论:这种方式也可以看出,并不是那么的省心省力,和DMA方式相比效率低很多。但是起码我们知道了DMA方式的优点在哪,为什么要用DMA方式了。

发布了26 篇原创文章 · 获赞 0 · 访问量 2990

猜你喜欢

转载自blog.csdn.net/nianzhu2937/article/details/103767770