添加电池电压检测

本小节主要教你编写电池电压检测相关代码。

了解硬件

我们的稳压模块上带有一个简单的电阻分压电路,并引出了相关引脚,可以连接 STM32 的 ADC 引脚,检测电池电压。

红圈标准部分为电阻分压电路 alt ><
Image 5.19.1 - 红圈标准部分为电阻分压电路 alt ><

在小车系统中,我们把稳压模块的 AD 引脚连接到了 STM32 的 PA5 引脚,如图的红线标注所示。

连接STM32的PA5引脚 alt ><
Image 5.19.2 - 连接STM32的PA5引脚 alt ><

配置STM32CubeMX

Analog 中选择 ADC1 设置,并选择 IN5 通道5。

配置PA5引脚1 alt ><
Image 5.19.3 - 配置PA5引脚1 alt ><

或者在右边图找到 PA5 引脚,选择 ADC1_IN5

配置PA5引脚2 alt ><
Image 5.19.4 - 配置PA5引脚2 alt ><

具体配置参数如下。

配置参数 alt ><
Image 5.19.5 - 配置参数 alt ><

ADC 时钟配置。ADC 分频系数设置为 6,ADC的输入时钟为 12。

ADC时钟配置 alt ><
Image 5.19.6 - ADC时钟配置 alt ><

点击 GENERATE CODE 生成代码。

打开上一小节的 MiaowLabs-Demo 工程,在左侧项目栏的Application/User文件夹中找到control.c,双击打开该文件。在该文件中加入 adc.h 头文件:

#include "adc.h"
加入头文件 alt ><
Image 5.19.7 - 加入头文件 alt ><

定义两个变量,并初始化。

unsigned short g_sADC_Value = 0;// ADC转换值存放
float g_fVoltage  = 0.0;        // 电压值
定义变量 alt ><
Image 5.19.8 - 定义变量 alt ><

再编写一个读取电池电压的函数:

/*
    读取电池电压,返回值为实际电压值
*/
float GetBatVoltage(void)
{
    HAL_ADC_PollForConversion(&hadc1, 100);// 等待转换完成,第二个参数表示超时时间,单位ms
    g_sADC_Value = HAL_ADC_GetValue(&hadc1);// 为换取ADC状态
    g_fVoltage = (float)g_sADC_Value * 0.004834;// 0.4834= ((3.3/4096)/(2/(10+2))),其中3.3v为参考电压,4096为12位ADC,2和10为电阻分压电路上的2K和10K电阻
    return g_fVoltage;// 返回值为实际电压值
    }
编写函数 alt ><
Image 5.19.9 - 编写函数 alt ><

打开control.h,在里面声明这个函数。

float GetBatVoltage(void);

再打开main.c文件,在/* USER CODE BEGIN 1 *//* USER CODE END 1 */之间定义一个临时变量:

float fTemp;

/* USER CODE BEGIN 2 *//* USER CODE END 2 */之间加入启动 ADC 转换语句:

HAL_ADC_Start(&hadc1);// 启动ADC转换

在主循环while(1)中加入代码

fTemp = GetBatVoltage();//获取电池电压
printf("电池电压 = %f \n",fTemp);//把电池电压打印出来
HAL_Delay(1000);//延时1秒

这样就可以通过串口助手查看电池电压了,我们打开 SSCOM 串口助手,或其他串口工具,设置波特率为 115200,数据位为 8 ,停止位为 1,打开串口,这时记得要打开小车的电源开关,就可以看到小车的实时电压了。

串口助手显示电压 alt ><
Image 5.19.10 - 串口助手显示电压 alt ><

这时候,细心的同学会发现在加入了上面代码后,我们之前的按键控制 LED 功能失效了。因为我们在 main 函数中加入了延时函数,这导致按键功能失效,不过这里重点不在这里,我们后面实际应用到按键功能时,再去解决这里的按键失效问题。

results matching ""

    No results matching ""