0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

通过电池电压测量的例程学习ADC的使用

CHANBAEK 来源:鱼香ROS 作者:小鱼 2023-07-03 10:57 次阅读

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

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

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

教程所使用硬件平台为MicroROS学习板V1.0.0,可点击阅读原文购买及查看详情

图片

一、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的电压就是

图片

那么如果此时通过ADC测量出上的电压,通过下面的等式就可以算出的电压值。

图片

三、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的使用,电池电压测量对我们机器人来说是非常重要的,当电压低的时候可以进行自动返回充电,然后等充电完成后再继续工作。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • adc
    adc
    +关注

    关注

    97

    文章

    6286

    浏览量

    542303
  • 电池电压
    +关注

    关注

    0

    文章

    194

    浏览量

    11574
  • GPIO
    +关注

    关注

    16

    文章

    1168

    浏览量

    51494
  • ROS
    ROS
    +关注

    关注

    1

    文章

    276

    浏览量

    16880
收藏 人收藏

    评论

    相关推荐

    MCU ADC如何测量超过6V的VCC电池电压呢?

    假设MCU的供电是3.3V,ADC能够测量电压范围是0-3.3V,如果要测量电池电压6V的这
    的头像 发表于 04-07 09:04 2072次阅读

    实验板用锂电池供电,怎么测量供电电压

    我现在用了一个实验板,通过电池供电,STM32F103的单片机,通18650的圆柱电池通过升压达到5V,让设备工作,怎么测量一下1865
    发表于 04-24 08:27

    请教哪位大侠做过电池内阻测量 求助

    大侠好是这样的,我现在手上有个案子,测试手机电池的内阻;我一直没做过电池这块。查了下资料;交流测量法应该可以满足这个测试案子;但是就是找不到测试用电路图;只是原理。还请哪位大侠给个电路参考下;还有就是测试到的
    发表于 12-10 16:19

    STM8L的ADC测量VDD电压详解+例程

    为1.225V。 ADC选择内部参考电压作为测量通道,可以测量到内部电压的转化值Nadc。 此时,已经VDD的转化值4096,VREFIN
    发表于 07-02 07:33

    测量电池电压,请问有办法在发射讯号时,去量测ADC值吗?

    HI ALL, 目前我有一设备是SLEEP DEVICE ,我在测量电池电压发现个问题,在发射讯号时,实际电流会很高,会导致输入电池电压会被
    发表于 08-09 06:12

    adc测量电压没有用到adc引脚和通道

    想要ADC测量电池电压,参考了半天例程,写出来也能电压得到3.3V,但是我最后发现竟然没有用到
    发表于 11-16 08:50

    怎么使用ADC Delsig来测量系统中车载电池电池容量

    你好,在我的设计中,我试图使用ADC Delsig来测量系统中车载电池电池容量,通过使用PSoC中的A
    发表于 03-26 16:29

    如何通过电池管理IC提升电池性能?

    或放松状态的情况下学习容量。温度测量输入包括其自己的芯片读数以及两个外部热敏电阻。通过结合所有这些因素,该算法消除了电池接近空电压以及库仑计
    发表于 03-16 11:13

    新一代BMS电压和电流测量

    用于通过电阻抗谱分析来计算充电状态和运行状况状态。通过测量电池电压、电流和功率来计算电池阻抗,
    发表于 04-28 15:14

    通过电池电压测量例程学习ADC模数转换器的使用

    5.045V,符合正常电压值。  如果你有整台FishBot小车,可以将跳线帽调整到12V的位置,打开电池电源开关,看看是否可以正常测量到12V的电压。  六、总结  本节我们
    发表于 03-28 14:39

    电池电压过低及过电流保护电路

    电池电压过低及过电流保护电路原理图
    发表于 11-03 11:07 2728次阅读
    <b class='flag-5'>电池</b><b class='flag-5'>电压</b>过低及<b class='flag-5'>过电</b>流保护电路

    延长电池寿命的微功率浪涌阻断器过电压过电流保护

    延长电池寿命的微功率浪涌阻断器过电压过电流保护
    发表于 04-20 17:12 10次下载
    延长<b class='flag-5'>电池</b>寿命的微功率浪涌阻断器<b class='flag-5'>过电压</b>和<b class='flag-5'>过电</b>流保护

    RT1064学习笔记(1)--ADC例程(ADC Demo)

    RT1064之ADC例程Ps:本例程主要作用是,展示如何使用QTIMER模块来实现正交解码。主板为:逐飞RT1064 + 母板
    发表于 11-14 17:36 17次下载
    RT1064<b class='flag-5'>学习</b>笔记(1)--<b class='flag-5'>ADC</b><b class='flag-5'>例程</b>(<b class='flag-5'>ADC</b> Demo)

    通过电压测量估算电池剩余容量不准确

    实施电池电量计可以通过多种方式完成,包括使用电压测量或库仑计数。虽然使用电压测量一直是一种流行的
    的头像 发表于 03-10 10:37 2041次阅读
    仅<b class='flag-5'>通过电压</b><b class='flag-5'>测量</b>估算<b class='flag-5'>电池</b>剩余容量不准确

    通过电压电平转换功能实现智能电池储能系统

    电子发烧友网站提供《通过电压电平转换功能实现智能电池储能系统.pdf》资料免费下载
    发表于 09-05 09:36 0次下载
    <b class='flag-5'>通过电压</b>电平转换功能实现智能<b class='flag-5'>电池</b>储能系统