Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

4. PWM

PWM(Pulse Width Modulation)は、デジタル信号を用いてアナログ信号のように振る舞わせる技術です。 主にモーター制御やLEDの明るさ調整に使用されます。

TimerにはPWMのための機能が含まれています。 例えば256カウントでループするカウンタを作ったとして、PWM機能を使うとTimerのカウントの度に設定した値と現在の値を比べ、大きければGPIOをHighにできます。 これで、比較する値をデューティー比として使い、PWMのパルス幅を調整できます。

なお、1つのTimerで複数のチャンネルを利用することで、異なるパルス幅のPWM信号を同時に出力できます。

4.1. PWMが使えるピン

PWMはTimerを使うため、Timerのアウトプットチャンネルに対応したGPIOピンで利用できます。

Timerの各チャンネルのマッピングが以下の表のようになっています。 デフォルトの他にAFIOを使って別にピンにマップすることもできますが、Arduinoでは動作を確認できていません。

TIM1のアウトプットチャンネルのマッピング

TIM1マッピング (TIM1RM)CH1CH2CH3CH4
Default (0b00)PD2PA1PC3PC4

TIM2のアウトプットチャンネルのマッピング

TIM2マッピング (TIM2RM)CH1CH2CH3CH4
Default (0b00)PD4PD3PC0PD7

4.2. Arduino

Arduinoでの利用は簡単です。 サンプルコードは以下のリポジトリにあります。

https://github.com/74th/ch32v003-book-code/tree/main/pwm-arduino_core_ch32

まず、利用するピンは前節のマッピングのリストを参照してください。 "0b00 (Default)"にリストアップされたピンを利用するようにしてください。 TIM1、TIM2のどちらでも利用できます。 Remapでも動作できるように実装されてはいるようなのですが、動作を確認できませんでした。

ピンの向きを設定します。

pinMode(PD2, OUTPUT);

次にanalogWrite関数を使ってPWM信号を出力します。 値は12bit、0-4095の範囲で指定します。

32段階で明るさをフェードイン、フェードアウトする例を示します。

void loop() {
  for(int i=1;i<=32;i++){
    analogWrite(PD2, 128*i-1);
    delay(31);
  }

  for(int i=1;i<=32;i++){
    analogWrite(PD2, 128*(33-i)-1);
    delay(31);
  }
}