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

举报
神龙居市 发表于 2022/02/26 22:16:28 2022/02/26
【摘要】 1.目标利用ADC采集按键以及光照传感器的数据,并在按键中断处理程序中打印采集的结果。按键和光照分别采集,2个通道,这样实现多通道的试验。1.1多通道采集原理通过CubeMX设计界面配置ADC的多个通道,并且设置采集顺序,配置号寄存器后。ADC的DR寄存器只有一个,要采集多个通道,会根据配置按顺序一个一个的进行采集。在执行采集获取数据时,需要注意要判断寄存器状态,是否已经采集完成。1.2原理...

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读取,等待下一次按键启动中断再执行。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。