本帖最后由 yongruru 于 2019-6-13 16:37 编辑
学习PIC单片机低功耗之前,先简单过一下低功耗的一些基础知识和思想。 功率(瓦特)= U(伏特)I(安培) 能量(焦耳)= U(伏特)I(安培)t(秒) 电量(库伦)= I(安培)t(秒)
功耗可以分为动态(活动)功耗和静态(睡眠)功耗。 平均功耗=(动态功耗x动态时间+静态功耗x静态时间)/(动态时间+静态时间) 由此得出一些结论,降低平均功耗,可以从下面几个方面入手 降低动态(运行)功耗; 降低动态(运行)时间; 降低静态(休眠)功耗; 增加静态(休眠)时间。
简单了解这么多,在最后还有一些我自己的积累的经验分享。下面先进入正式的PIC单片机低功耗学习。 PIC16F184xx有3种省电模式:打盹,空闲,休眠。功耗:打盹>空闲>休眠。 打盹模式 通过减少CPU操作和存储器访问来节能,外设和系统时钟都保持运行。通过DOZEN=1来进入打盹模式,通过DOZE[2:0]寄存器确定N个周期执行一个指令。
空闲模式 空闲模式和打盹不同之处在于,CPU和存储器均关闭。通过IDLEN=1,再执行SLEEP指令进入空闲模式。此处回顾一下第一篇时钟的内容,当执行SLEEP指令,就不再有系统时钟了,CPU停止工作;而打盹模式没有执行SLEEP指令,所以有系统时钟,CPU可以理解为处于低速模式。
休眠模式 CPU和大部分外设被关闭,是最省电的模式。通过IDLEN=0,然后执行SLEEP指令进入休眠模式。
实战 在MCC中找了找,没有找到低功耗相关的配置选项卡,看来只能在程序中操作。在之前IO的程序中进行,时钟LFINTOSC,512分频,RA2S输出。程序如下。现象为LED闪烁两次,保持熄灭,说明进入睡眠模式。SLEEP();指令也可用asm("sleep");。
接下来测睡眠时的功耗。需要评估板做一些改动,首先割开J100,这是给MCU供电的线路。如图篮筐位置
然后为MCU供电,并将电流表串入电路中。
实际测出,在进入睡眠后功耗为29uA,手册上宣称的可是nA级别的,相差甚远。
首先考虑到IO口上可能产生的电流,有连接的IO有RA0、RA1、RA2、RA3、RA4、RA5、RB4、RB6、RC2,其中RA2接LED已经配置输出高,不会产生电流;RC2连接按键,是断开的也不会产生电流;RA3是重启,有外部上拉10k电阻,在引脚为低时会产生电流,正常情况下没有,即便有也时nA级别的。这3个引脚连接保留,其他的IO连接全部割断,基本上都是和调试器连接的。如下图篮筐线全部割断。
然后测量电流,令人失望的是,并没有变化。接下来考虑可能哪些外设没有关闭。检查MCC配置发现,看门狗WDT没有开,但是欠压复位BOR是开着的,将BOR关闭,测得电流为24uA,下降了一些,BOR确实有一定影响,但还有一定差距,继续排查。
仔细阅读手册,发现这段描述,在PIC16F18446中包含一个LDO,可以让IO使用最高5.5v高电压,内部使用较低电压工作。LDO肯定会有一定的静态电流的。下一段提到将VREGPM置位可以进入低功耗休眠模式。
寄存器的详细描述
程序加入VREGPM=1;之后再执行SLEEP指令。这次测得电流在1uA以下了,影响确实很大。这个结果已经到达nA级,和手册表宣称的在同一单位级了。
因为我的电流表的量程就到1uA,下面换一种方式来测量。如下面原理图
测量结果为3.8mV,检测电阻R1为10kΩ,I=U/R,所以电流为380nA。
在电气特性里,有看到了下面这段,对我们的测试形成了印证,VREGPM=1时进入睡眠典型功耗为0.4uA,上面实测为0.38uA;VREGPM=0时,即内部LDO打开,典型值18ua,上面实测为24uA,略高一些,但在一个数量级,并且温度和VDD电压也会有一定影响,暂不深究了。至此做低功耗应用时,最基础的最小功耗已经得到,后面再根据需求添加自己的功能和逻辑。
已经有一些篇幅了,并且后面还有一定内容,包括空闲和打嗝的实例,最后一些我的经验分享。我考虑在论坛上发帖篇幅还是不要太长,坛友阅读和我撰写的压力都大一些。所以本周先到这里,PIC低功耗的下半部分下周见。O(∩_∩)O
|