
#第九届立创电赛#CH591D无线温湿度计
简介
使用低功耗BLE单片机制作的无线温湿度计,通关这个工程分享低功耗处理的经验。
简介:使用低功耗BLE单片机制作的无线温湿度计,通关这个工程分享低功耗处理的经验。开源协议
:CC BY-NC 3.0
描述
感谢立创商城、盛思锐以及各赞助商,借着这次活动以这个工程为例分享自己低功耗应用设计的经验。
低功耗的定义因应用的不同而存在比较大的差异,但低功耗应用系统中绝大多数时间处于休眠待机状态,尽可能的降低待机时的电流能增加系统的续航时间。低待机电流需要从供电、低功耗低静态电流(Iq)芯片、休眠时电路控制等方面去入手,下面将从硬件、软件两部分去讲解。
1 . 项目功能介绍
本工程为BLE超低功耗应用,需要在有限的电源(CR2032)上实现更长的续航,工程使用低功耗BLE单片机CH591D以及低功耗的温湿度传感器SHT40通过BLE将温度度数据广播出去,用立创·ESP32S3R8N8开发板演示数据接收,我以这个工程为例从供电、硬件各部分选型以及软件处理分析功耗组成,做为完整项目也会本工程对外壳选型绘制PCB尺寸以及焊接制作等进行说明。
功耗测试:使用供电为紫米CR2032,空载3.2V电压,210mAH,室温30℃。
功耗测试仪器使用为合宙IoT Power-CC(可以使用同类型其他仪器),附件中提供IOTPower2的功耗测试数据。休眠电流2.87uA左右,脉冲最大电流9.3mA。
功耗在线计算网站,续航计算公式:理论续航 = 电池容量(mAh) / (24*功耗(mAh))。
条件 | 功耗(uAH) | 理论续航(天) |
---|---|---|
广播间隔2秒 ,获取温湿度间隔4秒 | 9.36 | 934 |
广播间隔2秒 ,获取温湿度间隔2秒 | 11.3462 | 771 |
广播间隔1秒 ,获取温湿度间隔2秒 | 15.1422 | 577 |
2 . 项目属性
本项目首次公开,项目为原创,未参与过其他比赛。
3 . 开源协议
CC-BY-NC 3.0
4 . 硬件部分
低功耗应用开发硬件部分我从供电电池、电源芯片、主控单片机、其他芯片、电池电量测量、部分电路供电控制等方面讲述各类型的优缺点适用于什么类型低功耗应用,本工程的各部分选择放硬件部分章节末尾进行说明以及解释。
4.1 供电电池
电池部分 分可充电电池、一次性电池两部分,分别介绍这两类电池部分电池的特性。这两大类电池为化学储能,在低温下其放电能力各有不同程度的打折,使用时也需要考虑使用温度范围。
-
可充电电池,电池自放电率比较大 (电池满电存放几个月到一年左右的时间电池就没电),持续放电电流跟瞬时放电电流都比较大,合适功耗比较大以及时不时充电的应用,比如蓝牙耳机、蓝牙键盘、MP3、手机等,电池放电性能卖家一般都会给出。
-
三元锂电池(单节),额定电压3.7V左右,一般使用电压2.5V-4.2V,主要电量在3.5V-4.2V之间,使用温度范围 (°C)0 ~ 50。
-
磷酸铁锂电池(单节),额定电压3.2V左右,一般使用电压2.0V-3.65V,主要电量在2.0V-3.3V之间,使用温度范围 (°C)-40 ~ 50。
上面这两类电池外形有长方体硬壳或者软包,圆柱形,使用可充电电池需要配套对应电池类型的充电电路,TP40xx系列、XT40xx系列用于三元锂电池充电,XT2059AASR、LN2053Y2SR支持上面2种类型电池充电,此外还需要增加外置电源供电跟电池供电的切换电路,例如下图的PMOS供电切换电路,也可以使用电源管理芯片来控制。
-
-
一次性电池,电池自放电率低 (电池满电存放数年还有比较高的电量),合适功耗比较小,长时间不需要更换电池的应用,比如遥控器、LCD段码屏电子手表、时钟、电子门锁、天然气表等。
- 锂锰电池(单节),一般使用电压2.0-V3.4V,主要电量在2.5-V3.0V之间,持续放电电流跟瞬时放电电流都比较小,合适长时间休眠偶尔唤醒工作一小段时间的应用,使用温度范围 (°C)-30 ~ 85。
锂锰电池电池脉冲放电电流越高电池在放电期间压降越高,持续放电同理,需要注意瞬间放电后的电池电压是否能满足供电要求
- CR1220(容量40mAh左右,持续放电电流建议2mA以下,脉冲放电电流建议10mA以下)。
- CR2032(容量200mAh左右,持续放电电流建议5mA以下,脉冲放电电流建议20mA以下)
- CR2450(容量600mAh左右,持续放电电流建议5mA以下,脉冲放电电流建议20mA以下)
- CR2477(容量1000mAh左右,持续放电电流建议5mA以下,脉冲放电电流建议20mA以下)
- 更多规格就不一一列出来了,容量只是参考值,每种规格都有容量低跟容量高的产品。
- 锂亚电池(单节),一般使用电压2.0V-3.6V,主要电量在3.0V-3.5V之间,持续放电电流跟瞬时放电电流比较小,合适长时间休眠偶尔唤醒工作一小段时间的应用,使用温度范围 (°C)-60 ~ 85。
锂亚电池常用在水表、天然气表,配合超级电容使用可大大提高脉冲放电电流,需要防止电池钝化。
- ER14250(容量1200mAh左右,持续放电电流建议15mA以下,脉冲放电电流建议50mA以下)
- ER14505(容量2700mAh左右,持续放电电流建议40mA以下,脉冲放电电流建议150mA以下)
- ER34615(容量19000mAh左右,持续放电电流建议230mA以下,脉冲放电电流建议400mA以下)
- ER341245(容量35000mAh左右,持续放电电流建议420mA以下,脉冲放电电流建议500mA以下)
- 更多规格就不一一列出来了,容量只是参考值,每种规格都有容量低跟容量高的产品
- 碳性/碱性电池(单节),一般使用电压0.7V-1.6V,主要电量在0.9V-1.5V之间,持续放电电流跟瞬时放电电流比较小,合适长时间休眠偶尔唤醒工作一小段时间的应用,使用温度范围 (°C)-20 ~ 60。
碳性/碱性电池常用在家用电器上,比如遥控器、玩具等,存在电池漏液风险,这两类电池小电流放电下容量会比标称值多。
- 碳性--7号电池(容量300mAh左右,持续放电电流建议100mA以下)
- 碳性--5号电池(容量800mAh左右,持续放电电流建议100mA以下)
- 碱性--7号电池(容量900mAh左右,持续放电电流建议500mA以下)
- 碱性--5号电池(容量2000mAh左右,持续放电电流建议500mA以下)
- 更多规格就不一一列出来了,容量只是参考值,每种规格都有容量低跟容量高的产品
- 锂锰电池(单节),一般使用电压2.0-V3.4V,主要电量在2.5-V3.0V之间,持续放电电流跟瞬时放电电流都比较小,合适长时间休眠偶尔唤醒工作一小段时间的应用,使用温度范围 (°C)-30 ~ 85。
4.2 电源芯片
电源芯片的静态电流(Iq)会随着负载变化,这个变化一般是要比芯片数据手册上给的静态电流要大。
- 电池直接供电,没有电源芯片耗电,但需要电路能在电池主要电量电压范围内工作。
- 低静态电流(Iq)LDO
合适输入电压跟输出电压差比较小的场合,电压差大了LDO的转换效率会比较差,消耗较多的电流用来发热,反映到续航上就是缩短电池续航。
- XC6206P332MR(Iq-1.5uA,最大输出电流200mA)
- H7605-33MR(Iq-1.5uA,最大输出电流300mA)
- 低静态电流(Iq)DCDC
合适输入电压跟输出电压差比较大一些的场合,电压差大转换效率会比用LDO高,反映到续航上就是增加电池续航。选择时需要注意芯片在低电流下的效率(uA级电流或者mA级电流),选择更小DCR的功率电感可以提升DCDC电路效率。
- 升压(碳性/碱性电池升压)
- ME2188A33XG(Iq-7.5uA,输出电流300mA,电路简单)
- TLV61220(Iq-5.5uA,输出电流220mA,,低输出电流下效率不错))
- 同步降压
- SGM6031-3.3(Iq-200nA,输出电流400mA,4V输入3.3V 10uA输出下效率超85%)
- TPS62740(Iq-360nA,输出电流300mA)
- TLV627432(Iq-300nA,输出电流400mA)
- TPS62843(Iq-275nA,输出电流600mA,很好很贵)
- TPS62840(Iq-60nA,输出电流750mA,1uA输出电流下效率达到80%,很好很贵)
- 升压(碳性/碱性电池升压)
4.3 主控单片机
- 非无线应用1,比如1秒时间内唤醒单片机干活10毫秒且休眠不需要保持外设内存数据时关注下电模式功耗与正常工作时的功耗即可,不一定得用低功耗单片机。
- 非无线应用2,在非无线应用1的基础上需要睡眠时保持内存或者外设工作时就需要用低功耗单片机了,低功耗单片机有更细的电源管理,这时需要关注睡眠下维持内存以及所需要外设的功耗。
- 无线应用,例如BLE应用,在非无线应用1与2的基础上还需要关注无线收发的功耗以及是否带内置DCDC供电转换,单片机内置DCDC转换可以大幅降低正常工作时的功耗,以CH592为例
4.4 其他芯片
其他芯片同样也需要考虑关断以及工作时的功耗,下面列出一些低功耗芯片:三轴加速度传感器ADXL362、陀螺仪+加速度传感器QMI8658A、温度传感器NST112、温度传感器NST1001、温湿度传感器SHT40、压力传感器MS561101BA03、压力传感器HP203B、光照强度传感器BH1750FVI、IO扩展SN74HC165PWR、LCD段码屏驱动HT1621、运算放大器TLV9042等。
4.5 电池电量测量
- 使用电源管理芯片、电量计芯片
- 单片机ADC内部电源电压测量通道,适用于电池直接供电应用。
- 电池电压经过电阻分压后使用ADC测量,分压电阻不能往无限大方向选择所以存在小电流消耗。
-
- 用PMOS+NMOS电路控制电池电压输入
- 用PMOS+NMOS电路控制电池电压输入
4.6 部分电路供电控制
- OLED屏关闭时升压芯片选用带使能控制的,不用时关闭升压芯片
- 使用POMS控制部分电路供电,不用时切断供电
- 使用单片机IO为低功耗传感器供电,不使用时把IO设置成下拉输入,减少传感器待机消耗电流
例如在使用温湿度传感器SHT40、温度传感器NST112这类对供电电流需求小的传感器时可以挂到IO上供电。
4.7 本工程硬件选型以及焊接组装
我的需求是设计一个小巧能使用CR2032这类纽扣电池供电续航超过一年的无线温湿度传感器,通关标准BLE广播温湿度数据,方便布置在家里各个位置,通过上位机获取温湿度传感器数据。
-
供电,使用紫米CR2032直接供电给系统,CR2032电池比较常见而且电池容量以及价格都比其他型号更有性价比,使用电池弹片配合外壳连接电池。
-
温湿度传感器,SHT40(供电1.08V-3.6V),盛思锐的SHT4x系列温湿度传感器里的性价比选择,精度不错价格也不贵,简单易用。板子本身功耗极低发热忽略不计,所以SHT40在PCB布局中不需要做降低热传导的隔离操作。
-
指示灯,成兴光0603的绿色贴片LED灯 型号XL-1608UGC-04,上电亮一下方便知道板子开始工作了。
-
主控单片机,沁恒微的CH591D(供电1.7V-3.6V),供电范围要求能满足CR2032供电,单片机带DCDC转换供电,待机以及RF发射功耗满足我的设计需求,芯片外围简单,下面简单说几个重点。
- ch591D 硬件设计参考
- 晶振:高频晶振必须使用32MHz 10ppm,低频晶振对于广播应用可省(用内置32KHz RC振荡器),单片机内部集成了晶振负载,工程里我使用杨兴晶振的X322532MOB4SI。
- 芯片详细外围设计参考数据手册以及例程包中的评估板原理图。
- DCDC电感:10uH 额定电流>=50mA、等效电阻(DCR)<=1Ω,等效电阻越小DCDC电路效率稍微高些(按需选择吧),工程里我使用普罗德的PSTMAA252010-100M,等效电阻90mΩ。启用DCDC会降低RF发射功耗、降低RX的接收灵敏度,工程仅需要发射信号,降低RX的接收灵敏度故此不影响。
- PCB天线为FR4 1mm板厚的封装
-
外壳,使用带CR2032电池仓的成品ABS壳体,方便省事还便宜,需要根据壳体内部空间去设计PCB,壳体链接,附件中提供壳体CAD图纸、PCB板框图。
使用CAD类软件打开壳体图纸,根据图纸画出PCB边框图导出DXF格式后再导入立创EDA专业版作为板框使用。温湿度传感器位置需要手动开孔(LED指示灯各位按需选择),开孔位置入下图,如有需要温湿度传感器位置开孔可贴上防水透气膜。
-
焊接组装
我个人的焊接步骤:先给PCB焊盘、CH591D都上一遍焊锡 > 助焊剂洗干净板子、CH591D>给焊盘涂上助焊剂 > 摆上除温湿度计外的元器件 > 用PTC加热板烤制(焊锡融化后摆正元器件、处理元器件立碑,压出CH591D焊盘多余的焊锡用烙铁吸走,加助焊剂后用镊子轻微推动几次CH591D,让它能自动复位) > 取下板子等待冷却后用助焊剂洗干净板子 > 检查焊接情况(特别注意看QFN的CH591D焊接情况,有虚焊就涂助焊剂用带焊锡的烙铁补焊,处理完后助焊剂洗干净板子) > 给SHT40焊盘涂上少量助焊剂,摆上SHT40 > 用PTC加热板烤制(焊锡融化后用镊子轻微推动几次,它能自动复位) > 取下板子。SHT40使用热风枪吹有没有影响我不知道,以及用助焊剂洗它有没有事我也不懂,不舍得尝试。
5. 软件部分
程序软件工程使用MounRiver Studio创建(程序工程链接),程序使用沁恒的蓝牙协议栈TMOS(TMOS用法)构建,程序添加了很多注释方便大家理解程序流程以及TMOS的使用,程序流程如下图,详细请自行看源代码。
//广播包数据结构
uint8_t advertData[] = {
0x02, //AD Structure长度 2
GAP_ADTYPE_FLAGS,//设备标识
GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,
//广播数据
0x0a,//AD Structure长度 10
GAP_ADTYPE_LOCAL_NAME_SHORT,//数据类型 缩写设备名
0xe6,0xb8,0xa9,0xe6,0xb9,0xbf,0xe8,0xae,0xa1,//温湿计 URL编码
0x02, //AD Structure长度 2
0x0a,//发射功率
0,//信号强度0dbm
0x06,//AD Structure长度 6
GAP_ADTYPE_MANUFACTURER_SPECIFIC, //自定义数据 用来填充温湿度、电池电压数据
0, 0, //温度 高8位在前,低8位在后 实际温度数值需要 除100
0, 0, //湿度 高8位在前,低8位在后 实际湿度数值需要 除100
0//电池电量 %
};
-
低功耗,软件处理层面
- 设置好未用到的GPIO口为上拉输入或者下拉输入大大减少GPIO跑电,GPIO口状态不确定时消耗的电流会比较多。
#if(defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE) GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU); GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU); #endif
- 执行完任务后设置单片机进入休眠或者下电模式,下图为本工程执行完任务后进入休眠。
- 给SHT40下达测温湿度指令后再次进入休眠,10毫秒后再唤醒单片机读取SHT40测温湿度数据
- 尽量减少任务执行耗时,单片机使用更高的主频或者优化任务执行时间,使用低瞬时放电电流大电池需要考虑高主频带来唤醒工作的瞬时电流大小,本工程中单片机使用1M IIC与SHT40进行通信以减少唤醒执行任务耗时。
- 把唤醒执行的任务放入RAM中运行,省去在Flash上执行时 Flash消耗的电流,本工程中函数前面添加__HIGH_CODE字段为把函数放入RAM中运行。
- 设置好未用到的GPIO口为上拉输入或者下拉输入大大减少GPIO跑电,GPIO口状态不确定时消耗的电流会比较多。
-
使用立创·ESP32S3R8N8开发板获取温湿度数据
程序挺简单的,使用VSCode + IDF5.0开发,使用了nimble协议栈,程序可以修改编译目标芯片用于ESP32其他带BLE的型号。使用时需要在SDK配置编辑器里设置蓝牙>nimble only 以及cmkelists添加 nimble_central_utils组件。程序流程为不停的扫描BLE广播,扫描到的广播通关温湿度计广播包数据结构进行过滤只显示温湿度计广播包(包长、第五个字节),详细请自行看附件中的源代码(ble_adv_scan.zip)。程序编译为USB-JTAG,开发板上的两个串口都可以下载程序,串口输出扫描到的温湿度计的广播包(CH340K串口波特率为115200,S3内置USB转串口波特率自适应)。
(set(EXTRA_COMPONENT_DIRS ${CMAKE_CURRENT_LIST_DIR}/nimble_central_utils))
-
使用BLE调试助手获取温湿度数据
BLE调试助手可在各大手机应用商店下载,制作方为南京沁恒微。
-
给CH591D下载程序
使用沁恒的WCHISPTool(下载链接),使用USB转串口工具通过单片机的串口进行下载程序,单片机需要冷启动才能被下载工具识别到(首次下载程序单片机上电就在下载程序模式了),附件里提供2秒广播、获取温湿度间隔的固件。- 1.选择芯片系列
- 2.芯片型号选择CH59x CH591,下载接口选择 串口,设备列表选择对应的COM口
- 3.选择好固件并且打上✓
- 4.点击下载
QQ交流群:697752852,非 手把手教学群
6 . BOM清单
外壳跟电池弹片需要淘宝购买,附件给出了购买链接,X2 32.768KHz晶振不需要焊接。
7 . 大赛LOGO验证
8 . 演示您的项目并录制成视频上传
设计图

BOM


评论