インターフェース・バス(有線)

PWM

パルス幅でモーター速度やLED輝度を制御。

概要

PWM(Pulse Width Modulation:パルス幅変調)は、デジタル信号のOn(High)とOff(Low)の比率(デューティサイクル)を変えることで、アナログ的な効果を実現する技術です。電圧のOn/Offを高速で繰り返し、そのOn時間の割合でモーターの回転速度やLEDの輝度を連続的に制御します。

たとえばデューティサイクルが50%(周期の半分がHigh)なら実効電圧は電源電圧の50%相当、25%なら25%相当になります。電気エネルギーをスイッチングで制御するため、リニア方式(抵抗による電圧分圧)と比べて電力損失が少なく高効率です。

マイコン(MCU)のタイマーペリフェラルがPWM波形を自動生成するため、CPUを占有することなく正確なPWM出力が得られます。

歴史・背景

PWM技術自体は1960年代のアナログ回路設計から存在していましたが、マイコンや電力用半導体(MOSFETやIGBT)の普及とともに広く使われるようになりました。

1970〜80年代にはモーターコントローラICが登場し、DCモーターのPWM駆動が一般化しました。1990年代以降はRCサーボモーター制御の標準信号としてPWMが採用され(周波数50Hz・デューティ1〜2ms)、ホビーロボット・無線操縦模型に普及しました。

現代のマイコンは複数の高分解能タイマーを内蔵しており、STM32H7では最大216MHzのタイマークロックと最大32ビット精度のPWM出力が可能です。ブラシレスモーター(BLDC)のFOC(磁束指向制御)・サーボアンプ・スイッチング電源のデジタル制御など、高精度PWMの応用が広がっています。

技術仕様

PWMの基本パラメータ

パラメータ説明
周波数(Frequency)1秒間の繰り返し回数(Hz)
周期(Period)1サイクルの時間 = 1/周波数
デューティサイクルHigh時間 / 周期 × 100(%)
分解能(Resolution)デューティサイクルの最小変化量(ビット数)

用途別の典型的な周波数

用途周波数理由
LED調光100Hz〜1kHz人間の目のちらつき閾値以上
DCモーター制御1kHz〜20kHz可聴域以上でノイズ低減
RCサーボ50Hz規格(1〜2ms幅で角度制御)
スイッチング電源50kHz〜数百kHz効率と部品サイズのバランス
超音波モーター20kHz〜100kHz共振周波数に合わせる

分解能

タイマーのカウント幅とクロックでPWM分解能が決まります:

分解能(ビット) = log2(タイマーカウント最大値)
例:16ビットタイマー(65536カウント)→ 16ビット分解能
実際のデューティステップ = 1 / 65536 ≈ 0.0015%

PWM周波数 = タイマークロック / (プリスケーラ × カウント最大値)
例:72MHz / (1 × 7200) = 10kHz、16ビット精度(7200カウント = 13ビット相当)

動作原理

タイマーによるPWM生成

マイコンのタイマーはカウンタが0からオートリロード値(ARR: Auto-Reload Register)までカウントし、コンペアレジスタ(CCR: Capture/Compare Register)の値と一致したときに出力を反転させます:

カウンタ: 0 → ARR → 0 → ARR → ...(繰り返し)
出力HIGH: カウンタ < CCR のとき(PWMモード1の場合)
出力LOW: カウンタ ≥ CCR のとき
デューティサイクル = CCR / ARR × 100%
// STM32 HALを使ったPWM出力設定と制御

// TIM3チャンネル1でPWM出力(HAL初期化後)
// ARR = 999(1000カウント)、PSC = 71(72MHzのとき → 1MHz/1000 = 1kHz)

// PWM開始
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);

// デューティサイクル設定(0〜999: 0〜100%)
void set_duty(uint32_t duty_percent) {
    uint32_t ccr = (htim3.Init.Period + 1) * duty_percent / 100;
    __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, ccr);
}

// LED輝度を0%から100%にフェード
for (int d = 0; d <= 100; d++) {
    set_duty(d);
    HAL_Delay(20);  // 20ms × 100ステップ = 2秒でフェード
}

// RCサーボ制御(50Hz、1〜2msパルス幅)
// ARR = 19999(20ms周期)、PSC = 71(1MHz基準)
void servo_set_angle(float angle_deg) {
    // 0度=1ms(1000カウント)、180度=2ms(2000カウント)
    uint32_t ccr = 1000 + (uint32_t)(angle_deg / 180.0f * 1000);
    __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, ccr);
}

相補PWM(Complementary PWM)とデッドタイム

モーターのHブリッジ回路では、上下アームのMOSFETが同時にONになるアーム貫通を防ぐため、相補出力にデッドタイムを挿入します:

通常PWM:        __|‾‾‾|____|‾‾‾|____
相補PWM:        ‾‾|___|‾‾‾‾|___|‾‾‾‾
デッドタイム挿入後:
上アーム:       __|‾|___|‾|__   (立ち下がりを少し遅らせる)
下アーム:       ‾‾|_|‾‾‾|_|‾‾  (立ち上がりを少し遅らせる)
// STM32 高度制御タイマー(TIM1)での相補PWM + デッドタイム設定
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
sBreakDeadTimeConfig.DeadTime = 50;  // デッドタイム(タイマークロック基準)
HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig);

// CH1とCH1N(相補)の同時出力
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);

ソフトウェアPWM

GPIOをソフトウェアでトグルするソフトウェアPWMは、ハードウェアタイマーが不足した場合の代替手段ですが、精度・CPU効率ともに低くなります:

// ソフトウェアPWM(非推奨・参考用)
void soft_pwm(uint8_t duty_percent, uint32_t period_us) {
    uint32_t on_us  = period_us * duty_percent / 100;
    uint32_t off_us = period_us - on_us;
    HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_SET);
    delay_us(on_us);
    HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_RESET);
    delay_us(off_us);
}

用途・ユースケース

PWMが活躍する組み込み用途:

  • DCモーター速度制御: Hブリッジドライバ(L298N・DRV8833等)とPWMを組み合わせ、電動自動車・産業ロボット・扇風機を制御
  • サーボモーター: RCサーボは50Hz・パルス幅1〜2msで角度を制御。ロボットアーム・ステアリング制御
  • LED輝度調光: スマートライト・バックライト制御・インジケーターLED。高周波PWMでちらつきなし
  • スイッチング電源(SMPS): DC-DCコンバーター(Buck・Boost・Buck-Boost)のデジタル制御でPWMで出力電圧を調節
  • ブラシレスモーター(BLDC/PMSM)制御: 三相PWMとFOC(磁束指向制御)で高効率な電動機制御
  • 音声出力: Class-D アンプはPWMで音声信号をスイッチング。スマートスピーカー等に採用

実装・開発のポイント

モーター制御のノイズ対策

高周波PWMはEMI(電磁ノイズ)を発生させます。対策:

  • ゲート抵抗: MOSFETのゲートに10〜100Ωを挿入してスイッチング速度を緩める
  • スナバ回路: モーターの逆起電力を吸収するフライバックダイオード
  • フィルタリング: 出力にLCフィルタを挿入してリップルを低減
  • Slow/Fast Decayモード: モータードライバICのDecayモード設定でノイズを最適化

アナログ信号への変換(RC積分)

PWM出力をアナログ電圧に変換する簡易方法として、RC積分フィルタが使えます:

PWM出力 ─── R(10kΩ) ─── アナログ出力電圧
                     |
                    C(10μF)
                     |
                    GND

遮断周波数 fc = 1/(2π×R×C) << PWM周波数 にする
例:fc=1.6Hz(10kΩ × 10μF)、PWM=1kHz → 良好な平滑化
ただし出力インピーダンスが高い(バッファアンプが必要)

マルチチャンネル同期PWM

複数チャンネルのPWMを同期させる(位相をそろえる)ことで、3相モーターの制御や複数LEDの同時制御が可能です。STM32では同一タイマーの複数チャンネルが自動的に同期します。

他技術との比較

PWM vs DAC

DAC(デジタル/アナログ変換)は真のアナログ電圧を出力しますが、分解能・速度・コストでPWMと使い分けます:

項目PWMDAC
出力品質フィルタが必要真のアナログ
応答速度高い(スイッチング)
ノイズEMIあり低い
コストほぼ0(タイマー流用)DAC回路が必要
分解能タイマー精度次第8〜16bit

負荷がインダクタンスを持つモーターや、低周波数で十分なLED調光にはPWMが適しています。高精度アナログ電圧が必要なオーディオやセンサーバイアス設定にはDACが向いています。

関連用語

参考リンク