一、硬件介绍
1、产品特点
Arduino Nicla Vision 搭载STM32H747AII6 双核芯片(Cortex-M7_480MHz + Cortex-M4_240MHz),板载六轴智能运动传感器、集成麦克风和距离传感器、Wi-Fi和蓝牙模块、以及一个200万的彩色摄像头;
特性

系统框图

功率

二、电池管理芯片 (MAX17262)
MAX17262 是一款超低功耗电量计IC,采用了美信的ModelGauge m5算法,可监测单节电池组,并支持内部电流检测。该IC可自动补偿电池老化、温度和放电速率的影响,并在广泛的工作条件下,以百分比(%)形式提供准确的充电状态(SOC),以毫安时(mAh)形式提供剩余容量。该IC能准确估算电池的剩余使用时间和充满时间,并提供三种报告电池老化情况的方法:容量降低、电池内阻增加和循环里程计。 该IC可精确测量电流、电压和温度。电池组的温度可通过内部温度传感器或外部热敏电阻进行测量。
板载锂电池连接方式


特性
补偿电池老化、电流和温度的影响
无需放空、充满或闲置状态
集成内部电流检测选项:7mΩ和30mΩ(典型值)
热敏电阻或 ±1°C内部温度测量
动态功率估算放电期间的功率能力
估算剩余使用时间和充满时间
恒功率或恒流预测理论负载下的剩余容量
无需校准
针对电压、SOC、温度、电流和1% SOC变化的报警指示
原理图


三、代码编写
安装支持库

获取锂电池电量等信息
充电状态监控 (电压、电流、剩余容量、温度、电量百分比、充满 / 耗尽预估时间等);
constexpr int BATTERY_CAPACITY_MAH = 950 // 实际电池容量 mAh C
constexpr NTCResistor NTC_TYPE = NTCResistor::Resistor10K // NTC 阻值 (10K / 100K)
#include "Arduino_PowerManagement.h"
Charger charger;
Battery battery;
constexpr int BATTERY_CAPACITY_MAH = 950; // 电池容量 mAh
constexpr NTCResistor NTC_TYPE = NTCResistor::Resistor10K; // NTC 阻值 (10K / 100K)
void setup() {
Serial.begin(115200);
delay(1000);
// 初始化
if (!charger.begin()) {
Serial.println(" 初始化失败 ");
while (true);
}
//打印电池相关信息
Serial.println("* 参数信息如下: ");
Serial.println("* 充电电压: " + String(charger.getChargeVoltage()) + " V");
Serial.println("* 充电电流: " + String(charger.getChargeCurrent()) + " mA");
Serial.println("* 终止电流: " + String(charger.getEndOfChargeCurrent()) + " mA");
Serial.println("* 电池容量: " + String(BATTERY_CAPACITY_MAH) + " mAh");
Serial.println();
// 初始化电池监测
BatteryCharacteristics characteristics;
characteristics.capacity = BATTERY_CAPACITY_MAH;
characteristics.ntcResistor = NTC_TYPE;
characteristics.endOfChargeCurrent = charger.getEndOfChargeCurrent();
characteristics.chargeVoltage = charger.getChargeVoltage(); // 4.2V
battery = Battery(characteristics);
bool batteryInitialized = battery.begin(true);
if (!batteryInitialized){
Serial.println("电池监测初始化失败!");
while (true);
}
}
void loop() {
static ChargingState lastState = ChargingState::none;
// 打印当前充电状态
ChargingState currentState = charger.getState();
if (currentState != lastState) {
lastState = currentState;
Serial.println("当前充电状态: " + getChargerStateString());
}
// 仅当电池连接时读取详细信息
if (battery.isConnected()) {
Serial.println("电池状态:");
Serial.println(" • 电压: " + String(battery.voltage(), 2) + " V");
Serial.println(" • 电流: " + String(battery.current()) + " mA (" + (battery.current() > 0 ? "充电中" : "放电中") + ")");
Serial.println(" • 电量: " + String(battery.percentage()) + "%");
Serial.println(" • 容量: " + String(battery.remainingCapacity()) + " / " + String(battery.fullCapacity()) + " mAh");
if (battery.internalTemperature()) { // 有效温度
Serial.println(" • 温度: " + String(battery.internalTemperature()) + "°C");
}
// 电池正在充电
if(battery.current()){
printTime(battery.timeToFull(), " • 预计充满时间");
}else{ // 电池正在放电
printTime(battery.timeToEmpty(), " • 预计耗尽时间");
}
Serial.println();
} else {
Serial.println("电池未连接");
}
delay(2000);
}
// 获取充电状态
String getChargerStateString() {
switch (charger.getState()) {
case ChargingState::preCharge: return "预充电";
case ChargingState::fastChargeConstantCurrent: return "恒流快充";
case ChargingState::fastChargeConstantVoltage: return "恒压充电";
case ChargingState::endOfCharge: return "充电终止中";
case ChargingState::done: return "充电完成";
case ChargingState::timerFaultError: return "充电超时错误";
case ChargingState::thermistorSuspendError: return "温度异常(暂停充电)";
case ChargingState::batteryOvervoltageError: return "电池过压错误";
case ChargingState::chargerDisabled: return "充电器已禁用";
case ChargingState::chargerBypassed: return "USB电压供电";
default: return "未知状态";
}
}
// 时间转换
void printTime(uint32_t seconds, const char* label) {
uint32_t h = seconds / 3600;
uint32_t m = (seconds % 3600) / 60;
uint32_t s = seconds % 60;
Serial.println(String(label) + ": " + h + "h " + m + "m " + s + "s");
}


我要赚赏金
