PWMでD/A変換:アナログマルチプレクサの応用で
・2020年8月13日:Arduino、analogWriteは捨てちゃえ。ちゃんとしたPWMを使おう
ということで、過去、PWMを使ったDAC(D/A変換回路)を
さまざまなツールで使っています。
例えば、
・JIS C8708による充放電サイクル試験回路(トランジスタ技術2010年2月号)
・2020年4月10日:JIS C8708:2019対応ニッケル水素電池充放電実験回路(回路図とプログラム)
・2022年4月14日:Arduino IDEでRaspberry Pi Pico:PWMでD/A出力してA/D入力を試す
・2022年4月15日:Arduino IDEでRaspberry Pi Pico:A/D入力が…あれっ?
これらでは、PWM波からDC電圧を作るのに、
基準電圧ICを使っています。
Vref値とGND間をPWM波でマルチプレックスし、
LPFを通すことで直流に。
デューティ比に比例したDC電圧を得ています。
この応用ということで、Arduino UNOのマイコン
ATmega328PのAREF電圧を取り出した使った実験も
しています。
例えば、この記事。
・2022年10月5日:サーミスタ103JTで計った温度をシリアル出力
サーミスタの抵抗値を見るのに、AREF電圧を取り出して
A/D変換します。
※これはMPXとは関係なしの用例。
次のこの記事では、AREFをオペアンプでバッファして
PWMし、LPFを通してD/A変換しています。
・2022年4月22日:Arduino UNOのA/D入力:PWMでD/A出力してA/D入力を試す
ここで問題に気が付きました。
「なんじゃこれは?」の信号が見えたのです。
AREFをオペアンプでバッファして取り出します。
ATmega328Pに関してはこれでうまく基準電圧が
取り出せます。
そのオペアンプ出力を直にマルチプレクサの入力に
つないでいます。
外付け基準電圧ICを使った時のようにコンデンサを
入れたいところなのですが、発振の可能性があるので、
オペアンプの出力にコンデンサは入れられません。
たまたま、このPWM→D/A変換部の波形を見た所、
こんな信号になっていました。
AREF電圧を出力しているオペアンプ、そこにPWM波に
同期した負パルス(▼マーク位置)が出ているのです。
出力インピーダンスは低いはずなので、MPXの切換
ノイズが飛び込んでいるわけではありません。
そこで、こんな回路を使って実験してみました。
プラス側のIN1入力は1kΩで+5Vに。
マイナス側は1kΩでGNDに。
すると・・・・
まず、1ゲートタイプのマルチプレクサ TC7W53。
MPXパルスが変化したエッジでIN0、IN1に瞬間的な
電流が流れている様子が見えています。
AREF電圧をバッファした通常速度のオペアンプでは、
この短いパルス(150nsくらい)を抑えきることができない
のでしょう。
なぜこんなことが起こるのか・・・
TC7W53の内部回路を見ると分かってきます。
IN0とIN1の切換には、2直にしたインバータが
入っています。
IN1側がその後段につながっているので、IN0から
遅れて切換されます。
その一瞬、COM端子につながるOUT0とOUT1を通して
IN0とIN1が短絡するのです。
IN0はGNDにつながっていますので、オペアンプ出力を
つないでいるIN1が一瞬だけGNDに引っ張られることに
なってしまいます。
それがオペアンプ出力に現れた負パルスの原因です。
※観察のためIN0とIN1に1kΩの抵抗を入
れましたが、IN0、IN1とGND間に0.01uF以上、
0.1uF程度のコンデンサを入れると短絡パルス
は見えなくなります。
基準電圧ICを使った時のパスコンは有効という
ことがわかります。
対策案
・ATmega328PのAREFをオペアンプでバッファして
基準電圧を得るのはOKだが、それをPWM制御する
マルチプレクサにつなぐのは×。
・PWMするマルチプレクサでD/A変換する時は、
パスコンを付加できる基準電圧ICを使う。
こんなところでしょう。
※見えなくなるけど、それでも、短絡は発生してる。
ノイズ発生の要因になるか。
※注1
基準電圧ICに付加するパスコン、こんなことも
ありますので。
2019年9月14日:良かれと思って付けたコンデンサが・・・
※AD680・・・発振!
※どうなんだろう
多チャンネル入力A/Dコンバータ、たいていの場合
マルチプレクサが入力。
チャンネル切換時に今回のようなことが起こる心配
は無いのか?
入力に入れたCRフィルタが役立つかも。
※ブレッドボードで実験
クロック源はATmega328Pを使ったパルスジェネレータ
拡大。
| 固定リンク
「トラブル遭遇」カテゴリの記事
- Arduino UNO R4、GPTのレジスタ定義にミス発見(2025.05.06)
- 失敗は成功の母<第3回>: 同じ型名なのに内部回路が違う!?(2025.04.16)
- 中華製ボール盤 2018年に交換したベルトが再びアウトに(2025.02.19)
- イヤホンのケーブルが・・・(2025.01.24)
- ピンセット、危うし!(2025.01.09)
「Arduino」カテゴリの記事
- Arduino UNO R3で周波数を計る(2025.05.16)
- Arduino UNO R3のクロック精度を1MHzパルスで確かめる(2025.04.28)
- Arduino、analogWriteは捨てちゃえ。ちゃんとしたPWMの例(2025.03.22)
- パルスジェネレータをI2C液晶で動かす(2025.01.28)
- EEPROMを使ったシリアル受信バッファ 512kバイトに増設(2024.12.26)
「AVRマイコン」カテゴリの記事
- AVRマイコンAT90S1200を使ったデジタル時計(2024.06.02)
- 数値をBCD出力(表示)するルーチン #3(2024.05.03)
- 数値をBCD出力(表示)するルーチン #2(2024.04.28)
- ATmega4809のシリアルポート(2023.01.18)
- PWMでD/A変換:アナログマルチプレクサの応用で(2023.01.02)
コメント