LTspiceでPWM信号を作り、アナログに変換する(Arduinoを想定)

published_with_changes 更新日: event_note 公開日:

labelelement labelLTspice

LTspiceの信号源として電圧源でPWMを作り、それにローパスフィルタにかけて、所望の電圧に変換する方法の備忘録です。

引用事例

次の事例があったのでそのとおり行ってみたのですが、どうもしっくりいきませんでした。

【LTspice入門】LTspiceでマイコンのPWM波形発生モデルを作成・シミュレートする方法

【LTspice入門】LTspiceでマイコンのPWM波形発生モデルを作成・シミュレートする方法

今回はLTspice上でマイコンに見立てた自作コンポーネントから擬似的なPWM波形を発生させるための方法を色々と考察していきます。

しっくりいかない事例は次の内容です。

下図はデューティを0から1まで0.1刻みで変えた計算ですが、デューティ0.1(青色)と0.9(うす紫)のときには時系列波形と ふたつの .meas コマンドで測定された値がおかしくなっています。


この原因はPWMの波形にありそうです。LTspiceの解析は .tran 0 1 0.9 として、波形の安定する 0.9sから1s を取り込むように指定をしているのですが、デューティ0.1(青色)と0.9(うす紫)のときには、取り込み初期にパルスが発生していません。

何度か繰り返して検証したのですが、結果は同じでした。


何となくおかしな結果になる現象は、途中からの取り込み指定をしない場合でも下図のように発生します。このケースでは、デューティ0.1(青色)と0.9(うす紫)のときは、それぞれV(out)が0.5Vと4.5Vになるはずが、0Vと5Vになってしまっています。



引用元のPWM波形はビヘイビア電圧を使って、次の関数で作っています。
V=V(1) * if(time*freq - int(time*freq) + 0.5 - duty, 0, 1)

わかりやすくするため、デューティ 0.5 のケースで図式化すると次のようになります。時間を周波数に応じてパルスに変換する関数には問題ないので、おかしな結果になるケースはLTspice側の意地悪だと思います。


代替案

先の引用事例では、残念ながら計算結果に信頼を置けないので、他の方法を考えます。

① 電圧源:Pulse or PWL

周波数(FREQ)とデューティ(Duty)でPWMパルスを2通りの方法で設定できます。2.の記述は5つの点の時間と電圧を設定するので記述が長くなります。
  1. PULSE(0 1 0 1p 1p {1/FREQ*Duty-2p} {1/FREQ})
  2. PWL Repeat forever (0 0 1p 1 {1/FREQ*Duty+1p} 1 {1/FREQ*Duty+2p} 0 {1/FREQ} 0) Endrepeat

時間によって変化しない固定のデューティならば、これで行けます。



② キャリアと変調用の電源信号をビヘイビア電源でコンパレートする

上記の方法は、param変数のDutyを時間の関数 Duty=f(time) とすることができません。色々試してみましたがダメのようです。

パルス幅の変調ができるようにキャリア信号(CAR)と変調信号(MOD)を電圧源でそれぞれ組み、それらをビヘイビア電源のif関数で比較してパルス波を得ます。変調信号は任意の関数にすることができるので、PWM(パルス幅変調)になります。


しっくりこなかった前項と同じ条件でシミュレーションします。デューティに比例して1次ローパスフィルタの出力V(OUT1)がリニアに変化する様子をシミュレーションできました。


50Hzの三角波(赤色線)で変調した事例を載せます。1次のローパスフィルタでは±0.05V程度のノイズ(キャリア信号)が残っています。これをオペアンプを使った2次のローパスフィルタにするとほとんど無視できるレベル(3.6mVp-p)にできます。


ローパスフィルタは1次、2次、3次ともに下記のサイトで設計しました。

CRローパス・フィルタPWM計算ツール

CRローパス・フィルタにPWM信号を与え,その時のSTEP応答について計算します.

Powered by Blogger | Designed by QooQ

keyboard_double_arrow_down

keyboard_double_arrow_down