蓝桥杯嵌入式-HAL库-ADC

实验目的

通过LCD显示电压值,并通过旋转R37改变电压值

ADC相关知识

STM32 HAL库学习系列第1篇 ADC配置 及 DAC配置

硬件设计

原理图

在这里插入图片描述

在这里插入图片描述

STM32CubeMX配置

1、引脚选用PB15测电压
在这里插入图片描述
2、时钟源选择HSE
在这里插入图片描述
3、设置时钟频率。在HCLK处输入80回车
在这里插入图片描述
4、配置ADC对应的GPIO引脚。此处只加了别名R37
在这里插入图片描述
5、选用ADC2的通道15测量电压。
在这里插入图片描述
6、ADC参数配置。时钟预分频系数设置为“2分频的异步时钟模式” ,其他采用默认配置。
在这里插入图片描述
在这里插入图片描述

7、设置工程名、选择编译软件
在这里插入图片描述
8、只引用所需库文件;生成各模块单独的.c和.h文件。
在这里插入图片描述
9、生成代码
在这里插入图片描述

Keil配置

1、添加LCD相关文件。将赛点资源包提供的fonts.h和lcd.h添加到新建工程的Inc文件夹中
路径:D:\MX_project\ADC2\Core\Inc
在这里插入图片描述
在这里插入图片描述

将赛点资源包提供的lcd.c添加到新建工程的Src文件夹中
路径:D:\MX_project\ADC2\Core\Src
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2、下载器选择及相关配置
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

软件设计

1、main.c中添加头文件。(注:所有代码放到BEGIN和END之间,防止重新生成代码时将原来的代码覆盖掉)
在这里插入图片描述

#include "stdio.h"
#include "string.h"
#include "lcd.h"

2、获取ADC电压值的函数
在这里插入图片描述

uint16_t getADC(void)
{
	uint16_t adc = 0;
	
	HAL_ADC_Start(&hadc2); //轮询模式,需放在循环中不断开启
	adc = HAL_ADC_GetValue(&hadc2); //读取ADC的值
	
	return adc;
}

在这里插入图片描述
在这里插入图片描述

3、定义一个字符数组存储电压值
在这里插入图片描述

	char buf[20];

4、LCD初始化等处理(想更详细了解LCD,请看LCD篇)
在这里插入图片描述

	LCD_Init();
	LCD_Clear(Blue);
	LCD_SetBackColor(Blue);
	LCD_SetTextColor(White);
	
	LCD_DisplayStringLine(Line0, (uint8_t *)"                    ");
	LCD_DisplayStringLine(Line1, (uint8_t *)"                    ");
	LCD_DisplayStringLine(Line2, (uint8_t *)"      ADC Test      ");
	LCD_DisplayStringLine(Line3, (uint8_t *)"                    ");
	LCD_DisplayStringLine(Line4, (uint8_t *)"                    ");
	
	LCD_SetBackColor(White);
	LCD_SetTextColor(Blue);

	LCD_DisplayStringLine(Line5, (uint8_t *)"                    ");
	LCD_DisplayStringLine(Line6, (uint8_t *)"      ADC2 CH15     ");
	LCD_DisplayStringLine(Line7, (uint8_t *)"                    ");
	LCD_DisplayStringLine(Line8, (uint8_t *)"                    ");
	LCD_DisplayStringLine(Line9, (uint8_t *)"                    ");

5、轮询读取电压值,并将电压值显示到LCD上
ADC采用12位分辨率,2^12=4096
电压最大值:3.3V
获取到的电压值*3.3/4096 = 十进制的电压值
在这里插入图片描述

		LCD_SetTextColor(Red);
		sprintf(buf, "      VAL:%.2fV", getADC()*3.3/4096);
		HAL_Delay(100);
		LCD_DisplayStringLine(Line8, (uint8_t *)buf);	

编译、擦除、下载

1、编译工程
在这里插入图片描述
编译成功
在这里插入图片描述

2、擦除程序
在这里插入图片描述
擦除成功
在这里插入图片描述
3、下载程序
在这里插入图片描述
或者
在这里插入图片描述
下载成功
在这里插入图片描述

函数位置

ADC

在这里插入图片描述在这里插入图片描述

HAL_StatusTypeDef       HAL_ADC_Start(ADC_HandleTypeDef *hadc);
uint32_t                HAL_ADC_GetValue(ADC_HandleTypeDef *hadc);
ADC初始化
static void MX_ADC2_Init(void)
{
  ADC_ChannelConfTypeDef sConfig = {0};
  /** Common config 
  */
  hadc2.Instance = ADC2;
  hadc2.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1; //时钟分频 //1分频,ADCCLK=PCLK2/1=
  hadc2.Init.Resolution = ADC_RESOLUTION_12B; //ADC的分辨率,12位模式
  hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT; //右对齐,低12有效
  hadc2.Init.GainCompensation = 0;
  hadc2.Init.ScanConvMode = ADC_SCAN_DISABLE; //关闭扫描模式,即单通道有效
  hadc2.Init.EOCSelection = ADC_EOC_SINGLE_CONV; 
  hadc2.Init.LowPowerAutoWait = DISABLE;
  hadc2.Init.ContinuousConvMode = DISABLE;  //单次转化模式,关闭连续转换
  hadc2.Init.NbrOfConversion = 1; //通道数量为1
  hadc2.Init.DiscontinuousConvMode = DISABLE; //禁止不连续采样模式
  hadc2.Init.ExternalTrigConv = ADC_SOFTWARE_START;  // 软件触发
  hadc2.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; //使用软件触发
  hadc2.Init.DMAContinuousRequests = DISABLE; //关闭DMA请求
  hadc2.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  hadc2.Init.OversamplingMode = DISABLE;
  if (HAL_ADC_Init(&hadc2) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel 
  */
  sConfig.Channel = ADC_CHANNEL_15;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_640CYCLES_5;
  sConfig.SingleDiff = ADC_SINGLE_ENDED;
  sConfig.OffsetNumber = ADC_OFFSET_NONE;
  sConfig.Offset = 0;
  if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
}

LCD

在这里插入图片描述
在这里插入图片描述

void LCD_Init(void);
void LCD_SetTextColor(vu16 Color);
void LCD_SetBackColor(vu16 Color);
void LCD_Clear(u16 Color);
void LCD_DisplayStringLine(u8 Line, u8 *ptr);

实验现象

通过旋转R37电位器可以改变电压
在这里插入图片描述

问题

电压最大只有3.23V。不知道是误差还是什么原因导致的。有大佬知道原因的请指教。
在这里插入图片描述

蓝桥杯嵌入式-HAL库-TIM_BASE

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

xiaolan@

亲,打赏随意

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

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

打赏作者

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

抵扣说明:

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

余额充值