概要
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と使い分けます:
| 項目 | PWM | DAC |
|---|---|---|
| 出力品質 | フィルタが必要 | 真のアナログ |
| 応答速度 | 高い(スイッチング) | 中 |
| ノイズ | EMIあり | 低い |
| コスト | ほぼ0(タイマー流用) | DAC回路が必要 |
| 分解能 | タイマー精度次第 | 8〜16bit |
負荷がインダクタンスを持つモーターや、低周波数で十分なLED調光にはPWMが適しています。高精度アナログ電圧が必要なオーディオやセンサーバイアス設定にはDACが向いています。