【ROS2机器人入门到实战】电池电压测量-学会使用ADC

4.电池电压测量-学会使用ADC

写在前面

  1. 当前平台文章汇总地址:ROS2机器人从入门到实战
  2. 获取完整教程及配套资料代码,请关注公众号<鱼香ROS>获取
  3. 教程配套机器人开发平台:两驱版| 四驱版
  4. 为方便交流,搭建了机器人技术问答社区:地址 fishros.org.cn

你好,我是爱吃鱼香ROS的小鱼。上面两节通过LED和按键学习了GPIO的输出和输入。

但这种输入和输出只有两种状态HIGH或者LOW,我们称这种为数字逻辑,这也是输入输出函数称为数字输入和数字输出的原因。

但是电池的电压是一个在一个范围内不断变化的值,明显无法通过HIGHLOW来表示,所以本节我们学习使用ADC,将电压值这个模拟信号转换成数字信号。

一、ADC介绍

在这里插入图片描述

ADC(analog to digital converter)模数转换器是一种非常常见的外设,用于将电压等模拟信号转换为数字形式,以便微控制器可以读取和处理。

ADC在控制和监控应用中非常有用,因为大多数传感器(例如温度、压力、力)都是输出的模拟电压,所以我们需要掌握ADC。

与ADC相对应的DAC——用于将数字信号转换成模拟信号,比如将一段二进制的音乐文件转换成一段连续的电压信号播放出来就需要DAC。

二、电池电压测量原理

在我们的开发板所使用的ESP32单片机上,自带了ADC模块,我们只需要将需要测量的模拟电压接入相应引脚,接着调用ADC相关API即可读取。

因为ADC原理是采用电压比较方式进行测量,而我们的单片机的供电电压为3.3V,所以测量的电压范围最大不能超过3.3V,但我们采用的电池电压和板子的供电电压分别是12V和5V的。

所以想要使用单片机测量电池电压,那么就要想办法将板子测量的电压按照比例缩小即可,根据初中物理知识,串联分压原理,小鱼就设计了这样的电路。

在这里插入图片描述

串联分压,左边接电机电压输入引脚,右侧接地,R18是40.2千欧阻值的电阻,R19是10千欧的,假如此时VMOTOR的输入电压为5V,那么ESP_IO34的电压就是
V E S P I O 34 = V V M O T O R ∗ ( 10 / ( 40.2 + 10 ) ) = V V M O T O R / 5.02 V_{ESPIO34}=V_{VMOTOR}*(10/(40.2+10))=V_{VMOTOR}/5.02 VESPIO34=VVMOTOR(10/(40.2+10))=VVMOTOR/5.02
那么如果此时通过ADC测量出 V E S P I O 34 V_{ESPIO34} VESPIO34上的电压,通过下面的等式就可以算出 V V M O T O R V_{VMOTOR} VVMOTOR的电压值。
V V M O T O R = V E S P I O 34 ∗ 5.02 V_{VMOTOR} =V_{ESPIO34}*5.02 VVMOTOR=VESPIO345.02

三、Arduino ADC API

了解了原理,我们来看看Arduino为我们提供了哪些API可以直接获取到引脚上的电压。

3.1 设置ADC衰减系数(analogReadResolution)

这个函数用来设置ADC读取时的衰减系数。

输入到引脚的电压在输入到ADC之前可能会衰减。有 4 种可用的衰减选项,衰减越高,可测量的输入电压就越高,为了能够测量到12V以上的电压,我们采用最高的衰减比-ADC_11db。

typedef enum {
    ADC_0db,
    ADC_2_5db,
    ADC_6db,
    ADC_11db,
} adc_attenuation_t;

3.2 读取ADC值(analogRead)

此函数用于获取给定引脚或ADC通道的ADC原始值,默认是12位分辨率,所以这个读出来的值的范围就是0-2^12,也就是最大4096。

uint16_t analogRead(uint8_t pin);
  • pin 要读取ADC值的GPIO 引脚

返回值:ADC原始值

3.3 读取电压值(analogReadMillivolts)

此函数用于获取给定引脚或ADC 通道的 ADC 值(以毫伏为单位)。

uint32_t analogReadMilliVolts(uint8_t pin);
  • pin 要读取ADC值的GPIO 引脚

返回值:此函数将以毫伏为单位返回模拟值。

四、编写程序

利用上面的三个API和计算公式就可以实现电压的测量,新建example04_adc工程,在main.cpp输入代码。

/**
 * @file main.cpp
 * @author fishros@foxmail.com
 * @brief 4.电池电压测量-学会使用ADC
 * @version 0.1
 * @date 2023-01-04
 *
 * @copyright Copyright(c) fishros.com  2023
 *
 */
#include <Arduino.h>

void setup()
{
  Serial.begin(115200);
  pinMode(34, INPUT);
  analogSetAttenuation(ADC_11db);
}

void loop()
{
  int analogValue = analogRead(34);                     // 读取原始值0-4096
  int analogVolts = analogReadMilliVolts(34);           // 读取模拟电压,单位毫伏
  float realVolts = 5.02 * ((float)analogVolts * 1e-3); // 计算实际电压值

  Serial.printf("ADC analog value = %d\n", analogValue);
  Serial.printf("ADC millivolts value = %d\n", analogVolts);
  Serial.printf("realVolts value = %f\n", realVolts);
  delay(100);
}

五、测试

根据第三节中的原理图,我们测量的是VMOTOR的电压,VMOTOR是通过一个跳线帽选择连接到5V还是12V上的,详情可以看下面的原理图。

在这里插入图片描述

对应板子上的位置

在这里插入图片描述

这里我们把跳线帽调整到左侧,让VMOTOR和5V连接,接着打开串口观察测量到的电压值。

在这里插入图片描述

可以看到我们成功的测量到了实际的电压值为5.045V,符合正常电压值。

如果你有整台FishBot小车,可以将跳线帽调整到12V的位置,打开电池电源开关,看看是否可以正常测量到12V的电压。

六、总结

本节我们通过电池电压测量的例程,学习了ADC的使用,电池电压测量对我们机器人来说是非常重要的,当电压低的时候可以进行自动返回充电,然后等充电完成后再继续工作。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 电池电量显示算法是一种用于实现电池电量显示功能的算法。在使用电子设备时,我们经常会看到电量显示,这个数字通常是一个百分比,比如60%、80%等。这个数字是根据电池电量的变化来计算的。所有电池都有一定的电压范围,当电量充足时,电池电压会比较高,当电量较少时,电压也会相应降低。 在C语言中,可以通过使用ADC(模数转换器)来读取电池电压值,再根据电压值来计算电量显示的百分比。根据经验数据,不同的电池在不同的电压范围内显现不同的电量百分比,但电量还与电池的类型、使用时间和负载电流等因素有关。 一般情况下,我们可以使用一个简单的线性函数来计算电池电量与电压的关系。例如,我们可以将电压范围0V-1V视为电池电量100%,将1V-1.5V视为电池电量50%,1.5V-2V视为电池电量20%等等。通过这些经验数据,我们可以得到一个基本的电量与电压的映射关系,然后在程序中进行编写。 需要注意的是,电池电量显示算法是一个比较简单的算法,但精确度并不高,因为电池的电量与电压之间并非严格线性关系。因此,在实际应用中,需要根据具体情况进行精细调整,以提高电量显示的准确度。 ### 回答2: 在C语言中,电池电量显示算法是一个用于计算电池电量的程序。该程序使用各种传感器和输入设备来检测电池的充电状态,并确定电池的剩余使用时间和当前电量。电池电量显示算法的主要目的是为用户提供准确的电量信息,帮助他们管理他们的设备的电池寿命。 电池电量显示算法的实现通常基于以下两种方法:基于电量估计和基于电量测量。在基于电量估计的方法中,电池电量的估计基于电量使用的时间和电池类型。在基于电量测量的方法中,电池电量的测量基于实际电量消耗率和电池容量。 实现电池电量显示算法时,需要注意以下几点:首先,要确保电量测量和估计是准确的,以提供准确的电量信息。其次,需要考虑电池的性能和寿命,以确保电池使用寿命不受影响。最后,需要定期检查电池的状态,并及时更换电池,以确保设备始终保持正常运行。 总之,电池电量显示算法在C语言中的实现是一个复杂的任务,需要考虑各种参数和变量,以提供准确的电量信息和实现电池保护。 ### 回答3: 电池电量显示算法是指在移动设备上如何准确地显示电池电量的算法。在C语言中,可以通过以下步骤来实现电池电量显示算法。 首先需要获取电池电量的当前值,这可以通过读取电池电压或电流来实现。然后根据设备的电池容量和电压范围,计算出电池电量的百分比。 其次,需要对电池电量进行平滑处理,以减少电量突变带来的误差。可以使用滑动平均方法来实现平滑处理,将连续多次读取的电池电量值取平均值作为当前电量值,从而减小突变带来的误差。 最后,为了更加准确地显示电池电量,需要根据设备实际使用情况对电池电量进行校准。例如,当设备在使用高功率运算时,电池电量下降速度会加快,需要调整电量显示算法中的参数,以确保电量显示的准确性。 总之,电池电量显示算法需要结合硬件和软件的实际情况进行设计和调整,以确保电量的准确性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值