第十三届蓝桥杯嵌入式备赛-STM32G431-进阶模块调试④ADC采样

目录

0.前言

1.功能要求

电路原理图

2.STM32Cubemx初始化

 ADC1详细配置

 ADC2详细配置

 3.程序实现

main.c相关初始化

 ADC_GetValue()编写

adc.c引入外部变量

ADC_GetValue()

 4.工程文件


0.前言

这套教程针对于蓝桥杯嵌入式比赛的底层模块调试,针对于比赛进行每个模块的调试,低层模块调试好,对于赛题的实现就会方便很多,虽然有一些应试教育的意味,不过准备这个比赛对于程序整体实现思维还是有着很大帮助,我也从中受益颇多!

1.功能要求

使用STM32G431内置的ADC对R37、R38和MCP4017进行ADC采样

电路原理图

2.STM32Cubemx初始化

将PB15设置为ADC2_IN15、PB14设置为ADC1_IN5、PB12设置为ADC1_IN11

 ADC1详细配置

 ADC2详细配置

 

 3.程序实现

程序使用的相关函数定义位置会在文末给出,一定自己去对应文件查找,当然能够记住是最好的!!

main.c相关初始化

main.c中创建LCD相关变量

/*main.c*/

uint16_t ADC_tt=0;//ADC读取计时标志位
uint16_t ADC_Ref=0;//ADC读取标志位
uint16_t ADC_Deal=0;//ADC读取后处理标志位
uint16_t R37_Value=0,R38_Value=0,MCP_Value=0;//存储读取到的电压值

 Task_Time()函数扩充,以执行定时读取ADC值(移步②,查看该函数)

/*main.c*/

void Task_Time(void)
{
	if(++Key_tt==10)	{Key_tt=0;Key_Ref=1;}//按键扫描计时
	if(++Lcd_tt==200)	{Lcd_tt=0;Lcd_Ref=1;}//LCD刷新计时
	if(++ADC_tt==300)	{ADC_tt=0;ADC_Ref=1;}//ADC读取计时
}

主循环中添加判断程序(ADC_GetValue()之后会讲到)

/*main.c*/

  while (1)
  {
	if(ADC_Ref==1)
	{
		ADC_Ref=0;//清除标志位
		ADC_GetValue();
	}
  }

 ADC_GetValue()编写

该函数用于获取ADC的值,并且存放在对应的变量中,将该函数定义在adc.c中,并在adc.h中声明该函数

/*adc.h*/

void ADC_GetValue(void);

adc.c引入外部变量

/*adc.c*/

extern uint16_t R37_Value,R38_Value,MCP_Value;//存储读取到的电压值

ADC_GetValue()

注意,需要使用轮询的方式来读取ADC的值,在读取同一ADC中的值时,应该多次开启ADC,按照通道顺序读取,全部读取后再关闭ADC

/*adc.c*/

void ADC_GetValue(void)
{
	HAL_ADC_Start(&hadc1);//开启ADC1
	HAL_ADC_PollForConversion(&hadc1,2);//轮询模式
	MCP_Value=HAL_ADC_GetValue(&hadc1);//读取ADC1_IN5的值(MCP)
	
	HAL_ADC_Start(&hadc1);//再次开启ADC
	HAL_ADC_PollForConversion(&hadc1,2);//轮询模式
	R38_Value=HAL_ADC_GetValue(&hadc1);//读取ADC1_IN11的值(R38)
	HAL_ADC_Stop(&hadc1);//关闭ADC1
	
	HAL_ADC_Start(&hadc2);//开启ADC2
	HAL_ADC_PollForConversion(&hadc2,2);//轮询模式
	R37_Value=HAL_ADC_GetValue(&hadc2);//读取ADC2_IN15的值(R37)
	HAL_ADC_Stop(&hadc2);//关闭ADC2
}

相关函数定义位置stm43g4xx_hal_adc.c

/*stm43g4xx_hal_adc.c*/

HAL_ADC_Start(ADC_HandleTypeDef *hadc);
HAL_ADC_PollForConversion(ADC_HandleTypeDef *hadc, uint32_t Timeout);
HAL_ADC_GetValue(ADC_HandleTypeDef *hadc);
HAL_ADC_Stop(ADC_HandleTypeDef *hadc);

在Task.c中声明外部变量,即可使用读取到的电压了

/*Task.c*/

extern uint16_t R37_Value,R38_Value,MCP_Value;//存储读取到的电压值

 4.工程文件

该工程文件为全10讲所有内容,可以作为参考,不过还是希望读者能够自己手敲一遍,加深记忆

链接:https://pan.baidu.com/s/1LcNszc7_oHWvXcucCezlxg?pwd=hw07 
提取码:hw07

  自己做的笔记,也希望能对你有帮助! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别人家的孩子380

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值