- 公開日:2026年01月21日
- | 更新日:2026年02月05日
アナログエンジニアがマイコンを触ってみた 第4回 PWM編
- ライター:KF
- マイコン
アナログ回路設計者である私達が、ひょんなことからルネサス製RXマイコンを使ってみることに。普段見慣れたデータシートとは違う、分厚いユーザーズマニュアル。聞いたことのない専門用語の数々。正直、どこから手をつけていいか分かりませんでした。今回のシリーズは、同じようにマイコンの第一歩を踏み出すアナログエンジニアへの、ささやかな道しるべとなれば幸いです。
今回は、マルチファンクションタイマパルスユニットを使用した「PWMタイマ」です。
| タイマ名称 | 役割(ひとことで言うと) |
| MTU2a(マルチファンクション
タイマパルスユニット)/TPUa(タイマパルスユニット) |
【波形生成・モータ制御】
インバータ制御や複雑なPWM波形を作るためのプロ仕様。機能が多すぎて設定が大変。 |
| WDT(ウォッチドックタイマ)/ RTC (リアルタイムクロック)等 | 【専用機能】
時計(RTC)や、フリーズ監視(ウォッチドッグ)など、特定の目的専用のタイマ。 |
| CMT
(コンペアマッチタイマ) |
【ただのタイマ】
時間を測って、時間が来たら知らせるだけ。 |
(*)前回の記事はこちら
そもそもPWMとは?
そもそも、「PWM タイマ」の PWM とはPulse-Width Modulation(パルス幅変調)を略しております。
一言でいうと、「高速にスイッチを ON/OFF することで、平均的な電圧をコントロールする技術」です。
私たちアナログ技術者にとって馴染み深い「スイッチングレギュレータ」や「LED の調光回路」で使用されています。
ON の時間(パルス幅)を変えることで、あたかも電圧を無段階に変化させているかのように振る舞わせることができます。
マルチファンクションタイマパルスユニットでどのようにPWM波形を出すの?
以下のブロック図を元に説明します。

1. 元となるクロック (PCLK)
まず、マイコン内部生成されるクロックの源振(PCLK)が入ってきます。これは非常に高速(数MHz〜数十MHz)です
2. 分周回路(プリスケーラ)
高速すぎるクロックを、使いやすい速度に間引く「分周回路」を通します。
3. カウンタ(TCNT)
分周されたクロックに合わせて、「0, 1, 2, 3…」と値を1つずつ増やしていきます(カウントアップ)。
4. 周期決定用コンペアマッチレジスタ(TGRA)
「1周期の長さ」を監視しているブロックになります。 カウンタの値が あらかじめ決めておいた設定値(TGRA/コンペアマッチレジスタの値)と一致した瞬間に合図を出し、出力波形を「0」に切り替えます。また、この合図は次の ⑥クリア信号 にもつながります。
5. Duty決定用コンペアマッチレジスタ(TGRB)
「ON/OFFを切り替えるタイミング」を監視しているもう一つのブロックです。 カウンタの値が あらかじめ決めておいた設定値(TGRB/コンペアマッチレジスタの値)に達した瞬間に合図を出し、出力波形を「1」に切り替えます。これによって、波形が High になっている「パルス幅」が決まります。
6. カウンタクリア信号
周期決定用コンペアマッチレジスタで設定値と一致した瞬間にカウンタの値を0に戻す信号です。これのおかげでカウンタはまた 0 から数え直しを始め、一定のリズムでパルスが出続けることになります。
■波形にすると以下のようになります。

このグラフは、カウンタ(TCNT)が0から増えていき、設定した値(TGRB、TGRA)に到達した瞬間に何が起きているかを示しています。
TGRB(40)に到達したとき: 出力波形が「0」から「1」に切り替わります(立ち上がり)
TGRA(100)に到達したとき: 出力波形が「1」から「0」に切り替わります(立ち下がり)同時に、カウンタが「0」にリセットされます。
■設定値と波形の関係
この設定値(レジスタの値)を変えることで、自由自在にパルスを操ることができます。
周期を変えるには? TGRAの値を大きくすると、1周期の時間が長くなり、周波数が低くなります。
デューティ比(ONの時間)を変えるには? TGRBの値を小さくすると「1」の時間が長くなり、大きくすると「1」の時間が短くなります。
PWMタイマを動作させる評価基板について
今回も市販されている「Target Board for RX231」を使用し、「PWMタイマ」を動作させていきます。
本ボードはプログラムを書き込むためのエミュレータ回路が搭載されていることです。つまり、他に特別な機材を用意する必要がありません。この基板とPCをUSBケーブルで繋ぐだけで、すぐに開発をスタートできます!

【Target Board for RX231はこちらから】
プロジェクトスタート
まずはe2Studioを使用して、プロジェクトをスタートさせます。スタートの仕方については、1回目でもお知らせしたので、以下のURLを改めてご確認ください。
スマートコンフィグレータについて(タイマの設定)
1.プロジェクトより「スマートコンフィグレータ」(以下の図ではjikken.scfg)を起動させます。

2.ファイルを開くと以下の画面が表示されますので、画面下側赤枠の「コンポーネント」タブをクリックします。

3. 以下の画面が表示されますので、「PWMモードタイマ」を選択します。

4. 以下の画面が表示されますので、動作で「PWMモード1」を選択し、「終了」を押してください。

5. コンペアマッチの設定
以下の図でも見せたようにPWM信号の生成の為には、カウンタの値と比較する設定値いわゆるコンペアマッチの設定が必要です。

以下が設定画面になります。

まず、カウンタの設定をしていきます。

■カウンタクリア要因
⇒TGRA0コンペアマッチ(TGRA0を周期レジスタとして使用)を選択します。
1周期の長さを決めるため、設定値に到達した時点でカウンタを『0』に戻す設定です。本ガイドでは、周期設定用のコンペアマッチレジスタとして TGRA を使用します。
■カウンタクロックの選択
⇒PCLK/16を選択。
マイコン内部の高速な時計(PCLK)をそのまま使うと、カウンタがすぐに一杯になってしまいます。今回設定する 5000μs という周期を作るのにちょうど良い速度(1/16の速さ)に調整しています。
■ジェネラルレジスタの設定
⇒今回はすべて「アウトプットコンペアレジスタ」で設定してください。
タイマーユニットには複数の「レジスタ(数値を格納する箱)」があり、それぞれに役割を持たせることができます。
◎通常レジスタ(アウトプットコンペアレジスタ)
今回は TGRA0 を「周期(終わり)」を決めるために使用し、
TGRB0 を「波形を切り替えるタイミング(Duty)」を決めるために使用します。
◎バッファレジスタ(TGRC, TGRD)
・なぜ「バッファレジスタ」を使うの?
プログラムの実行中に、LEDの明るさを変えたりモータの速度を変えたりするために、Duty比を書き換えることがあります。もし、カウンタが動いている途中で直接 コンペアマッチ を書き換えてしまうと、タイミングによっては波形にノイズ(意図しない短いパルス)が混じることがあります。 バッファ設定にしておくと、新しい値を一旦「予約(TGRDへ書き込み)」しておき、周期が切り替わるタイミングで安全に反映してくれるようになるため、非常に安定した制御が可能になります。

■出力端子の設定

ここからは、カウンタとコンペアマッチレジスタの関係について設定していきます。
◎MTIOC0A端子
⇒「端子初期出力は0、コンペアマッチで0出力」で設定。
MTIOC0A端子は、解説図における**「出力波形」**に該当します。この設定により、周期の始まり(カウンタ0)でLow(0) を出力し、周期の終わり(TGRAとの一致時)に再び Low(0) を出力して次の周期へ備えます。
◎TGRBコンペアマッチ一致時の動作
⇒「MTIOC0A端子から1出力」で設定。
カウンタの値がコンペアマッチレジスタである TGRB の値に到達した際、MTIOC0A端子の出力を High(1)の状態に切り替えることを示しています。

(*)MTIOC0C端子 TGRDコンペアマッチ一致時の動作については、今回は使用しないので説明を省きます。
■PWM出力設定
ここからは、PWMとDutyの設定をしていきます。
◎PWM周期
⇒5,000μs
PWM信号の周期を設定する項目です。今回は5,000μsと設定しました。
◎TGRA初期値
周期を決定するコンペアマッチレジスタ(TGRA)の値を設定します。スマートコンフィギュレータでは、上記の「PWM周期」を入力すると、マイコンの動作クロックに合わせて 自動的に最適なTGRAの値が算出・入力されます。
※今回の例では、自動計算により 16874 が設定されています
◎TGRB初期値
⇒設定: 15186
波形を切り替えるタイミングを決めるレジスタです。今回はDuty比を 10% にするため、TGRA(16874)の90%にあたる 15186 を手動で入力します。

上記の設定が完了したら、「コードの生成」を押しましょう。

スマートコンフィグレータについて(出力端子の確認)
1. プロジェクト内の「スマートコンフィギュレータ」ファイルを起動
プロジェクトより「スマートコンフィグレータ」(以下の図ではjikken.scfg)を起動させます。

2. ファイルを開くと以下の画面が表示されますので、画面下側赤枠の「端子」タブをクリックします。

3. MTIOC0A 端子の割り当て確認
先ほどPWM設定を行った MTIOC0A 端子 の状態を確認します。
今回の設定では、16番ピン(P34/MTIOC0A…)に正しく割り当てられていることが確認できました。

プログラムの生成
ここからはプログラムを書いていきます。

1. 「#include “h”」、「#include “Config_MTU0.h」
「#include “r_smc_entry.h”」は、スマートコンフィグレータが自動生成した、マイコンの初期設定を読み込む為のコードです。
「#include “Config_MTU0.h」はMTU0を操作するための関数が使えるようになる為のコードです。
2. R_Config_MTU0_Create ();
スマートコンフィギュレータで設定した内容(周期5000μs、Duty 10%など)をタイマーレジスタに書き込む関数です。
「R_Config_MTU0_Create()」の内容については画面左側の「プロジェクト・エクスプローラー」の「src」→「smc_gen」→「Config_MTU0.c」を確認できます。
3. R_Config_MTU0_Start ();
ここで初めてタイマのカウントがスタートし、物理ピン(16番ピン)から波形が出始めます。
4. While文
プログラムを終了させない為にwhile文を挿入。
コードの実装
ここでは作成したコードを実装します。
1.ビルド
ソースコードを、コンピュータが実行できる形式のファイル(実行可能ファイル)に変換する一連の作業になります。赤枠のトンカチボタンを押します。

2. 「build finished」が表示されていれば成功です。
![]()
3. デバック
MCUへの書き込みを行い、プログラムのバグを探すための準備をします。赤枠の虫のマークをクリックします。

プログラムの実行
最後にプログラムを実行し、所望の動作をしているか確認します。
1. ツールバーの「再生」ボタンをクリックすると、MCU上でプログラムが実行されます。

2. オシロスコープにて正しく出力されているか確認。
設定したとおり周期5.0msに対してON時間0.5msとなっておりDutyが10%であることが確認できました!

まとめ
今回は、PWMタイマー機能の確認を実施しました。次回はマイコンの割り込み機能の理解を進めていきます。
お問い合わせはこちら
ルネサス製品をお探しの方は、メーカーページもぜひご覧ください。
【ルネサスメーカーページはこちら】
