问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

基于STM32的ADC电压采集与显示详解

创作时间:
作者:
@小白创作中心

基于STM32的ADC电压采集与显示详解

引用
CSDN
1.
https://blog.csdn.net/weixin_45922644/article/details/145812229

本篇文章将详细介绍如何使用STM32的ADC(模数转换器)模块来测量电池电压。通过一个具体的智能小车项目,我们将展示从硬件电路设计到软件实现的完整过程。

什么是ADC?

ADC(模数转换器)是将模拟信号转换为数字信号的电子元件。在嵌入式系统中,ADC常用于测量各种模拟量,如电压、电流、温度等。在本项目中,我们将使用ADC来测量锂电池的电压。

硬件电路设计

锂电池的电压通常在12V左右,而STM32的ADC最大测量电压为3.3V。因此,我们需要使用分压电路将电池电压降低到ADC可接受的范围内。

如上图所示,我们使用两个电阻(R1和R2)组成分压电路。根据分压原理,ADC输入端的电压将是VBAT_IN的五分之一。

软件实现

ADC初始化

在使用ADC之前,需要进行初始化。在本项目中,我们使用HAL库来实现ADC的初始化和数据采集。

采集电压

在adc.c文件中添加ADC相关函数:

/*******************
*  @brief  电池电压测量计算函数
*  @param  无
*  @return 小车电池电压
*
*******************/
float adcGetBatteryVoltage(void)
{
    HAL_ADC_Start(&hadc2); // 启动ADC转换
    if (HAL_OK == HAL_ADC_PollForConversion(&hadc2, 50)) // 等待转换完成,超时时间50ms
        return (float)HAL_ADC_GetValue(&hadc2) / 4096 * 3.3 * 5; // 计算电池电压
    return -1;
}

这段代码首先启动ADC转换,然后等待转换完成。如果转换成功,将获取到的ADC值转换为实际的电池电压值。注意,由于我们使用了分压电路,所以需要将ADC值乘以5。

显示电压

在main函数中调用显示函数显示电压:

sprintf((char*)OledString, "U:%.2fV", adcGetBatteryVoltage());
OLED_ShowString(0, 2, OledString, 12); // 这个是OLED驱动里面的,是显示位置的一个函数

这段代码将电池电压值格式化为字符串,并通过OLED显示屏显示出来。

总结

通过本项目的实现,我们可以看到使用STM32的ADC模块进行电压测量并不复杂。只需要合理设计硬件电路,并使用HAL库进行软件实现,就可以轻松实现电池电压的监测。这对于开发各种需要监测电池状态的嵌入式系统非常有帮助。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号