Cortex-M/EFM322013. 4. 30. 20:00

EFM32 성능테스트 - 클럭 설정 및 소비 전류 테스트

EFM32 성능테스트 - 클럭 설정 및 소비 전류 테스트

 

EFM32 는 Cortex-M3코어의 저전력 기능이 강화된 MCU이다. 저전력을 위해 여러가지 기능들이 많이 있다.

저전력 기능중 가장 큰 부분인 클럭 부분을 살펴 보면 칩내부에 있는 HFRCO, LFRCO 와, 칩외부에서 공급할수 있는 HFXO, LFXO로 나누어 진다.
초기에 리셋되면 디폴트로 내부 28Mhz를 2분주한 14Mhz로 구동이 된다.

 

HFRCO : 1-28 Mhz High Frequency RC Oscillator

LFRCO: 32.768 kHz Low Frequency RC Oscillator


HFXO: 4-32 Mhz High Frequency Crystal Oscillator

LFXO: 32.768 kHz Low Frequency Crystal Oscillator

 

 

 EFM32 클럭 구조

 

 

EFM32 클럭 블록도



 

클럭 설정은 CMU_HFRCOBandSet() 함수를 이용하여 설정 가능하고 1Mhz ~ 28Mhz 로 설정할 수 있다.

typedef enum
{
  /** 1MHz RC band. */
  cmuHFRCOBand_1MHz  = _CMU_HFRCOCTRL_BAND_1MHZ,
  /** 7MHz RC band. */
  cmuHFRCOBand_7MHz  = _CMU_HFRCOCTRL_BAND_7MHZ,
  /** 11MHz RC band. */
  cmuHFRCOBand_11MHz = _CMU_HFRCOCTRL_BAND_11MHZ,
  /** 14MHz RC band. */
  cmuHFRCOBand_14MHz = _CMU_HFRCOCTRL_BAND_14MHZ,
  /** 21MHz RC band. */
  cmuHFRCOBand_21MHz = _CMU_HFRCOCTRL_BAND_21MHZ,
  /** 28MHz RC band. */
  cmuHFRCOBand_28MHz = _CMU_HFRCOCTRL_BAND_28MHZ
} CMU_HFRCOBand_TypeDef;

 

 

CMU_ClockDivSet() 함수로 클럭 분주를 아주 세밀하고 자유롭게 설정할 수 있다.

typedef enum
{
  cmuClkDiv_1     = 0,  /**< Divide clock by 1. */
  cmuClkDiv_2     = 1,  /**< Divide clock by 2. */
  cmuClkDiv_4     = 2,  /**< Divide clock by 4. */
  cmuClkDiv_8     = 3,  /**< Divide clock by 8. */
  cmuClkDiv_16    = 4,  /**< Divide clock by 16. */
  cmuClkDiv_32    = 5,  /**< Divide clock by 32. */
  cmuClkDiv_64    = 6,  /**< Divide clock by 64. */
  cmuClkDiv_128   = 7,  /**< Divide clock by 128. */
  cmuClkDiv_256   = 8,  /**< Divide clock by 256. */
  cmuClkDiv_512   = 9,  /**< Divide clock by 512. */
  cmuClkDiv_1024  = 10, /**< Divide clock by 1024. */
  cmuClkDiv_2048  = 11, /**< Divide clock by 2048. */
  cmuClkDiv_4096  = 12, /**< Divide clock by 4096. */
  cmuClkDiv_8192  = 13, /**< Divide clock by 8192. */
  cmuClkDiv_16384 = 14, /**< Divide clock by 16384. */
  cmuClkDiv_32768 = 15  /**< Divide clock by 32768. */
} CMU_ClkDiv_TypeDef;

 

 

 

 

프로젝트 별로 구동 속도를 쉽게 변경할 수 있도록 config.h 에 정의해 두었다.

// Prescale the HFPERCLK -> HF/4 = 28/1 = 28Mhz
#define _SET_MCU_CLK_()                    CMU_HFRCOBandSet(cmuHFRCOBand_28MHz);\
                                                                   CMU_ClockDivSet(cmuClock_HFPER, cmuClkDiv_1)


 

 


우선 아무 설정 없이 기본 동작 시킨후 GPIO 토글 속도를 측정해 보았다.

14Mhz 구동에서  1.17Mhz 로 측정된다.

 

 

최고 속도인 28Mhz로 구동시 테스트

28Mhz -> 2.35Mhz

 

GPIO토글이 아닌 On/Off 만 했을때 3Mhz 정도 나온다.

이때 소비 전류는 7mA 이다.

 

속도 면으로 보면 동급 클럭의 MCU에 비해 그렇게 빠르지는 않은데 소비 전류는 확실히 적은것 같다.

[참고] MCU속도 측정 결과 

 

클럭을 더 낮추어 1Mhz로 구동시 소비 전류 특정 결과

500uA

 


 

 

 


 

Posted by nexp

댓글을 달아 주세요

[AVR]/AVR_EVM2011. 9. 28. 12:26

AVR 파워다운 모드 전류측정 실험

AVR 파워다운 모드 전류측정 실험

AVR은 저전류 전용 칩이 아니기 때문에 고려 해본적이 없었는데 전류소모를 적게 해야 할 일이 있어 AVR소비 전류를 줄이는 방법에 대해 검토 해 보았다. MSP430에 비하면 비할 바가 못되지만 아무튼 5단계의 슬립모드 설정이 가능하고 실험 결과 나쁘지 않게 사용가능할것 같다.


AVR전류 측정

전원 공급후 while루프 돌때 - 12mA
USB기능 동작시 - 25mA

아무런 동작을 하지 않아도 12mA가 흐러고 타이머나 기타 페리를 사용하는 순간 25mA까지 소비 한다.

이 상태로는 좀 문제가 있는것 같고 슬립모드 관련 데이터 시트를 보니 몇가지 방법이 있는것 같다. 테스트에 사용한 칩은 ATmega88V이다. 예전 버전 ATmega8을 가지고 테스트 하다 고생 했는데.. 결국 새로운 칩은 슬립 모드 관련 상당히 개선된 점이 많았다.


AVR에는 5단계의 슬립모드가 있다.



IDLE Mode
표에서 처럼 CPU클럭만 멈추고 다른 페리들은 살아 있어서 외부 페리의 이벤트에 따라 께어날 수 있다. 하지만 소비 전류는 크게 줄어들지 않는다.

WINAVR에서 제공하는 코드로 아래와 같이 하면 슬리모드로 진입할 수 있다.
  set_sleep_mode(SLEEP_MODE_IDLE);
  sleep_mode();

실험 결과 슬립모드로 들어 들어 갔을때 9mA 정도 소비 한다. 일반 동작시보다는 3mA정도 줄어 든것 같다


ADC Noise Reduction Mode
IDLE모드 보다는 조금더 페리를 정지 시켜서 전류 소모를 줄이는데... ADC노이즈를 줄이는데 효과가 있다고 하니 사용해볼 만하다.


Power-save Mode
슬립모드에서도 타이머를 사용할 수 있기 때문에 일정시간 이후 슬립모드에서 깨어날 수 있도록 할 수 있다. 
아래 코드로 진입 가능하며 하다.
  set_sleep_mode(SLEEP_MODE_PWR_SAVE);
  sleep_mode();

타이머 인터럽트로 일정 시간 이후 깨어날 수 있으므로 일정시간 간격으로 데이터 센싱하는 용도로 사용하면 파워를 많이 줄일 수 있다.
실험 결과 파워세이브 모드에서 1mA 정도의 소비 전류가 있다.


Power-down Mode
표와같이 모든 페리를 끄고 외부 인터럽트만 동작하는 모드로 가장 전류 소모를 줄일 수 있다. 하지만 께어날 수 있는 방법이 스위치 등을 달아서 에서 인터럽트 발생하는 방법 밖에 없으로 일정시간 후 스스로 께어나기는 힘들다.
아래 코드로 설정 가능하다.
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_mode();

실험 결과 파워다운 모드에서 0.6uA 정도의 전류 소모로 동작이 가능하다.




파워다운 모드가 좋은데 아쉬운 점은 스스로 께어나지 못한다는 점이다. 그렇다고 파워 세이브 모드로 해서 타이머를 켜두면 1mA의 전류가 흐르기 때문에 문제이다.
메뉴얼을 보니 와치독 타이머 인터럽트로 CPU를 깨울 수 있다고 한다.
와치독타이머로 일정 시간후 스스로 께어나게 코드 수정 후 테스트 결과 6uA정도 소모 한다. 께어나는 동안 페리가 동작하므로 잠깐 13uA까지 모소 하지만 파워 세이브 모드와 유사하게 동작하지만 전류는 상당히 줄일 수 있었다.




참고로 ATMega8 (예전 버전)에는 슬립모드 관련 기능이 많이 빈약하다.


Posted by nexp

댓글을 달아 주세요

[MSP430]/MSP430_EVM2010. 6. 1. 22:00

MSP430 소비전류 측정 실험

MSP430 소비전류 측정 실험

MSP430F2013 기준으로 소비전류를 측정해 보았다.

 

우선 MSP430 데이터시트를 보면 아래와 같이 나타나 있다.

Low Supply Voltage Range 1.8 V to 3.6 V

Ultra-Low Power Consumption Programming Voltage Needed, Programmable
- Active Mode: 220uA at 1 MHz, 2.2V
- Standby Mode: 0.5uA
- Off Mode (RAM Retention): 0.1uA

 

우선 가장 기본 코드로 루프를 돌면서 3초에 한번씩 LED를 순간적으로 On/Off하는 코드를 돌려보았다.

기본코드는 1Mhz에서 동작한다.

측정 결과 340uA정도로 측정된다. 3.3V이므로 데이터시트와 크게 차이는 없는것 같다.

1Mhz에서 아무생각없이 동작시켜도 이정도라면 나쁘지 않은것 같다.

 

 WDTCTL = WDTPW + WDTHOLD;            // Stop watchdog
 
 Led1Init();
 Led1On();

 
 while(1)
 {
        Led1Off();
        Delay(10);
        Led1On();
       Delay(3000);
 }

 

 


16Mhz로 구동해 보니 2.7mA가 출력된다. 속도가 16배 빨라져서 그런가?

조금은 이상한데..

 


MSP430은 5단계의 저전력 모드가 있는데 그중에 LPM3 모드로 테스트 해 보았다.

평소 슬립모드에 있다가 와치독 타이머를 이용해 2~3초에 한번씩 깨어나 수행하는 코드이다.

MSP430 LPM3 모드에서 테스트 결과 0.4uA가 측정된다.

 

void main(void)
{
  BCSCTL1 |= DIVA_1;                        // ACLK/2
  BCSCTL3 |= LFXT1S_2;                      // ACLK = VLO
  WDTCTL = WDT_ADLY_1000;                   // Interval timer
  IE1 |= WDTIE;                             // Enable WDT interrupt
  P1DIR = 0xFF;                             // All P1.x outputs
  P1OUT = 0;                                // All P1.x reset
  P2DIR = 0xFF;                             // All P2.x outputs
  P2OUT = 0;                                // All P2.x reset

  while(1)
  {
    int i;
    Led1Off();
    Delay(10);
    Led1On();
    _BIS_SR(LPM3_bits + GIE);               // Enter LPM3
  }
}

 

#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer (void)
{
    _BIC_SR_IRQ(LPM3_bits);                 // Clear LPM3 bits from 0(SR)
}

 

 

MCU회사마다 저전력 측정 기준이 달라서 명확한 기준은 정하기 힘든것 같지만 어플리케이션에 따라 적절히 잘 선택해야 하지 않을까...

Posted by nexp

댓글을 달아 주세요