【蓝桥杯嵌入式】【HAL库】五、获取ADC+LCD显示

原理图分析

蓝桥杯的板子上带了四个电位器,其中上图两个引脚对应的是ADC1和ADC2某个通道的引脚,本次我们用ADC1的11通道,也就是PB12来获取ADC的数值,并且通过计算得到电压值,然后用lcd显示出来。ADC的原理相信学过数电的同学都十分熟悉了,在这里不再叙述,不明白的同学查一下资料几分钟就明白了。

STM32CubeMX配置

时钟,时钟数配置不再叙述。 ADC引脚配置: 关于该ADC的配置我们只需要改动一处,其他默认即可(仅限本次简单的显示电压),Clock Prescaler我们要进行6分频,我们在时钟树找到下图:

我们的ADC得到的时钟频率是80MHz,而我们的ADC为了保证数据的稳定性,时钟频率不要超过14MHz,所以此处我们有以上配置。(但是我看官方给的例程就是直接用80MHz,然后也能正常显示,但查资料都说要小于14MHz…额,后续再研究研究) 然后生成工程即可。

代码

因为我们需要用lcd显示,所以上节用到的lcd文件夹也要加入该工程里,流程和上节一样,在这不再叙述。 剩下的就只是获取ADC数值和显示的代码了,一些问题我已经在注释写的很清楚了,找到合适的位置粘贴即可。 在main函数上面定义获取ADC数值的子函数:

/* USER CODE BEGIN 0 */
uint16_t getADC(void)//12位ADC,要用uint16_t定义
{
          
   
	uint16_t adc = 0;//定义adc数值
	
	//以下两句配合使用,得到adc的数值
	HAL_ADC_Start(&hadc1);
	adc = HAL_ADC_GetValue(&hadc1);
	
	return adc;//返回得到的adc数值
}
/* USER CODE END 0 */

main函数:

/* USER CODE BEGIN 2 */
  	char buf[20];//定义用来显示一行lcd的20位字符串
	
	//以下为lcd初始化,白底,红字
	LCD_Init();
	LCD_Clear(White);
	LCD_SetBackColor(White);
	LCD_SetTextColor(Red);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
          
   
    /* USER CODE END WHILE */
		sprintf(buf, "     VAL:%.2fV     ", getADC()*3.3/4096);//计算电压值并放入到字符串里
		HAL_Delay(100);
		LCD_DisplayStringLine(Line4, (uint8_t *)buf);//在第四行显示字符串
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

在main.h中添加的头文件:

/* USER CODE BEGIN Includes */
#include "lcd.h"
#include "stdio.h"//包含字符操作的相关函数
#include "string.h"//包含字符操作的相关函数
/* USER CODE END Includes */

运行结果

转动第二个电位器,就可以获的不同的电压值了。

经验分享 程序员 微信小程序 职场和发展