任务介绍
2025 Make Blocks第五期的终于发布了,其实我们在第二期预测的时候以为电池管理与电源管理会一同发布,不过确实这两个主题是一同发布的,不过是在第五期才发布的,我们先不管具体的任务,正对这个主题发布一下看法,电源管理和电池管理是一个项目系统最重要的组成部分之一,我们在进行一个系统设计的时候,不过是USB供电还是电池供电,电子系统必然是需要功能的,对于大型设备多以交流电通过AC-DC+DC-DC的方式进行供电,小设备一般采用电池+USB进行供电,我们本次就是再次通过自定义的方式实现热成像系统的供电系统的设计。
模块功能介绍
由于本次的设计具有处于设计阶段的第五期,在上一期的基础上继续添加电源管理和电池管路部分,也是本期的主题。需要用到一部分未使用的引脚进行采集或者控制。
本次任务增加的功能模块一共有两部分:
第一部分是电源管理部分,这里我们选择的是通过三极管以及MOS管搭建一个可以通过多元共同控制的开关管理电路,比如当USB供电存在的时候处于第一优先级供电;可以通过按键实现开关机操作,并结合MCU的控制引脚实现开机自锁;
第二部分是电池管理部分,这一部分实际上和任务一比较相似,主要的是电池充电管理,充电状态可采集,供电电压的采集需要用到ADC,实现电池的电量状态的指示。
模块硬件介绍
TPB4056A是一款具有成本效益的高集成度线性充电器,适用于单电池锂离子或锂离子聚合物电池。该设备支持从USB端口或交流适配器充电。具有过压保护的高输入电压范围支持低成本的非调节适配器。TPB4056A的充电电流是完全可编程的,最高可达1000 mA,带有外部电阻。TPB4056A在达到浮动电压后,当充电电流低于设定的充电电流值的可编程最小充电电流时,自动终止充电周期。TPB4056A实现了两个指示引脚,PPR和CHG,允许连接到微控制器或led来显示设备的状态,采用开式漏极结构,当输入电压在工作范围内时,PPR引脚保持低电平,CHG引脚在充电状态时保持低电平。其他引脚处于高阻抗状态。TPB4056A具有热折叠式功能,限制充电电流,保护器件免受过结温度故障的影响。TPB4056A还集成了监视器,UVLO和OVP功能,以防止设备损坏。
设计框图
设计框图主要是系统内的功能关系(增加电源管理部分),如下:
原理图和PCB模块介绍
原理图
PCB
本次是在上一阶段的基础上增加了电源管理和电池管理,其实我们在上一期有关传感器的内容的时候增加了环境采集传感器和三轴传感器,不过由于主要关注在热成像上了,就没有把这一部分发布,这里简单的提一下。由于增加了很多模块,可以看到布局上已经没有太多位置了,前面是屏幕也没法增加,所以增加了一个扩展接口(还有很多引脚没有用到,就通过这个扩展口延伸,包括热成像模块的连接)。理论上我们还需要做一个转接板把扩展口的功能做个延伸。
3D效果图
实物图
软件调试
本次我们主要是对电源管理及电池管理部分的状态采集和控制,主要设计一个ADC采集和一个引脚的采集,以及自锁引脚的控制,主要配置代码如下:
#define POWER_HOLD_SET HAL_GPIO_WritePin(POWER_HOLD_GPIO_Port, POWER_HOLD_Pin, GPIO_PIN_SET);
#define POWER_HOLD_RESET HAL_GPIO_WritePin(POWER_HOLD_GPIO_Port, POWER_HOLD_Pin, GPIO_PIN_RESET);
#define READ_USBCHG HAL_GPIO_ReadPin(USBCHG_GPIO_Port, USBCHG_Pin)
#define READ_KEY_P HAL_GPIO_ReadPin(SW_P_GPIO_Port, SW_P_Pin)
然后就是电源管理的函数:
void Power_Hold(void)
{
POWER_HOLD_SET;
}
void DeviceOff(void)
{
TFT_BL_0();
while(READ_KEY_P);
HAL_Delay(100);
POWER_HOLD_RESET;
}
uint8_t GetPowerBattery(void)
{
uint8_t BattGrade = 0;
uint8_t USBCHGflag = 0;
uint16_t BattValue = 0;
USBCHGflag = ~(READ_USBCHG|0xfe);//充电状态检测
Power.USBCHGflag = ~(READ_USBCHG|0xfe);//充电状态检测
/*************************电池电量采集***********************/
BatteryAdcValue = HAL_ADC_GetValue(&hadc1);;
BattValue = BatteryAdcValue*11*54/4096;
/*************************状态判断***********************/
if(USBCHGflag == 1)
{
BattGrade = 7;
}
else if((USBCHGflag == 0)&&(BattValue >= 400))
{
BattGrade = 6;
}
else if((USBCHGflag == 0)&&(BattValue >= 380)&&(BattValue < 400))
{
BattGrade = 5;
}
else if((USBCHGflag == 0)&&(BattValue >= 365)&&(BattValue < 380))
{
BattGrade = 4;
}
else if((USBCHGflag == 0)&&(BattValue >= 350)&&(BattValue < 365))
{
BattGrade = 3;
}
else if((USBCHGflag == 0)&&(BattValue >= 340)&&(BattValue < 350))
{
BattGrade = 2;
}
else if((USBCHGflag == 0)&&(BattValue < 340))
{
BattGrade = 1;
}
return BattGrade;
}
效果展示
电池供电:
充电状态:
心得体会
在阶段2的实现阶段我们其实花费了一定的时间进行了界面显示的优化(电池电量),实际上交互是贯穿整个活动的设计的,这一次主要调试的是电源管理部分,这一部分相对来说简单一点,只有电池电量采集和充电状态。本次进行了电源状态的基础功能的实现,继续加油!。