沁恒微蓝牙低功耗应用实战说明
前言在做低功耗蓝牙产品时如何保证低功耗是每个产品避不开的话题。 理想情况下一款设计正确的 BLE 产品在广播间隔、连接间隔合理外部电路配合得当的前提下平均电流完全可以做到几十微安甚至更低一颗纽扣电池撑几个月是正常水平。但在技术群社区论坛等地方很多开发者把产品打样回来一上电测电流发现数据远高于预期然后就问我功耗怎么这多大可当被问及细节休眠底电流是多少GPIO 上电默认什么状态外部元器件的静态功耗 分压电阻的静态功耗都不知道甚至都不确定芯片到底有没有真的进休眠。底电流就明明白白写在数据手册里。低功耗从来不是靠感觉瞎猜而是一连串硬件 软件细节叠加的结果——任何一个环节漏掉都会在功耗表上体现出来。所以本文的目的是从实际出发带大家建立做低功耗产品时该有的思路先知道正常该多低 → 再定位高在哪 → 最后对每个环节进行正确的设置与处理。相关博文沁恒微 RISC-V 蓝牙芯片低功耗测试BLE 蓝牙连接参数详解沁恒微 蓝牙 TMOS 休眠流程及休眠时外部中断的使用理解 与 计算 物联网产品的电池使用寿命参考博文《CH592/CH585功耗测试》https://www.cnblogs.com/gscw/p/17479352.htm【沁恒蓝牙开发】LCD低功耗配置.我是矜辰所致全网同名尽量用心写好每一系列文章不浮夸不将就认真对待学知识的我们矜辰所致金石为开目录前言一、 低功耗模式与最小系统休眠电流1.1 认识底电流最小系统电流1.2 从数据手册认识低功耗模式1.3 最小系统实测功耗方法1.4 跑蓝牙底电流说明二、外围电路低功耗设计2.1 供电部分2.2 分压/采样电阻网络电池电压采样2.3 高功耗外围的通断电控制2.4 其他常见外围的低功耗接法三、软件低功耗设计3.1 芯片如何进入低功耗3.1.1 不跑蓝牙低功耗3.1.2 跑蓝牙低功耗3.2 其他配置说明3.2.1 GPIO 配置3.2.2 关于主频3.2.3 一些外设说明四、功耗异常排查步骤附录 电池使用时间计算结语一、 低功耗模式与最小系统休眠电流本文以 CH585 为例说明其他系列芯片思路一致1.1 认识底电流最小系统电流在分析低功耗的时候要建立一个重要的概念芯片底电流 就是芯片最小系统休眠时的功耗 。其中最小系统就是让芯片能正常上电、运行的最简硬件电源 必要的退耦电容、时钟外部晶振或内部 RC不带传感器、不带 LED、不带 LDO 等其他外围电路。为什么要在这个状态下测底电流只有把外围全部剥掉我们测到的电流才纯粹是芯片本身的功耗没有外设漏电、没有分压电阻、没有 LDO 静态电流的干扰。这个读数能让我们确定是芯片问题还是外围电路导致功耗异常。举个例子我们测试到产品 休眠电流 是 50µA芯片休眠电流最大是 10µA芯片手册。而测出来 产品上芯片最小系统是 不超过 10µA 那多出来的部分就不是芯片的问题是你板子上的外围电路导致应该去查外围电路如果 产品上芯片最小系统大于 10µA那么那问题在芯片侧没真正进休眠、IO 没配对最小系统硬件出问题等。保证芯片最小系统在合理范围再重新测试整体功耗再确定外围电路是否有问题。那芯片的底电流从哪里可以知道答案就在芯片手册里面。1.2 从数据手册认识低功耗模式拿 CH585 来说在芯片手册的电源控制章节最后有个低功耗模式的表格介绍了 CH585 的各种低功耗模式和功耗这就是芯片最小系统在不同休眠模式下面的底电流典型值。1.3 最小系统实测功耗方法在官方的 EVT 示例里面给我们提供了可以测试这些低功耗模式的示例我们可以根据示例来评估我们自己产品最小系统的低电流是不是合理。博主之前有一篇使用开发板测试低功耗的文章《 沁恒微 RISC-V 蓝牙芯片低功耗测试 》里面有详细的测试说明本文还需要补充的是测量底电流一定要确保测量的是最小系统通过原理图 和 PCB 确定自己要测量的点功耗仪器直接通过芯片电源给芯片供电 如果不确定是否有其他影响的元器件看原理图看原理图看原理图 不要想当然的觉得其他什么外设都没有了。如果板子上有 LDO 建议去掉 LDO 而不是直接接在 LDO 的输出端很多情况下也会影响功耗。串口 DEBUG 不要连接串口会影响低功耗即便不开启串口如果物理上连接了 USB 转串口设备也可能影响功耗。板子上的 LED 测量电源用的 ADC 分压电阻其他传感器都得去掉或者断开 。最小系统功耗测量 硬件连接 请严格遵循上面说明遇到不确定务必要查看原理图确定比如测量官方 EVT 开发板电源入口是 VCC 而 USB 的 5V 通过一个 LDO 转成 3V3 正常使用情况下板子上 3V3 和 VCC 是通过跳线帽短接起来在我们测试最小系统的时候直接去掉跳线帽功耗仪器电源连接 VCC 万用表只能用来测量静态不变的功耗大部分万用表 uA 和 mA 是两个挡位需要确保电流范围在这个挡位测量如果跑蓝牙时候会不断跳变万用表是测量不准确的。测量步骤请参考上面推荐博文测量结果可以和芯片手册的功耗值进行对比如果是在表格范围内说明最小系统是没有问题的再把自己产品的其他元器件焊接好测量整体功耗自己计算好外围元器件的功耗的理论值与实测值判断是否符合预期。1.4 跑蓝牙底电流说明对于跑蓝牙时候的底电流在上面测试文章里面也已经有很直观的结果跑蓝牙的时候不管是广播还是连接之后射频发送都是间歇性的广播的时候是周期性广播连接之后根据协商的连接间隔周期交互信息。在这间隔期间我们就可以使得芯片进入休眠以达到低功耗的目的。对于蓝牙的低功耗的说明要理解蓝牙低功耗的实现方式在不需要进行广播或者数据交互的时候使得芯片进入休眠达到低功耗所以会有上图那种功耗图。官方示例跑蓝牙时候使用的是 SLEEP 模式我们检查的时候首先要确保底电流是符合 SLEEP 模式的功耗。在确保底电流正常的情况下我们应该关注的是自己的应用中广播间隔和连接间隔的设置这些参数的含义要明白不明白的可查看博主之前的文章《BLE 蓝牙连接参数详解》。简单的核心就是加大间隔减小功耗响应变慢减小间隔增加功耗响应变快。广播间隔、连接间隔是影响产品功耗首要因素。对于唤醒瞬间的功耗基本上可以认为与自己设定的发送功率有关。发送功率越大功耗越高。同时沁恒提供一个内部 DCDC 用户可以通过开启内部 DCDC 降低工作时候的功耗DCDC 不影响休眠时候的功耗不影响底电流。发送功耗与 DCDC 的影响手册里面也有表格说明唤醒时候的功耗记住和自己设置的发射功率和是否开启 DCDC 有关博主发现有的小伙伴对着这个发送功耗研究半天甚至通过这个参数计算功耗对于应用来说这里并不需要我们研究那么多这是芯片射频工程师的问题。沁恒蓝牙低功耗设置很简单通过一个宏定义HAL_SLEEP开启即可我们降低功耗的方式是合理的选择满足自己应用需求的广播间隔连接间隔。这里推荐一篇文章里面有芯片不同广播间隔连接间隔的测试数据参考https://www.cnblogs.com/gscw/p/17479352.html二、外围电路低功耗设计上文的说明是针对最小系统接下来就来说一说芯片之外的电路设计这个是要靠大家自己去选择本文给大家说明一下需要关注的参数指标和一些通用电路的设计思路。2.1 供电部分整个产品的供电部分建议如下能不用的 LDO 就不用如果电池电压范围正好覆盖芯片工作区间CH58x/CH59x 系统电源电压最大值为 3.6V 具体以手册为准可以省掉 LDO 直接电池供电。例如 纽扣电池 3.0V 直接供 VDD33 。锂亚电池 3.6V 接一个肖特基二极管也可以直接供 VDD33 二极管务必接上因为标定 3.6V 的锂亚电池满电一般会略大于 3.6V 。锂电 4.2V 不能直接接必须稳压。使用 LDO 稳压而不是 DCDC老生常谈的问题 低功耗用 LDO做硬件设计的基础问题。LDO 的选型重要的关注点LDO 的静态电流 IQ 一定要低。这个是 LDO 一直需要消耗的电流。对于一些注重低功耗的 LDO在手册里面都会标明自己的静态电流比如 当然一般还要兼顾考虑一下芯片压降 Dropout就是上图第二个指标越小的越建议因为压降大的 LDO 会导致电池后期更加带不动。2.2 分压/采样电阻网络电池电压采样分压电路是休眠漏电流的一大来源。电路中所有的分压电路不管是采样电路还是基准参考分压器电阻上一直会有漏电流。典型的就是电池电压采样电路它的最简模型如下把 Vbat 经 R1R2 分压送 ADC这条路的静态电流 Vbat / (R1R2) 一直流是需要一直消耗的 。打个比方 R1 R2 都是10K 那么它的静态漏电流就是 3.3V / 20kΩ 165µA一直在消耗 。分压电阻不能使用太小阻值否则静态功耗大。那直接使用大电阻分压是否可行比如大于 1M 的电阻不就行了 。这个就要分情况讨论了大电阻可以降低功耗但是需要注意芯片 AD 输入是有阻抗要求的 芯片内部有一个采样保持电路类似一个小电容 当你的外部电阻太大那么电流就太小可能来不及把这个内部小电容充满采样窗口就关闭了 导致采样不准确。既然电阻不能无限大那我们还有一种简单的方式把分压电阻的接地端接到单片机的 IO 上休眠时候 把 PA4 设置为高阻态。此时电路断路理论上电流为 0完全不耗电 。测电压时IO 拉低电路导通测完立刻关掉。此方式不用加成本只需要动几行代码。当然如果为了追求极致还有一种通用的做法使用 MOS 管控制通断平时 MOS 管彻底关闭分压电阻和电池物理隔离。此时的休眠电流几乎不计 nA 级别 MOS 管漏电流。这种方式需要多使用 MOS 管增加一定的成本大家根据实际需求选取。上面介绍的方式在所有低功耗设计中通用博主发现最新的 CH587 的 EVT 提供了 ADC 的采样设计推荐原理图右边的图就是我们上文说过的把分压电阻的接地端接到单片机的 IO 上的方式。但是左边用了这么大的电阻不会影响 ADC 的采样精度吗实际情况是上面的大电阻有一个电容这个 C1 电容首先会储存一定的能力使得内部 ADC 的采样电容能更快的充满电同时对 CH58x 系列芯片休眠时候使用 ADC 的情况是建议唤醒以后做一个延时比如 delay 1us 丢弃第一个采样数据都是可以使得 ADC 稳定的手段。 所以使用大电阻的方式在这些条件同时存在的情况下也是可以使用的。2.3 高功耗外围的通断电控制至于外围的传感器、外挂 Flash、放大器、或者有些射频模块即使不工作的时候往往也会有相比较大的电流消耗 。对于外部不需要持续工作的模块可以给它们独立的电源通断按需通电、用完就断。常用手段如下使能脚EN / Shutdown很多 IC 自带关断脚拉低进 shutdown静态降到 nA~µA。用 GPIO 控制即可。比如MOS 开关和上一小节 ADC 采样使用 MOS 管控制通断 电路一致 。比如2.4 其他常见外围的低功耗接法其他常见外围电路的补充说明LEDLED 的高功耗元器件常亮 LED 是 mA 级。建议只在事件时短闪、压低占空比用较大限流电阻或高亮 LED 减小电流非必要不要放状态灯。按键 / 按钮不要使用上拉电阻到常供 VCC 的分压式接法。用 MCU 内部上拉/下拉 掉电唤醒睡眠时引脚被内部电阻拉到确定电平只有按键瞬间才有电流外部上拉若必须保留用大阻值。传感器优先选带低功耗/关断模式的型号使用独立电源供电和芯片通讯有上拉电阻时设计时要考虑到上拉电阻的静态功耗。所有接到常供电 VCC 网络形成回路的电阻都是休眠时的潜在漏电源。能断就断、断不掉就把阻值尽量大、且让引脚停在确定电平。三、软件低功耗设计一个产品要正真实现低功耗是需要硬件软件配合的上面章节我们说明了硬件设计的一些注意事项现在来说说软件的配置。3.1 芯片如何进入低功耗3.1.1 不跑蓝牙低功耗在不跑蓝牙的应用中低功耗的进入方式参照 PM 例程即可。进入 IDLE 模式LowPower_Idle();进入 Halt 模式LowPower_Halt();HSECFG_Current(HSE_RCur_100);// 降为额定电流(低功耗函数中提升了HSE偏置电流)进入 Sleep 模式LowPower_Sleep(RB_PWR_RAM96K|RB_PWR_RAM32K|RB_PWR_EXTEND|RB_XT_PRE_EN);其中LowPower_Sleep函数的参数配置也可跳转查看根据自己需求配置如果自己不确定建议参照示例都保留即可 /******************************************************************************* * Function Name : LowPower_Sleep * Description : 低功耗-Sleep模式注意唤醒后到flash稳定还需要300us * Input : rm: RB_PWR_RAM32K - 32K retention SRAM 供电 RB_PWR_RAM96K - 96K main SRAM 供电 RB_PWR_EXTEND - USB 和 BLE 单元保留区域供电 RB_PWR_XROM - FlashROM 供电 NULL - 以上单元都断电 * Return : None *******************************************************************************/进入 Shutdown 模式LowPower_Shutdown(0);//全部断电唤醒后复位Shutdown 模式 唤醒芯片会复位调用 Shutdown 休眠函数后面的代码不会执行。参数依然是跳转可以查看/********************************************************************* * fn LowPower_Shutdown * * brief 低功耗-Shutdown模式此低功耗切到HSE/5时钟运行唤醒后需要用户自己重新选择系统时钟源 * note 注意调用此函数DCDC功能强制关闭唤醒后可以手动再次打开 * * param rm - 供电模块选择 * RB_PWR_RAM32K - 32K retention SRAM 供电 * RB_PWR_RAM96K - 96K main SRAM 供电 * RB_PWR_EXTEND - USB 和 BLE 单元保留区域供电 * NULL - 以上单元都断电 * * return none */3.1.2 跑蓝牙低功耗跑蓝牙的时候休眠时交给 TMOS 管理的跑蓝牙的时候进入低功耗只需要设置一个宏定义设置方式如下跑蓝牙时候进入的休眠是 SLEEP 模式这个通过我们上面的低功耗测试图片也可以得到验证如果想知道原理可参考博主之前的博文《 沁恒微 蓝牙 TMOS 休眠流程及休眠时外部中断的使用 》3.2 其他配置说明3.2.1 GPIO 配置GPIO 的配置也是影响功耗的一大因素在示例中如果开启了低功耗首先是把所有的 IO 口配置为下拉输入。需要使用什么外设再初始化。在 CH58x 低功耗产品中GPIO 的配置注意事项如下在休眠前所有未使用 / 不用的 IO 必须配置成确定的状态上拉或者下拉。GPIO 休眠配置成上拉还是下拉匹配原则就是 保持和外部电平一致外部悬浮啥都没接→ 上拉或下拉都行外部常态被拉到 VDD → 上拉外部常态被拉到 GND → 下拉对于 IO 初始化成某些功能休眠需要保持的根据实际情况而定。比如驱动 LCD 的时候需要配置为浮空输入参考博文《【沁恒蓝牙开发】LCD低功耗配置》3.2.2 关于主频理论上来说降低主频降低功耗但理论又说主频块运行速度快运行时间短芯片可以更快的睡下去。在 CH58x 蓝牙芯片上亦是如此这个是要根据大家实际需求看笔者并不建议去修改主频BLE 协议栈对主频有最低要求大概在 24Mhz 以上但是并不建议这么低的主频跑如果为了降低功耗需要根据实际测试评估 。主频也不是越低越好同前文所述主频降低会影响任务的执行速度。休眠过程系统会调整主频如果自己不熟悉代码擅自修改最终也不一定是自己想要的值。再次声明真正降低平均功耗最有效的还是增加睡眠占比把广播间隔、连接间隔尽量拉大而不是纠结主频。3.2.3 一些外设说明一般设计来说进入低功耗前把不用的外设模块时钟/电源关掉是个很好的习惯。在 CH58x 芯片上进入休眠的时候会关断外设的电源所以这一步一般不用额外设置但是你如果自己失能一些休眠不需要保持或者运行的外设也是可以的。只要记得唤醒以后使用到需要重新使能一下。至于外设模块使用到的 IO 也可能存在漏电流这个要根据具体情况而定原则上来说就是与上面描述的 GPIO 一致与外部电平保持一致。ADC对于 ADC 模块每次休眠唤醒以后务必重新初始化一次再进行采样。每次采样完成可以把 ADC 引脚配置为输入上拉避免漏电流。看门狗在需要开启看门狗的场合要周期性的喂狗。对于 CH58x/59x 来说休眠时候使用的看门狗一为独立看门狗因为窗口看门狗的时钟来源是主频休眠时候不工作。看门狗计数增加的功耗基本可以忽略它对功耗的消耗在与周期性的喂狗唤醒上 。但是要注意 CH585/4 的独立看门狗开启了无法关闭它的最大溢出最大时间为 65s 左右如果确实需要休眠时间超过 看门狗最大设置时间的应用那确实无法加看门狗功能。同时在使用 shutdown 模式时是不建议使用独立看门狗功能的。调试接口 SWDSWD 休眠后无法使用博主本来就不推荐蓝牙芯片使用 SWD 。四、功耗异常排查步骤最后我们简单总结一下功耗异常排查的流程当我们发现自己的产品功耗异常的时候可以按照如下流程进行测试处理测量最小系统底电流去掉外围电路保持只有最小系统测试底电流参考数据手册进行对比确定是否是芯片最小系统有问题。检查外围电路如果最小系统底电流在芯片手册的标定的合理范围内那么再检查外围电路外围电路可以上文提到的点一一排查确认电路分压/采样电阻网络功耗确认使用传感器功耗是否正常。如果硬件设计有缺陷设可按照上文说明修改硬件。检查软件配置如果硬件确定没有问题再检查自己的软件配置GPIO 配置是否合理等。最小系统本身异常如果最小系统的功耗都是异常的可以检查一下自己的最小系统元器件是否焊接正确包括型号和 PCB 的实际焊接工艺。在确保加工元器件都没有问题的情况下出现的最小系统功耗异常可以与原厂联系可以联系原厂协助检查。附录 电池使用时间计算这个时间计算博主之前也写过文章详细说明如果你有仪器测量的平均功耗那么计算就很简单条件如下电池电量1000mAh测量平均功耗 1 mA.电池大概使用时长时长 1000 / 1 h 1000 h电池电量的理解与不知道平均功耗的情况可参考博主之前的博文《理解 与 计算 物联网产品的电池使用寿命》结语本文主要围绕沁恒微蓝牙芯片的低功耗应用从认识底电流、外围电路、软件配置到排查定位带大家走了一遍完整的低功耗设计思路。希望读完这篇我们不用再凭感觉问 为什么我的功耗这么大 而是能拿着电流表一步步把它查出来、降下去。好了本文就到这里。谢谢大家