LOGO パソコン制御をもっと気軽に  
電子制御をもっと気楽に

低速CPUクロックによる省電力化

Arduino RP2040 2026/01/10

CPUクロックを 2MHz,4MHz,12MHz,40MHz,80MHz,120MHz に設定できます。
PowerSaveHelper.hppに書いてある電流値は Waveshare RP2040Zero でのtypeCの実測値です
download ZIP( 14Kbyte )

Viewer

PowerSaveHelper/Examples/PowerSave01.ino
#include "arduino.h"
#include "PowerSaveHelper.hpp"


void setup() {
  // power save中はUSBが使えなくなるのでSerial2を
  // 経過ログ用に使用します
  Serial2.begin(115200);
  //
  // CPUによりコンパイルをスイッチするのでその確認用
  #ifdef ARDUINO_ARCH_RP2040
    Serial2.printf("CPU is RP2040 group\n");
  #endif
  #ifdef PICO_RP2040
    Serial2.printf("CPU is RP2040\n");
  #endif
  #if defined( PICO_RP2350 )
    Serial2.printf("CPU is RP2350\n");
    Serial2.printf("CPU is %s\n",PICO_RP2350A==1?"RP2350A":"RP2350B");
  #endif
  // CPUクロックを切り替える時にclk_periも操作するので
  // その前にSerial2の送信完了を待つ
  Serial2.flush();
  // XOSCによるCpuSpeed12MHzへの切り替え
  // PLL_sys,PLL_usb停止
  cPowerSave::WithXOSC();
  // delay(xx) , millis() , micros()は正しく動きます
  // XOSCでのボーレート再設定
  Serial2.begin(115200);
  //
  Serial2.println("Setup done");
}

int Cu=1;
u_int32_t PreMSec;
u_int32_t NowMSec;

void loop() {
  Serial2.printf("\nCPU 12MHz Cu=%3d\n",Cu++);
  cShowClkRegs::ShowClockFrequency( &Serial2 );
  // CPU clock change to 40MHz
  cPowerSave::CpuSpeed40MHz() ;
  delay(2000);
  Serial2.printf("\nCPU 40MHz Cu=%3d\n",Cu++);
  cShowClkRegs::ShowClockFrequency( &Serial2 );
  // CPU clock change to 2MHz
  cPowerSave::CpuSpeed2MHz() ;
  PreMSec = millis() & 0x7fffffff ; 
  // wait 2000 mSec
  do {
    NowMSec=millis() & 0x7fffffff ;
  } while( ((NowMSec-PreMSec ) & 0x7fffffff ) < 2000) ;
  Serial2.printf("\nCPU 2MHz Cu=%3d\n",Cu++);
  cShowClkRegs::ShowClockFrequency( &Serial2 );
  // CPU clock change to 12MHz
  cPowerSave::CpuSpeed12MHz() ;
  PreMSec = millis() & 0x7fffffff ; 
  // wait 2000 mSec
  do {
    NowMSec=millis() & 0x7fffffff ;
  } while( ((NowMSec-PreMSec ) & 0x7fffffff ) < 2000) ;

}
CPU is RP2040 group
CPU is RP2040
Setup done

CPU 12MHz Cu=  1
PLL_SYS :     0KHz
PLL_USB :     0KHz
ROSC    :     0KHz
XOSC    : 12000KHz
CLK_REF : 12002KHz
CLK_SYS : 12000KHz  <-- 12MHz
CLK_PERI: 12002KHz
CLK_USB :     0KHz
CLK_ADC :     0KHz
CLK_RTC :     0Hz

CPU 40MHz Cu=  2
PLL_SYS : 40000KHz  <-- PLL_SYSが動作している
PLL_USB :     0KHz
ROSC    :     0KHz
XOSC    : 12000KHz
CLK_REF : 12002KHz
CLK_SYS : 40000KHz  <-- 40MHz
CLK_PERI: 12002KHz
CLK_USB :     0KHz
CLK_ADC :     0KHz
CLK_RTC :     0Hz

CPU 2MHz Cu=  3
PLL_SYS :     0KHz
PLL_USB :     0KHz
ROSC    :     0KHz
XOSC    : 12000KHz
CLK_REF :  4002KHz
CLK_SYS :  2000KHz  <-- 2MHz
CLK_PERI: 12000KHz
CLK_USB :     0KHz
CLK_ADC :     0KHz
CLK_RTC :     0Hz

シーブイデブ e-mail:mnakatani@cvdev-jp.com