Arduino Uno のPWM出力をアナログ信号に変換する

Arduino Unoの出力信号のうち6本はPWM出力の機能があります。

PWM信号はそのままではディジタルですが、ロジックHiの期間を可変することができますから、区間の平均値を出す信号、つまり電圧に変換すれば、完全なアナログ信号に変わります。「ディジタル」とか「アナログ」は、見方の一つに過ぎないということもできます。

ArduinoのPWM周波数は、通常は約490Hzと約980Hzです。ピンにより周波数は異なります。

「アナログ」と聞くと、最近、巷では完全に別の意味で使われますが、本来はそれらとはまったく無関係です。計測制御の世界では、アナログは精密なものを意味します。

ロジックHiの期間はプログラムで指定しますが、かなり正確に制御することができます。環境条件の一つである温度が変化しても「幅」はほとんど変化しません。

アナログ信号のみで制御する仕組みは、温度の変化に対して誤差を小さくすることは難しいですが、ディジタル制御では同じ誤差なら簡単にできます。


PWM信号をローパス・フィルタ回路に入力すると、区間の平均値を出すことができます。特性により「リップル値」が残り、その大きさも変化します。うまく設計すると、ほぼ完全な平均値を求めることができます。

この時点で、ディジタル to アナログ変換(DA変換)が完成します。

ローパス・フィルタ回路は、「OPアンプ」(Operational Amplifier)を使います。オフセット電圧などの誤差は付き物ですが、最近の製品はかなり性能が上がっていますから、注意して選ぶと誤差は気になりません。

具体的には、「オフセット電圧の温度係数」です。他にも関係するパラメータはありますが、ほとんどこれで決まります。


CとRだけ一段のローパス・フィルタは、用途によりますが十分な特性ではないかもしれません。

参考情報
http://okawa-denshi.jp/blog/?th=2009072200

上記のページにあるリンクですが、こちらのページを参考にしてローパス・フィルタ回路を設計できます。
http://sim.okawa-denshi.jp/PWMtool.php

たとえば、fPWM=490Hz、R=100KΩ、C=1uF に設定し、「CR時定数の設定」ボタンを選び、「計算」ボタンを押します。ページの下に計算したグラフが出ます。

計算結果は、0.4秒でほぼ100%に達するので、普通の用途なら問題なく使えます。このときの最大リップル電圧は、ページの中程にあるように24.9mVです。

温度センサの温度によりファンの速度を制御する用途では、この程度の応答で普通は十分です。リップル電圧はファンを制御する電圧の安定度ですから、必要な値が得られれば十分です。

lo-pass 1.png

この回路の出力インピーダンスは100Kと高いので、この後にバッファアンプをつなぎ出力します。


これを上回る特性は、同じCRの時定数でもアクティブ・フィルタを構成すると簡単に実現できます。具体的には、OPアンプによるゲインの効果ではるかに小さい低リップル電圧にすることができます。こちらは、また機会をみて説明します。