Demon-xy 发表于 2015-1-20 15:28:28

求助,关于24LE1的低功耗设置和看门狗复位问题

RT!
第一个问题:低功耗模式设置的DeepSleep模式(PWRDWN=0X01),功耗都有200uA,其它低功耗模式比这个模式更高点,硬件除了24LE1的无线模块外,没有其它任何外围电路,相关代码如下,大家帮忙看看,还需要其它什么设置?
以下程序和代码都是执行的:
void RFPowrDown(void)//关闭RF电源
{
        unsigned char ConfigTemp=0;
        ConfigTemp=RFReadOneByte(CONFIG);//读取CONFIG寄存器       
        RFWriteOneByte(CONFIG,ConfigTemp&0XFD);//PWR_UP=0
        RFCON=RFCON&0XFB;//RFCKEN=0,射频16M时钟禁用
        RFDeviceDisable;//RFCE=0,RF收发器禁用
}
void PowrDownModeSetup(unsigned char mode)//低功耗模式设置程序
{
CLKCTRL=0X10;//系统进入深度睡眠模式前,片上16MRC时钟必须开启
OPMCON=OPMCON|0X02;//使能锁存,在进入深度睡眠和存储器保持模式前,必须使能锁存,以保持寄存器设置
PWRDWN=(PWRDWN&0XF8)|mode;//低功耗模式设置
}

第二个问题,将看门狗设置为10S复位,低功耗模式设置为存储器保持定时器打开模式(PWRDWN=0X03),等待10S后,看门狗能够正常复位,但是2.4G的RF无法发送数据,但RF的STATUS寄存器却报的发送完成状态(MASK_TX_DS_FLAG=1),但是接收端实际没有接收到数据,看门狗复位后,程序应该是从头重新跑的吧?整套程序如果没有进低功耗模式,RF每秒发送一次数据,发送和接收都正常的。

大家帮忙看看,谢谢拉!

Demon-xy 发表于 2015-1-20 19:28:29

自己顶下

Demon-xy 发表于 2015-1-21 08:02:18

自己顶下

wk930523 发表于 2015-1-27 20:54:45

楼主你好,不知道楼主的问题解决了没。
我这两天也在调这个芯片,需要低功耗模式设置为存储器保持定时器打开模式,看门狗复位唤醒。实际效果是进入低功耗后就不再唤醒了,不知道是哪里配置的有问题,能不能把配置的低功耗的代码让我参考一下。

wk930523 发表于 2015-1-27 20:59:11

或者能不能帮我看下我的程序哪里有问题。

int main( void )
{
    INT16U itmp;
        INT16U temp;
   
        OPMCON = 0x00;
    CLKCTRL = ( CLKCTRL | 0x80 ) & ~0x08;
        while(!(CLKLFCTRL & 0x08));
        for( itmp = 0; itmp < 30000; itmp ++ );

        UART_Init(3);
    EA = 1;
        UART0_SendStr("reset\r\n");
       
        //其他功能代码
        //......
        //......       
       
        //射频发送
        RFCKEN = 1;                                                 // 启动RF时钟
    EA = 1;
    RFCE = 1;
    L01_Init( );                              //Initialize the internal 24L01P   
    L01_SetTXMode( );               //Set as TX mode
    L01_FlushTX( );
    L01_FlushRX( );
    RFCE = 0;
    RFCE = 1;
    L01_WriteTXPayload_Ack(buf, 5 );
    RFCE = 0;
       
        //等待发送完成
        Delay();
        RFCKEN = 0;
       
        //进入低功耗
        UART0_SendStr("sleep\r\n");
        WDSV = 128;
        CLKLFCTRL = 0x01;
        OPMCON = 0x02;
        PWRDWN = 0x03;
    while( 1 )
    {
                UART0_SendStr("loop\r\n");
    }
}

wk930523 发表于 2015-1-27 21:22:26

关于楼主的问题。
第一个,DeepSleep模式,根据手册上给的参数耗电量是0.5uA,功耗降不下去的原因有可能是。MCU睡眠了,但是管脚没有全部释放,还在给出或者吸入电流,在低功耗状态下可以把不需要工作的外设管脚配置为输入状态。也有可能是片内的一些设备没有关闭,还在耗电。

第二个问题,低功耗配置为存储器保持定时器打开模式(PWRDWN=0X03),唤醒后会导致芯片复位。会不会是RF的STATUS寄存器内的置没有清除掉,保存的是上一次的,读到的发送完成标志也是上一次的。


最后传个关于低功耗配置的文档,在论坛别的帖子里看到的,希望对楼主有帮助。

Demon-xy 发表于 2015-1-28 08:24:46

wk930523 发表于 2015-1-27 21:22
关于楼主的问题。
第一个,DeepSleep模式,根据手册上给的参数耗电量是0.5uA,功耗降不下去的原因有可能是 ...

谢谢你的帮助。
第一个问题:我已经注意到你说的情况,把所用的外设和IO口全部关闭后才进的深度睡眠模式,不用的IO全部初始化为高阻输入,但是影响有限,另外想问个问题,REF24LE1的内部16MRC振荡器是在进入DeepSleep就会被自动关闭吗?外部的16M振荡器是在CLKCTRL=0X10设置后就自动关闭吗?我现在怀疑这两个设置只是在MCU内部进行的时钟源的切换,但并没有将这两个振荡器实际关闭,造成有2、3百uA的功耗,不知这个怀疑是否有可能?
第二个问题:我在进入DeepSleep前将RF的PWR_UP关掉了,这样都不能让STATUS复位吗?另外我现在将复位后后RF发送数据改为连续发送两次,发现两次数据都能正常发送至PRX了,真奇怪啊!

Demon-xy 发表于 2015-1-28 08:28:23

wk930523 发表于 2015-1-27 20:59
或者能不能帮我看下我的程序哪里有问题。

int main( void )


看门狗的设置代码不对,提供我的做参考:
void WatchDogInit(unsigned int TimeOut)//看门狗初始化程序,输入看门狗超时复位时间,单位S,可用于喂狗
{
        //看门狗默认禁止,初始化时写入超时计数即可使能;先写入低字节,紧接着写入高字节,不得间断;喂狗也使用此程序;
        //使能看门狗必须使用32768晶振,超时计算公式:WDSV*256/32768秒;当WDSV写入0X0000时,看门狗超时时间为512S;
        //看门狗仅能通过复位系统或进入Register retention and Memory reterntion节电模式时禁止,参考OPMCON位0;
        WDSV=((TimeOut*128)%256);
        WDSV=(TimeOut/2);
}

另外你的程序注释量太少,将来怎么维护啊?

Demon-xy 发表于 2015-1-28 08:29:30

本帖最后由 Demon-xy 于 2015-1-28 08:55 编辑

注意狗的设置要写WDSV两次,先写入低字节,紧接着写入高字节,不得间断!
估计是因为你只写了一次,看门狗没使能,所以进入睡眠后狗不复位就醒不了了

wk930523 发表于 2015-1-28 10:52:23

Demon-xy 发表于 2015-1-28 08:28
看门狗的设置代码不对,提供我的做参考:
void WatchDogInit(unsigned int TimeOut)//看门狗初始化程序, ...

谢谢帮助,确实是看门狗配置的问题,之前没有注意到需要连续写入两个字节,改后能够正常工作了。

我这个程序功能很简单,另外低功耗这里一直没有好使改来改去的,所以还没写什么注释,现在可以工作了,会写上的。

wk930523 发表于 2015-1-28 11:05:50

Demon-xy 发表于 2015-1-28 08:24
谢谢你的帮助。
第一个问题:我已经注意到你说的情况,把所用的外设和IO口全部关闭后才进的深度睡眠模式 ...

第二个问题,MCU从存储器保持定时器打开的低功耗模式唤醒后,需要一定的时间启动外部16M时钟,是不是你仅仅启用了射频16M时钟(RFCKEN=0),而没有等待外部晶振真正启动,就开始发送数据,导致发送失败。我从这个低功耗模式唤醒之后没有遇到这个问题。
按照手册上描述,可以在唤醒后进入 Standby power-down mode 定时等待外部晶振启动,再进行判断:
        while(!(CLKLFCTRL & 0x08));                //等待外部16M晶振XOSC16M完成启动,大约需要1ms

手册上原话为:



关于第一个功耗的问题,我待会测试一下。

wk930523 发表于 2015-1-28 11:09:20

Demon-xy 发表于 2015-1-28 08:24
谢谢你的帮助。
第一个问题:我已经注意到你说的情况,把所用的外设和IO口全部关闭后才进的深度睡眠模式 ...

另外能否提供下你测功耗的方法我参考下,我是在电源线上串了一个1Ω的采样电阻,用示波器观察电压,不进入低功耗时电压可以采集到,进入低功耗后uA级的电流恐怕是采集不到了。

Demon-xy 发表于 2015-1-28 12:31:36

wk930523 发表于 2015-1-28 11:05
第二个问题,MCU从存储器保持定时器打开的低功耗模式唤醒后,需要一定的时间启动外部16M时钟,是不是你仅 ...

应该不是这个问题,看门狗复位后单片机会重新初始化,我有写等待晶振启动时间,另外我连standby模式都试了,都一个样子,第一次发肯定不行

Demon-xy 发表于 2015-1-28 12:32:57

wk930523 发表于 2015-1-28 11:09
另外能否提供下你测功耗的方法我参考下,我是在电源线上串了一个1Ω的采样电阻,用示波器观察电压,不进 ...

示波器看mV以下级别电压就是渣,还是串个微安表吧,没几个钱,或者原来老式指针万用表的微安档

wk930523 发表于 2015-1-29 18:29:08

本帖最后由 wk930523 于 2015-1-29 19:56 编辑

Demon-xy 发表于 2015-1-28 12:32
示波器看mV以下级别电压就是渣,还是串个微安表吧,没几个钱,或者原来老式指针万用表的微安档 ...

功耗我已经测了,存储器维持定时器开启模式,5uA

Demon-xy 发表于 2015-2-11 14:49:34

wk930523 发表于 2015-1-29 18:29
功耗我已经测了,存储器维持定时器开启模式,5uA

功耗大的问题我查到了,还是我高估了这个单片机,它的IO口的高阻输入模式的阻值太小,手册上没有此参数,但实测掉电时任一IO口对GND电阻为60K,上电时只有16K(我虽然知道这样测不准确,但没别的办法,仅作参考),外部器件有一DS18B20的上拉电阻,串口RXD也有一上拉电阻,在睡眠时都设置为高阻输入,电流从这两个口漏掉了,改为睡眠前设为输出高电平,功耗就降下来了,测了只有3uA;另外在测功耗时,应该用电池,而不是开关电源,开关电源的纹波在滤波电容上过的电流也够吓人的。
狗复位后第一次RF发数据接收不到的问题还没找到......

wk930523 发表于 2015-2-25 15:58:24

Demon-xy 发表于 2015-2-11 14:49
功耗大的问题我查到了,还是我高估了这个单片机,它的IO口的高阻输入模式的阻值太小,手册上没有此参数, ...

我也是用24LE1+18B20做温度采集的,请问你的电源方案是什么?我计划是用3个纽扣电池供电的,AG13,每个1.5V。用程控电源4.5V调试完成后,用三节5号干电池串联供电可以工作,换成三个纽扣电池(4.7V)就不工作了,不知道这是什么原因。是纽扣电池电流太小了吗?

wk930523 发表于 2015-2-26 11:47:22

wk930523 发表于 2015-2-25 15:58
我也是用24LE1+18B20做温度采集的,请问你的电源方案是什么?我计划是用3个纽扣电池供电的,AG13,每个1. ...

已经解决了,发射的一瞬间需要电流比较大,电源上并个大些的电容就行了

wk930523 发表于 2015-11-19 20:33:20

楼主最后怎么解决的。。。。。狗复位后第一次RF发数据接收不到的问题。。。。。。。。
页: [1]
查看完整版本: 求助,关于24LE1的低功耗设置和看门狗复位问题