基于rt-thread功耗调优与PM管理实战经验分享-驱动篇
调试篇 开始搭环境,动手调起来
驱动篇 想要调功耗,代码也要有
系统篇 如何利用rtos或PM框架,配合PMS线程,管理功耗
实战篇 具体问题的实战思考与解决思路
日志篇 通过console log_file parse_log,搭建功耗日志输出与解析
收尾篇 高调做好功耗,低调掌握知识的回顾。
本篇为驱动篇:若要问我,搞驱动,不就是指导其他人这么搞,那么写,就完事了吗?还要自己码代码不成?
如果公司里,这些底层的干活的就是你自己,你难道说,你不适合这个岗位?
废话不多,先来看看驱动的问题!开关一个LED,都是驱动。驱动就是借助软件,驱使硬件工作。软件,也叫固件,最终转化为机器识别的东西。芯片内部好比是一座城市。
开始与硬件打交道!!
一、开关驱动:
假设有如下的图:
分析如下:
(1)LR1 红色 LED电源 +5V_B直接控制,电源电压在,LED LR1红灯就会亮。开关控制,需要控制+5V_B电源的开关。
(2)LG1 LY1 绿色与黄色LED,使用PNP三极管控制,则可以通过MCU 的GPIO 引脚控制。控制逻辑为:
RXD3 TXD3 为高电平时(3.3V),LED 绿色与黄色不亮(PNP三极管不导通)
RXD3 TXD3 为低电平时(3.3V),LED 绿色与黄色亮起来(PNP三极管导通)
(3)总结,只有导通的回路,才会产生电流。
通过上述的实例,说明:不是电源(电压)存在,就有电流产生,电流产生需要有电流回路,且回路导通。
(4)功耗深入分析1:是不是PNP三级管不导通时,电流就为0?No,需要看手册,或许还有极低(nA级)漏电流!!管子用多了,也会累计电流来。
(5)功耗深入分析2:控制端的电压,若为1.8V,能否控制PNP管子开关?答:根据PNP三极管的特性,低电压,可以让PNP导通。1.8V,PNP管子无法完全关闭,所以,硬件设计时,需要注意MCU供电电压与外设电压的匹配。防止电流往MCU端内灌!!
二、外部上拉电阻:
分析:I2C总线,总线空闲时是否会有漏电流?
(1)I2C总线,一般会把SCL SDA (MCU端),配置成OD(开漏输出)方式。这样,外部必须接上拉电阻,保证电平的切换。
(2)OD输出,I2C默认总线空闲时为高(MCU端高阻态),高电平为外部上拉电阻拉起来的。因为MCU是OD高阻态,所以,I2C总线空闲时,基本上漏电很小(nA级)。
(3)异常分析:如果异常出现,SCL SDA,出现持续的低电平?所以,也可以在不使用总线时,把I2C 总线的两个引脚配置为float 输入或analog 模拟态。
(4)I2C 总线控制完了,I2C外设呢?当然,也不能一直供电,所以硬件设计时,需要有引脚控制 I2C外设的电源,关闭I2C芯片的电源,整个I2C设备,就可以完全管理好功耗了。
(5)总结:SPI UART CAN 等,都是MCU 引脚与 外部器件连接的,控制方式,都可以划分为:电源部分与引脚部分。
三、硬件设计BUG案例分析
什么是经验,经历过,体验过,总结过,如此而已!
(1)上图中,LED的作用,本来是指示继电器的开关的,但是:设计错误,造成LED常亮!!
(2)这样软件控制继电器的开关,并不能控制LED的关闭,造成持续的漏电!!
(1)上图分析:修复了软件不能控制的LED指示灯。只有在继电器开关导通时,LED才会亮。
(2)控制功耗,就可以通过控制继电器的开关(引脚RY1),即可
MCU 端: RY1 高电平,继电器工作
MUC端: RY1低电平,继电器不导通,LED关闭,不会产生漏电?(三极管关闭时,nA级漏电流)
四、GPIO 输入功耗分析:
【ADC 采样】
温湿度、电池电压、甚至某些器件的参考电压、ID,都通过 单片机 AD采样的方式获取。
如下图:
分析:
(1)ADC1 会接到MCU 端的 AD采样,AD采样引脚默认配置为模拟输入(INPUT),漏电很小!!
(2)MCU ADC一般会有内部的时钟与处理模块,当AD不采样后,最好关闭内部的AD控制器。
(3)如图AD采样是电阻分压式,想要彻底的关闭AD,还要控制电源(例图上没有控制,会产生持续的漏电流)。
(4)分析,AD硬件上,需要提供采样电源的控制,保证采样回路可以断开(如果是VBAT常电 ad采样?采样用的分压电阻,可以适当改大!!。)
【按键】
分析
(1)一般按键,直接接到MCU引脚,外部有上拉电阻,MCU内部就不要在配置上下拉(尤其是下拉,会有漏电)
(2)一般按键会配置成中端,注意中端的触发方式(上拉,一般是下降沿触发,上拉,一般是上升沿触发)
(3)想实现按键的按下与弹起,其实外部上拉电阻不需要,MCU内部配置好上拉电阻(最好不要配置内部下拉!)
五、MCU 部分
MCU电源控制,一般分为常电,自杀式断电两种方式。
自杀式断电,硬件需要有关断自己电源的开关。
常电:为了让MCU(满频)降低功耗,一般采用:
(1)降频工作
(2)间歇性工作(运行+睡眠)
分析:
(1)降频工作后,需要考虑其他外设的时钟的变化
(2)运行+睡眠,如何切换模式?需要了解MCU本身的工作模式、电源模式。
(3)睡眠时,不只是要处理MCU,还要看外设的电源状态。
以下为寻找STM32L4 的电源模式:
(1)首先下载STM32L4 系列的参数手册(数据手册datasheet 参考手册 reference )
(2)通过标签,找到:Power Control 章节,理论上,芯片用多了,要多看看官方的手册与文档。
有了这些,大概清楚了模式的切换,模式的进入与退出的条件。
找到芯片官方提供的HAL库(标准库等),看一下各个模式的进入函数,可以开始设计模式切换了。
目前STM32L4系列,
(1)None 不改变模式,满频
(2)LPSleep(LPrun),芯片内部使用LP的调压器(类似芯片内部的LDO,如外部供电1.8V,内核电压1.2V)。
(3)STOP(Stop0/1/2),关闭的不同,建议超低功耗使用STOP2.
(4)Standby(shutdown),几个uA的差别,建议系统需要假关机时实现。特殊的唤醒方式(wakeup引脚,rtc alarm等),唤醒后重启!!
六、其他特殊的外设电源功耗控制
我印象较深的是PSRAM(类似于MCU扩展的外部RAM),作用是扩大RAM用。是一个独立的芯片,如果使用PSRAM时,说明你的运行的程序较复杂,有一些数据、GUI等保存在外部RAM里,内部的RAM不够大。
(1)睡眠时,PSRAM下电,优势是漏电流极低,缺点是:初始化+数据的丢失,恢复起来类似于重启!!
(2)PSRAM不下电,低功耗运行。正常PSARM空闲时,PSRAM本身功耗并不高,几十微安左右。但我实际真正测量下来,发现有上百微安的电流。
(3)原来与MCU 引脚连接,MCU会产生漏电。如MCU配置的内部上下拉电阻等。这部分,还不能完全配置成0或1,需要根据PSRAM手册,保证PSRAM数据正常、下次访问没问题的情况下,配置与PSRAM相关的引脚(细心!!)。
NFC (卡模拟,可以用于门禁、公交等)
项目上,可能需要系统关机(睡眠),都要能刷卡,所以,NFC是常供电。这部分的MCU引脚也要处理,睡眠时,NFC可以产生中断,关机后,就只供电。
调NFC功耗的重点是:让官方提供NFC 超低功耗的固件!!
好了,先总结这些,后面继续补充,包括该格式与错别字!!