STM32开发实战系列6-数模转换器ADC(多通道)

1.目标

利用ADC采集按键以及光照传感器的数据,并在按键中断处理程序中打印采集的结果。

按键和光照分别采集,2个通道,这样实现多通道的试验。

1.1多通道采集原理

通过CubeMX设计界面配置ADC的多个通道,并且设置采集顺序,配置号寄存器后。

ADC的DR寄存器只有一个,要采集多个通道,会根据配置按顺序一个一个的进行采集。

在执行采集获取数据时,需要注意要判断寄存器状态,是否已经采集完成。

1.2原理图

2.工程代码实现

2.1.CubeMX中创建工程

新建Project,选择MCU型号。在Pin视图进行配置,如图:

RCC打开为Crystal/Ceramic Resonator模式,使用外部晶振,让CPU工作的更快

串口1打开,用来输出printf的内容,配置波特率115200

PA8是按键信号,开启中断,当按下按键开始采集

PA1是光照引脚开启ADC模式,

PA4是按键的ADC输入引脚,可以判断五向按键是按键的被按下

完成后生成工程代码,需要选择ARM-MDK的IDE工程

2.2.Keil工程代码

在打开的工程中的文件夹Application\MDK-ARM\startup_stm32f051x8.s中找到终端调用函数EXTI4_15_IRQHandler,并调转到具体实现在Core\Src\stm32f0xx_it.c下,这个方法调用了HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_8);依然是调转到实现,跳转到\Drivers\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_gpio.c,其中又调用了HAL_GPIO_EXTI_Callback(GPIO_Pin);这个是调用中断允许用户可以自定义的函数实现,调转到定义处;有__weak限定符,把这个方法拿到gpio.c中重写实现如下:

/* USER CODE BEGIN 2 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	uint16_t value=0;
        if(GPIO_Pin == GPIO_PIN_8)
	{
		HAL_ADC_Start(&hadc);//Æô¶¯ADC²É¼¯			
	        while(!(hadc.Instance->ISR & (1<<2)));//µÚ¶þλ״̬±íʾEOC£¬±íʾת»»Íê³É		 
		value = HAL_ADC_GetValue(&hadc);
		printf("key adc value = %d\n", value);
				
	        while(!(hadc.Instance->ISR & (1<<2)));//µÚ¶þλ״̬±íʾEOC£¬±íʾת»»Íê³É		 
		value = HAL_ADC_GetValue(&hadc);
		printf("light adc value = %d\n", value);
		
		HAL_ADC_Stop(&hadc);
	 
	}
}

首先是用HAL函数库方法启动ADC,

因为是多通道读取,先判断ISR第二位标记,是否已经准备好,如果没有就循环判断,准备好就开始读取。

读取一个后,ADC自动扫描下一个,这里就继续判断状态位,是否采集完成。所以通过两次读取完成,如果是更多的通道也同理可以完成。

最后停止ADC读取,等待下一次按键启动中断再执行。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享