8ビットのマイクロコントローラは、低価格で入手できる便利なデバイスである。しかし、そうした製品が内蔵するPWM(パルス幅変調)機能には、リソース面で制約がある。PWM機能のために多くのリソースを使用すると、同機能とハードウエアを共有しているキャプチャ/コンペアチャンネルやタイマーチャンネルが犠牲になることが多いのだ。本稿ではそのようなケースに適した代替策として、マイクロコントローラが備える未使用の同期シリアルポートを利用してPWM信号を生成する方法を紹介する(図1)。
同期シリアルポートは、マイクロコントローラをベースとするスタンドアロン型の電子機器では使用されないことが多い。そのような機器では、ボーレートの発生やパラレル−シリアル変換のための回路ブロックをPWMパターンの生成に利用することができる。同期通信では、非同期通信の場合とは異なり、スタートビットとストップビットが使用されない。そのため、ハイまたはローが長く続くビットパターンを生成することが可能である。さらに、出力されるPWM信号をRCフィルタ(ローパスフィルタ)に通せば、アナログ信号を得ることもできる*1)。
図2のように、PWM変換の1サイクルが256ビット、つまり32バイトから成るケースを考える。ここでは、10進数の165を「元データ(raw data)」とするPWMパターンを生成するとしよう。ここで言う元データとは、PWMパターンにおいて、連続してオンになるビット数のことである。元データが165ならば、256ビットのうち165ビットがオンになり、91ビットがオフになるという意味だ。165個のビットを連続してオンにするには、まず最初の20バイト分、つまり160ビット分の「1」を送出する。続く21番目の1バイト分は工夫したところである。筆者は、これに「遷移バイト」という名前を付けた。この遷移バイトは、オンの期間の長さを所要値に合わせるために使用する。遷移バイトのLSBから一定数のビットを「1」とし、残りを「0」にする。元データが165の場合であれば、160+5=165とする必要があるので、160ビット分の「1」に続いて、5ビット分だけ「1」を追加する。つまり、遷移バイトは2進数の00011111(16進数の0x1F)となる。
図3に、PWM信号の生成作業の流れを示した。この図に示した流れで作業を進めた上で、発振周波数、PLL(Phase-locked Loop)の条件およびボーレートを適切に選択すれば、用途に合致した周波数のPWM信号を生成できる。本稿では8ビットのPWM信号を生成する例を示したが、PWMサイクル当たりの全ビット数を変更すれば、分解能の増減が行える。
マイクロコントローラ用のサンプルコードは、http://www.edn.com/contents/images/DI4545Code.zipからダウンロード可能である。このコードは、米Microchip Technology社のマイクロコントローラ「PIC18F4525」を使用する場合の例となっている。同期シリアル通信の条件は、発振(水晶)周波数が4MHz、ボーレートが10kbaud(キロボー)で、PWM信号の周波数は約39Hz(10000Hz/256)となる。このPWM信号を、時定数が0.1sのRCフィルタでフィルタリングすれば、モーション制御用の速度設定信号などとして十分に使用可能なアナログ信号を生成できる。
脚注
※1…Mitchell, Mike, "Make a DAC with a microcontroller's PWM timer," EDN, Sept 5, 2002, p.110
Copyright © ITmedia, Inc. All Rights Reserved.