【蓝桥杯嵌入式】ADC模数转换的原理图解析与代码实现(以第十一届省赛为例)——STM32G4

【蓝桥杯嵌入式】专题正在持续更新中,原理图解析✨,各模块分析✨以及历年真题讲解✨都在这儿哦,欢迎大家前往订阅本专题,获取更多详细信息哦

本系列专栏 -  蓝桥杯嵌入式_勾栏听曲_0的博客

欢迎大家    点赞  评论  收藏⭐️

个人主页 - 勾栏听曲_0的博客

希望本文能对你有所帮助,如有不足请指正,共同进步吧

君子之道,暗然而日章;小人之道,明然而日亡。

目录

原理图解析

 设置STM32CubeMX

 手搓代码

实例运用


原理图解析

        从图中可以看出,模拟输出的引脚分别为PB15和PB12。

【蓝桥杯嵌入式】ADC模数转换的原理图解析与代码实现(以第十一届省赛为例)——STM32G4_第1张图片

 设置STM32CubeMX

        打开STM32CubeMX后,找到PB15和PB12,并把他们设置为ADC输入模式。PB15的为ADC2_IN15,PB12的为ADC1_IN11。

【蓝桥杯嵌入式】ADC模数转换的原理图解析与代码实现(以第十一届省赛为例)——STM32G4_第2张图片

         然后在左侧的Analog中设置ADC,如我们设置刚刚配置给PB12的ADC1,通道为IN11设置为slingle ended,PB15的ADC2的通道IN15前打勾。这样ADC在STM32CubeMX的设置就完成了。

【蓝桥杯嵌入式】ADC模数转换的原理图解析与代码实现(以第十一届省赛为例)——STM32G4_第3张图片

 手搓代码

        利用STM32CubeMX生成号代码后,我们新建两个文件来单独写ADC的代码,但是要注意的是,新文件不能命名为adc.c和adc.h,因为用STM32CubeMX会生成adc.c和adc.h的库文件,为例使命名不冲突,就想要命名为其他名字。

        如下所示,ADC的有效代码只有4行,而且也没什么难点,等一下我们直接以十一届省赛左例子来使用一下,这里我们来讨论一下这四行代码中的最后一句,这个算式为什么这样写呢。

        我们通过HAL_ADC_GetValue();这个函数获取的是一个电压值,而存储这个电压值是12位的空间,也就是说这个函数理论上取出来的电压值在0~4095之间。3.3是这个电位器的实际最大电压为3.3。因此我们除以4096再乘3.3就知道这个电压值对应的真实电压数值是多少啦。

double getADC(ADC_HandleTypeDef *pin)
{
	uint adc;
	HAL_ADC_Start(pin);
	adc = HAL_ADC_GetValue(pin);
	return adc*3.3/4096;
}

实例运用

题目

【蓝桥杯嵌入式】ADC模数转换的原理图解析与代码实现(以第十一届省赛为例)——STM32G4_第4张图片

        这里要求使用PB0来检测电位器R37的电压信号,我们在STM32CubeMX上的PB0接口选择ADC_IN15就可以啦,这里我们改一下题目,将两个电位器都测一下

        使用STM32微控制器ADC通道(PB15和PB12)分别测量竞赛板电位器R37与R38输出的模拟电压信号。并在LCD屏中显示出来。

代码实现

aadc.c中依旧是我们上面提到的获取ADC的函数

double getADC(ADC_HandleTypeDef *pin)
{
	uint adc;
	HAL_ADC_Start(pin);
	adc = HAL_ADC_GetValue(pin);
	return adc*3.3/4096;
}

        在lcd.c中调用getADC并显示,getADC(&hadc1)获取的是R38电位器的模拟电压信号,getADC(&hadc2)获取的是R37电位器的模拟电压信号。

void disp_proc()
{
	char text[30];
	sprintf(text,"      Para   ");
	LCD_DisplayStringLine(Line4, (uint8_t *)text);

	sprintf(text,"    V: %.2f",getADC(&hadc1));
	LCD_DisplayStringLine(Line6, (uint8_t *)text);
	sprintf(text,"    V: %.2f",getADC(&hadc2));
	LCD_DisplayStringLine(Line7, (uint8_t *)text);
}

你可能感兴趣的:(蓝桥杯嵌入式,STM32,蓝桥杯,stm32,嵌入式硬件,c语言,算法)