2017-09-27 08:51:12 whble 阅读数 461
关于TI的CC254x的芯片,近来做低功耗,一直降不下去,于是做了下裸机的测试
在GPIO不同状态下,得到的芯片工作电流还是有很大区别,可以借鉴!

//裸机低功耗测试
//whble 
//2017年9月21日18:02:46

#include <ioCC2540.h>

#define BV(n)      (1 << (n))

//GPIO输入配置
void GPIO_IN()
{
  P0SEL=0x00; 
  P1SEL=0x00; 
  P2SEL=0x00;

  P0DIR=0x00; 
  P1DIR=0x00; 
  P2DIR=0x00;
}
//POWER工作模式
void PowerMode(unsigned char mode)
{
  if(mode<4)
  {
    SLEEPCMD|=mode;
    PCON=0X01;
  }
  else PCON=0X00;
}
//IO上拉
void GPIO_UP()
{
  P0INP=0x00; 
  P1INP=0x00; 
  P2INP=0x00;
}
//IO下拉
void GPIO_DOWN()
{
  P0INP=0x00; 
  P1INP=0x00; 
  P2INP=0x00;
  
  P2INP |=BV(5); 
  P2INP |=BV(6); 
  P2INP |=BV(7);
}
//IO高阻
void GPIO_HI()
{
  P0DIR = 0x00; 
  P1DIR = 0x00; 
  P2DIR = 0x00;

  P0INP = 0xFF; 
  P1INP = 0xFC;
}


/*** UP ***/
void UP_PM1()  //244uA
{
  GPIO_IN();
  
  GPIO_UP();

  PowerMode(1);
}

void UP_PM2()  //0.97uA
{
  GPIO_IN();
  
  GPIO_UP();

  PowerMode(2);
}

void UP_PM3()  //0.39uA
{
  GPIO_IN();
  
  GPIO_UP();

  PowerMode(3);
}

/*** DOWN ***/
void DOWN_PM1()  //236uA
{
  GPIO_IN();
  
  GPIO_DOWN();

  PowerMode(1);
}

void DOWN_PM2()  //0.97uA
{
  GPIO_IN();
  
  GPIO_DOWN();

  PowerMode(2);
}

void DOWN_PM3()  //0.39uA
{
  GPIO_IN();
  
  GPIO_DOWN();

  PowerMode(3);
}


/*** HI ***/
void HI_PM1()  //539uA
{
  GPIO_IN();
  
  GPIO_HI();

  PowerMode(1);
}

void HI_PM2()  //311uA
{
  GPIO_IN();
  
  GPIO_HI();

  PowerMode(2);
}

void HI_PM3()  //307uA
{
  GPIO_IN();
  
  GPIO_HI();

  PowerMode(3);
}


void main(void)
{   
  HI_PM3();
  while(1);
}


  /*              ·实验结果(uA)*
  =======================================
        |   PM1   |    PM2   |    PM3   |
  ---------------------------------------
  UP    |   244   |    0.97  |    0.39  |
  ---------------------------------------
  DOWN  |   236   |    0.97  |    0.39  |
  ---------------------------------------
  HI    |   539   |    311   |    307   |
  =======================================

  数据手册
  LowPowerState        Typical value
  PM1                270μA
  PM2                1μA
  PM3                0.5μA

  注释:万用表测试结果

  结论:在配置使用低功耗模式时,需要注意芯片的各个IO
        的状态,以免造成功耗的增加
  */





2018-05-11 13:43:42 xulikai 阅读数 2192

 

测试名称:SI4463透传模块休眠功耗测试

测试说明:测试RF63U透传模块的低功耗性能,RF63U使用STC单片机管理SI4463芯片,提供UART与射频的透明传输功能。

测试方案:将电流表串入模块电源线,UART接口与计算机连接,通过计算机发送休眠指令使模块进入休眠状态,观察电流表实时电流数据变化。

测试工具:

电流表                    供电电源                           USB转UART(3.3V)

 

测试步骤

(1)RF63U工作电压范围为2.0~3.6V,故在锂电池上串了两个1N4148二极管;

(2)将电流表串入电源线并切换至uA档;

(3)将模块UART接口与计算机的UART接口连接好;

(4)打开串口调试助手,发送区选择16进制;

(5)给模块上电,此时显示为1024uA,因工作于接收模式时,功耗是10mA左右,超出量程所至。

(6)通过串口调试助手发送休眠指令(16进制)AA BB 01 A0 00 13 19;

(7)电流表显示为0.00uA,似乎哪里不对。因UART接口与计算机连接,计算机的接口的管脚电平信号馈电足够维持模块工作于休眠模式下,因此我们连接的电池电流消耗此时为0;

(8)断开UART接口与计算机的连接线,仅留下电池、电流表、透传模块组成的最小测试系统,电流表从0.00uA逐渐变大,最后稳定于0.12~0.13uA左右。

 

关于断开UART接口后电流表逐渐变大的原因分析:当UART接口与模块连接时,模块休眠时所需要电量使用UART接口的馈电已经足够,电池电量消耗为0,故此电流表显示为0.00,当断开UART接口后,因模块上电容中存储有电能,模块开始消耗电容电量,随着电容电量的消耗,不足的电量则通过电池补充,故此电流表由0.00uA~0.12uA是个逐渐变化、最后趋于稳定的过程。

 

关于电流大小分析:RF63U透传模块主要使用了单片机和SI4463芯片和一些辅助电路,进入休眠模式的本质是单片机控制SI4463进入休眠,然后单片机本身也进入休眠状态。单片机进入休眠状态时官方给出的电流消耗是0.1uA(100nA),SI4463给出的电流消耗是30nA,故此上面的测试结果0.12~0.13uA(即:120nA~130nA)完全符合我们的设计目的。


 

 

 

正常工作模式                             休眠工作模式(UART与计算机连接)

 

休眠工作模式,断开UART连接,电流逐渐上升,稳定于0.12uA

 

2009-09-10 21:54:00 wind_wolf00 阅读数 662

基于C8051F320单片机的超低功耗微型温度记录仪的研制

 

  本文介绍了一种低成本、超低功耗微型温度记录仪.首先,叙述了设备的硬件结构方面设计,主要包括热敏电阻测温电路、实时时钟电路、系统低功耗设计和单片机软件设计等.然后,介绍了上位机软件设计以及上位机与温度记录仪之间的通信协议设计.最后,对设备进行了实验测试,证明本设计的可靠性和实用性.

作 者: 吴太虎郑捷文赵鹏张广WU Tai-huZHENG Jie-wenZHAO PengZHANG Guang 
作者单位: 军事医学科学院卫生装备研究所,天津,300161 
 
刊 名: 中国医疗器械信息 
英文刊名: CHINA MEDICAL DEVICES INFORMATION 
年,卷(期): 2009 15(6) 
分类号: TH772 
关键词: 温度   热敏电阻   超低功耗   USB  
机标分类号: TP2 TH8 
机标关键词: 单片机超低功耗温度记录仪研制MCUBased软件设计可靠性和实用性通信协议设计实时时钟电路上位机低功耗设计硬件结构实验测试设备热敏电阻测温电路低成本证明叙述 
基金项目:
 
DOI:
 
2018-04-12 20:55:07 qq_35813104 阅读数 113

STM32低功耗测试:

测试版卡:STM32F412

测试使用主要程序为STM32CubeMX示例程序PWR_CurrentConsumption

可以看到在主程序中,单片机的默认状态为RUN模式LED1定时闪烁

只有在按下USER键才会进入模式

模式选择程序如下:

#if defined (SLEEP_MODE)

  /* 睡眠模式输入

       - PLL100MHz)运行的系统

       - Flash 5等待状态

       - 指令和数据缓存

       - 预取开

       - 从内部FLASH运行的代码

       - 禁用所有外设。

       - 使用EXTI Line唤醒(用户按钮)

   */

  SleepMode_Measure();

#elif defined (STOP_MODE)         //唯一有效

  /* 停止模式输入

       - RTCLSI计时

       - LP模式下的稳压器

       - HSIHSE OFFLSI OFF(不用作RTC时钟源)

       - IWDG

       - 深度掉电模式下的闪存

       - 使用由时钟控制的RTC自动唤醒(〜20s后)

 

   */

    StopMode_Measure();

#elif defined (STANDBY_MODE)

  /* 待机模式输入

       - 备份SRAMRTC OFF

       - IWDGLSI OFF

       - 唤醒使用唤醒针(PA.00

   */

  StandbyMode_Measure();

 

#elif defined (STANDBY_RTC_MODE)

  /* LSI条目上使用RTCSTANDBY模式

       - RTCLSI计时

       - 如果不用作RTC时钟源,则IWDG OFFLSI OFF

       - 备用SRAM关闭

       - 使用由时钟控制的RTC自动唤醒(〜20s后)

   */

  StandbyRTCMode_Measure();

 

#elif defined (STANDBY_RTC_BKPSRAM_MODE)

  /* LSI条目上使用RTCSTANDBY模式

       - RTCLSI计时

       - 备份SRAM ON

       - 关闭IWDG

       - 使用由时钟控制的RTC自动唤醒(〜20s后)

  */

  StandbyRTCBKPSRAMMode_Measure();

#endif

 

此示例程序的默认模式为STOP模式;在测试过程中模式的选择在stm32f4xx_lp_modes.h文件里。如下是模式配置程序

#if !defined (SLEEP_MODE) && !defined (STOP_MODE) && !defined (STANDBY_MODE)\

 && !defined (STANDBY_RTC_MODE) && !defined (STANDBY_RTC_BKPSRAM_MODE)

/* Uncomment the corresponding line to select the STM32F4xx Low Power mode */

// #define SLEEP_MODE

#define STOP_MODE

//#define STANDBY_MODE

//#define STANDBY_RTC_MODE

//#define STANDBY_RTC_BKPSRAM_MODE

#endif

 

找到程序的实现以及程序模式的配置后就可以进行各种模式情况下板卡的电流数据:

数据如下:

 

正常运行模式下仅有:

正常运行模式下数字时钟加LED

 

正常运行模式下数字时钟加LED加按键:

 

Sleep mod +RTC

 

 

Sleep mod +RTC+LED:  进入模式LED灯熄灭

 

Sleep mod +RTC+LED+按键:按键处于浮置状态

 

Sleep mod +RTC+LED+按键:按键处于按下状态

 

Standby 模式+RTC

 

Standby 模式+RTC+LEDLED关闭

 

Standby 模式+RTC+LED+按键:按键浮置

 

Standby 模式+RTC+LED+按键:按键按下

 

Standby_RTC模式+RTC

 

Standby_RTC模式+RTC+LEDLED关闭

 

Standby_RTC模式+RTC+LED+按键:按键浮置

 

 

Standby_RTC模式+RTC+LED+按键:按键按下

 

Standby-RTC-BKPSRAM模式+RTC

 

Standby-RTC-BKPSRAM模式+RTC+LED:   LED关闭

 

Standby-RTC-BKPSRAM模式+RTC+LED+按键:按键浮置

 

Standby-RTC-BKPSRAM模式+RTC+LED+按键:按键按下

 

 

STOP模式+RTC

 

STOP模式+RTC+LEDLED关闭

 

 

STOP模式+RTC+LED+按键:按键浮置

 

 

STOP模式+RTC+LED+按键:按键按下

 

 

 

统计表格:

模式

RTC

RTC+LED

RTC+LED+KEY

(浮置)

RTC+LED+KEY

(按下)

LED状态

RUN

12.4451MA

24.5913MA

25.0865MA

 

SLEEP

4.43684MA

12.3508MA

3.93217MA

3.94807MA

STANDBY

2.2530uA

2.2443uA

2.2771uA

17.2777uA

STANDBY+RTC

3.3250uA

3.3128uA

3.3420uA

18.3548uA

STANDBY-RTC-BKPSRAM

3.9633uA

3.9513uA

3.9869uA

18.9878uA

STOP

17.6921uA

18.9280uA

19.1208uA

34.0783uA

 

2019-09-02 11:44:12 qq_20222919 阅读数 73

stm32单片机低功耗模式共有3种,下来对3种低功耗进行分析测试。
先看手册上相关低功耗资料介绍:
在这里插入图片描述
先来分析睡眠模式:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
进入睡眠模式比较简单,只需一条指令即可。唤醒睡眠模式,我们使用串口中断来唤醒,通过对串口发送数据。利用串口RXD引脚来唤醒睡眠模式,代码如下:

//进入睡眠模式 任意中断唤醒  WKUP不能唤醒
void sleep_mode_wfi(void)
{
    __WFI();													//WFI指令进入睡眠
}
//进入睡眠模式 唤醒事件唤醒  WKUP 不能唤醒
void sleep_mode_wfe(void)
{
    __WFE();
}

通过调用这两个函数就可以直接进入睡眠模式,给串口发送数据可以退出睡眠模式。睡眠模式退出后,程序会从进入睡眠模式的下一行代码继续执行。相当于程序被暂停了。
下来看停止模式:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
停止模式通过调用库函数PWR_EnterSTOPMode(),可进入停止模式,停止模式唤醒需要用外部中断,将串口的RXT引脚设置为外部中断,上升沿触发,这样当串口接收到数据时,就会触发RXD引脚的外部中断。这样可通过串口直接唤醒停止模式。相关代码如下:

void EXIT_UART_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource10);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    EXTI_InitStructure.EXTI_Line = EXTI_Line10;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

}
void EXTI15_10_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line10) != RESET)
    {
        EXTI_ClearITPendingBit(EXTI_Line10);
        __set_FAULTMASK(1);	 //关闭所有中断
        NVIC_SystemReset();  //系统复位
    }

}

//进入停止模式   任意外部中断唤醒  WKUP不能唤醒
void enter_stop_mode(void)
{
    EXIT_UART_Init();											//RX引脚配置为外部中断
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); 		//开电源管理时钟

    PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI);		//进入停机模式
}

进入停止模式后,所有IO口保持为当前状态。当退出停止模式后,HSI RC振荡器会被选为系统时钟,而开发版用的是外部时钟,需要重新设置系统时钟。为了避免重新设置时钟的麻烦,在中断程序中,直接执行系统软件复位命令。直接对系统重新进行复位。如果在实际项目中需要外部IO口状态保持不变,就不能用系统复位命令,需要自己重新配置系统时钟和其他外设的时钟。

下来看待机模式:
在这里插入图片描述
在这里插入图片描述
进入待机模式后系统功耗最低,外部IO口都会处于高阻状态。退出待机模式后,系统会重新初始化,相当于按下了复位按键。相关代码如下:

void Sys_Standby(void)
{
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); 		//使能PWR外设时钟
    PWR_WakeUpPinCmd(ENABLE); 								 	//使能唤醒管脚功能  WKUP
    PWR_EnterSTANDBYMode();   									//进入待机(standby)模式
}

//系统进入待机模式   WKUP引脚上升沿、RTC脑子、NRST复位、IWDG复位 唤醒  中断不能唤醒
void Sys_Enter_Standby(void)
{
    RCC_APB2PeriphResetCmd(0X01FC, DISABLE); 					//复位所有IO口,屏蔽这条语句也没有看到什么影响
    Sys_Standby();
}

为了方便测试,用了WKUP唤醒。进入低功耗模式后,按下WKUP按键,系统会被唤醒,唤醒后系统复位,程序重新开始执行。
主函数测试代码如下:

int main(void)
{
    u8 i = 0, j = 0;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    delay_init();       										//延时函数初始化
    LED_Init();         										//初始化与LED连接的硬件接口
    KEY_Init();
    uart_init(9600);

    LED = 1;
    delay_ms(500);
    printf("low power test! \r\n\r\n");
    while(1)
    {
        i =  KEY_Scan(1);

        switch(i)
        {
        case 0:
            break;
        case 1:
            printf("进入停机模式\r\n\r\n");
            enter_stop_mode();									//唤醒后从程序开始位置执行
            printf("退出停机模式\r\n\r\n");              		//执行不到这块
            break;
        case 2:
            printf("进入待机模式\r\n\r\n");				
            Sys_Enter_Standby();						 		//唤醒后从程序开始位置执行
            printf("退出待机模式\r\n\r\n");				 		//执行不到这块
            break;
        case 3:
            printf("进入睡眠模式 中断唤醒 \r\n\r\n");
            sleep_mode_wfi();									//唤醒后接着下一条语句执行
            printf("退出睡眠模式 中断唤醒 \r\n\r\n");     		//唤醒后执行当前语句
            break;
        case 4:
            printf("进入睡眠模式 事件唤醒 \r\n\r\n");
            sleep_mode_wfe();									//唤醒后接着下一条语句执行
            printf("退出睡眠模式 事件唤醒 \r\n\r\n");				//唤醒后执行当前语句
            break;
        }

        j++;
        if(j > 5)
        {
            j = 0;
            LED = !LED;
        }

        delay_ms(10);

    }
}

通过LED闪烁指示程序执行状态,进入低功耗模式后,LED灯停止闪烁。退出低功耗模式后,LED灯继续闪烁,用串口输出相关信息,便于观察。

STM32F412低功耗测试

阅读数 2101

PIC单片机功耗问题

阅读数 589

没有更多推荐了,返回首页