马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?请使用中文注册
×
前言在做低功耗蓝牙产品时,如何保证低功耗是每个产品避不开的话题。 理想情况下,一款设计正确的 BLE 产品,在广播间隔、连接间隔合理,外部电路配合得当的前提下,平均电流完全可以做到几十微安甚至更低,一颗纽扣电池撑几个月是正常水平。 但在技术群,社区论坛等地方:很多开发者把产品打样回来,一上电测电流,发现数据远高于预期,然后就问,我功耗怎么这多大? 可当被问及细节,休眠底电流是多少?GPIO 上电默认什么状态,外部元器件的静态功耗? 分压电阻的静态功耗?都不知道,甚至都不确定芯片到底有没有真的进休眠。 底电流就明明白白写在数据手册里。低功耗从来不是靠感觉瞎猜,而是一连串硬件 + 软件细节叠加的结果——任何一个环节漏掉,都会在功耗表上体现出来。 所以本文的目的,是从实际出发,带大家建立做低功耗产品时该有的思路:先知道正常该多低 → 再定位高在哪 → 最后对每个环节进行正确的设置与处理。 相关博文:
沁恒微 RISC-V 蓝牙芯片低功耗测试
BLE 蓝牙连接参数详解
TMOS 自动管理休眠流程说明及外部中断使用
理解 与 计算 物联网产品的电池使用寿命
参考博文:
《CH592/CH585功耗测试》
https://www.cnblogs.com/gscw/p/17479352.htm
《沁恒蓝牙开发】LCD低功耗配置》
https://blog.csdn.net/weixin_45680838/article/details/164057843 [size=1em]我是矜辰所致,全网同名,尽量用心写好每一系列文章,不浮夸,不将就,认真对待学知识的我们,矜辰所致,金石为开!
📑 本文目录
前言
一、🔋 低功耗模式与最小系统休眠电流
├─ 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 一些外设说明
四、🔍 功耗异常排查步骤
附录 电池使用时间计算
结语 一、 低功耗模式与最小系统休眠电流[size=1em]本文以 CH585 为例说明,其他系列芯片思路一致 1.1 认识底电流(最小系统电流)在分析低功耗的时候,要建立一个重要的概念: 芯片底电流: 就是芯片最小系统休眠时的功耗 。 其中最小系统,就是让芯片能正常上电、运行的最简硬件:电源 + 必要的退耦电容、时钟(外部晶振或内部 RC),不带传感器、不带 LED、不带 LDO 等其他外围电路。 为什么要在这个状态下测底电流? 只有把外围全部剥掉,我们测到的电流才纯粹是芯片本身的功耗,没有外设漏电、没有分压电阻、没有 LDO 静态电流的干扰。这个读数,能让我们确定是芯片问题还是外围电路导致功耗异常。 举个例子: [size=1em]我们测试到产品 休眠电流 是 50µA,
芯片休眠电流最大是 10µA(芯片手册)。
而测出来 产品上芯片最小系统是 不超过 10µA ,那多出来的部分就不是芯片的问题,是你板子上的外围电路导致,应该去查外围电路;
如果 产品上芯片最小系统大于 10µA,那么那问题在芯片侧(没真正进休眠、IO 没配对,最小系统硬件出问题等)。
保证芯片最小系统在合理范围,再重新测试整体功耗,再确定外围电路是否有问题。
那芯片的底电流从哪里可以知道,答案就在芯片手册里面。 1.2 从数据手册认识低功耗模式拿 CH585 来说,在芯片手册的电源控制章节,最后有个低功耗模式的表格,介绍了 CH585 的各种低功耗模式和功耗:
CH585低功耗模式这就是芯片最小系统在不同休眠模式下面的底电流(典型值)。 1.3 最小系统实测功耗方法在官方的 EVT 示例里面,给我们提供了可以测试这些低功耗模式的示例:
我们可以根据示例来评估我们自己产品最小系统的低电流是不是合理。 博主之前有一篇使用开发板测试低功耗的文章:《 沁恒微 RISC-V 蓝牙芯片低功耗测试》 里面有详细的测试说明,本文还需要补充的是,测量底电流一定要确保测量的是最小系统: - • 通过原理图 和 PCB 确定自己要测量的点,功耗仪器直接通过芯片电源给芯片供电 ,如果不确定是否有其他影响的元器件,看原理图!看原理图!看原理图! 不要想当然的觉得,其他什么外设都没有了。
- • 如果板子上有 LDO ,建议去掉 LDO ,而不是直接接在 LDO 的输出端,很多情况下也会影响功耗。
- • 串口 DEBUG 不要连接,串口会影响低功耗,即便不开启串口,如果物理上连接了 USB 转串口设备,也可能影响功耗。
- • 板子上的 LED ,测量电源用的 ADC 分压电阻,其他传感器都得去掉或者断开 。
最小系统功耗测量 硬件连接 请严格遵循上面说明,遇到不确定务必要查看原理图确定! 比如测量官方 EVT 开发板,电源入口是 VCC ,而 USB 的 5V 通过一个 LDO 转成 +3V3 ,正常使用情况下,板子上 +3V3 和 VCC 是通过跳线帽短接起来,在我们测试最小系统的时候,直接去掉跳线帽,功耗仪器电源连接 VCC :
[size=1em]万用表只能用来测量静态不变的功耗(大部分万用表 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 经 R1+R2 分压送 ADC,这条路的静态电流 = Vbat / (R1+R2) 一直流,是需要一直消耗的 。打个比方, 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、放大器、或者有些射频模块,即使不工作的时候,往往也会有相比较大的电流消耗 。 对于外部不需要持续工作的模块,可以给它们独立的电源通断,按需通电、用完就断。 常用手段如下: - 1. 使能脚(EN / Shutdown):很多 IC 自带关断脚,拉低进 shutdown,静态降到 nA~µA。用 GPIO 控制即可。
比如:
- 2. MOS 开关:和上一小节 ADC 采样使用 MOS 管控制通断 电路一致 。
比如:
2.4 其他常见外围的低功耗接法其他常见外围电路的补充说明: - • LED:
LED 的高功耗元器件!常亮 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低功耗配置 》: https://blog.csdn.net/weixin_45680838/article/details/164057843
3.2.2 关于主频理论上来说,降低主频降低功耗,但理论又说,主频块,运行速度快,运行时间短,芯片可以更快的睡下去。 在 CH58x 蓝牙芯片上亦是如此,这个是要根据大家实际需求看,笔者并不建议去修改主频: - • BLE 协议栈对主频有最低要求(大概在 24Mhz 以上),但是并不建议这么低的主频跑,如果为了降低功耗,需要根据实际测试评估 。
- • 主频也不是越低越好,同前文所述,主频降低会影响任务的执行速度。
- • 休眠过程系统会调整主频,如果自己不熟悉代码,擅自修改,最终也不一定是自己想要的值。
- • 再次声明真正降低平均功耗最有效的还是增加睡眠占比:把广播间隔、连接间隔尽量拉大,而不是纠结主频。
3.2.3 一些外设说明一般设计来说,进入低功耗前,把不用的外设模块时钟/电源关掉是个很好的习惯。 在 CH58x 芯片上,进入休眠的时候,会关断外设的电源,所以这一步一般不用额外设置,但是你如果自己失能一些休眠不需要保持或者运行的外设,也是可以的。只要记得唤醒以后使用到,需要重新使能一下。 至于外设模块使用到的 IO ,也可能存在漏电流,这个要根据具体情况而定,原则上来说就是与上面描述的 GPIO 一致,与外部电平保持一致。 ADC: 对于 ADC 模块,每次休眠唤醒以后,务必重新初始化一次再进行采样。 看门狗: 在需要开启看门狗的场合,要周期性的喂狗。对于 CH58x/59x 来说,休眠时候使用的看门狗一为独立看门狗,因为窗口看门狗的时钟来源是主频,休眠时候不工作。 看门狗计数增加的功耗基本可以忽略,它对功耗的消耗在与周期性的喂狗唤醒上 。 但是要注意 CH585/4 的独立看门狗开启了无法关闭,它的最大溢出最大时间为 65s 左右,如果确实需要休眠时间超过 看门狗最大设置时间的应用,那确实无法加看门狗功能。 同时在使用 shutdown 模式时是不建议使用独立看门狗功能的。 调试接口 SWD SWD 休眠后无法使用,博主本来就不推荐蓝牙芯片使用 SWD 。 四、功耗异常排查步骤最后,我们简单总结一下功耗异常排查的流程,当我们发现自己的产品功耗异常的时候,可以按照如下流程进行测试处理: - 1. 测量最小系统底电流
去掉外围电路,保持只有最小系统,测试底电流,参考数据手册进行对比,确定是否是芯片最小系统有问题。 - 2. 检查外围电路
如果最小系统底电流在芯片手册的标定的合理范围内,那么再检查外围电路,外围电路可以上文提到的点,一一排查,确认电路分压/采样电阻网络功耗,确认使用传感器功耗是否正常。
如果硬件设计有缺陷设,可按照上文说明修改硬件。 - 3. 检查软件配置
如果硬件确定没有问题,再检查自己的软件配置,GPIO 配置是否合理等。 - 4. 最小系统本身异常
如果最小系统的功耗都是异常的,可以检查一下自己的最小系统元器件是否焊接正确,包括型号和 PCB 的实际焊接工艺。
在确保加工元器件都没有问题的情况下出现的最小系统功耗异常,可以与原厂联系,可以联系原厂协助检查。
附录 电池使用时间计算这个时间计算博主之前也写过文章详细说明,如果你有仪器测量的平均功耗,那么计算就很简单: [size=1em]条件如下:
电池电量:1000mAh
测量平均功耗 : 1 mA
.
电池大概使用时长:
时长 1000 / 1 h = 1000 h
电池电量的理解与不知道平均功耗的情况,可参考博主之前的博文:《理解 与 计算 物联网产品的电池使用寿命》 结语本文主要围绕沁恒微蓝牙芯片的低功耗应用,从认识底电流、外围电路、软件配置到排查定位,带大家走了一遍完整的低功耗设计思路。 希望读完这篇,我们不用再凭感觉问 "为什么我的功耗这么大 ",而是能拿着电流表,一步步把它查出来、降下去。 好了,本文就到这里。谢谢大家! 感谢您的阅读分享与点赞!
|