アナログデジタルコンバータLTC2450を使ってアナログからデジタルに変換したデータを読み取る方法を紹介します。
使用するマイコンはRaspberry Pi、プログラム言語はPythonです。
主な仕様
入力数:1チャンネル
分解能:16ビット
変換方式:ΔΣ方式
電源:単一電源
入力:シングルエンド
通信:SPI通信
外付け部品が不要であることや内部較正アルゴリズムで、オフセットやフルスケールが動作温度範囲に対して高精度に保証されています。
準備
LTC2450の購入
LTC2450は6端子のDFNと呼ばれる形状です。
センサーを手ではんだ付けするのは不可能なのでモジュールの購入になると思います。
写真は秋月電子通商で購入したLTC2450モジュールです。今回は、このモジュールを使ったサンプルプログラムを紹介します。
モジュールとRaspberry Piの接続
ブレッドボードの接続図と、ADのカウント値の例です。
接続図
接続写真
アナログ信号の接続例
LTC2450はレール・トゥ・レール入力です。リファレンス電圧は電源電圧です。
レール・トゥ・レール入力なので、GNDレベル~電源までの入力に対してデジタル変換が可能です。(『オフセット誤差とフルスケール誤差を無視すれば、理論的に入力0Vの時にオールゼロ、電源電圧の時にオール1の結果を出力する』の記述があります。)
入力を下の回路図の様に接続して、ADの出力データを確認することができます。
①ADの出力 約 0 (VINをGNDに接続)
②ADの出力 約 65535 (VINをVccに接続)
③ADの出力 約 32768 (VINをVcc/2に接続)
※LTC2450の入力抵抗は15kΩです。誤差が大きくなる可能性が有るので、接続する回路の出力抵抗には注意してください。
①ADの出力データ 約 0
②ADの出力データ 約 65535
③ADの出力データ 約 32768
Raspberry Piの3.3V電源は50mAの電流を流せるようなので、
3.3V / 50mA = 66Ω
おおまかには、66Ω以上であれば電源が落ちることはないと思います。
仮にR = 1kΩとすると、
(1kΩ+15kΩ) / (1kΩ×15kΩ) = 937.5Ω
1kΩ+937.5Ωなので、電流は問題なく流せます。
ADの出力データの誤差は、
937.5Ω/(1kΩ+937.5Ω)* 65536 = 31710
R = 1kΩのとき、約 31710 です。
Raspberry Piの通信設定とPythonの操作方法
Raspberry PiのSPI通信設定を有効にします。
下の記事でRaspberry Piの通信設定と、Pythonの基本操作を説明しています。
SPI通信プログラミング
プログラムコード
Pythonプログラムです。
import spidev
import time
#SPI設定
spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 10000
spi.mode = 3
dat = [0x00, 0x00]
#繰り返し
while True:
#読み込み
ret = spi.xfer2(dat)
#データ変換
ad_count = (dat[0] << 8) & 0xFF00 | (dat[1] & 0x00FF)
#表示
print('A/D count: ' + str(ad_count))
#一時停止
time.sleep(0.1)
spi.close()
LTC2450は特別な設定をしなくても下記サイクルを繰り返します。
・電源投入後から自動的にAD変換 → スリープ
・要求があったときにデータの出力 → AD変換 → スリープ
マイコンからAD変換の命令が無くても自動的にAD変換をしてスリープ状態になります。
プログラムの説明
プログラムの流れです。
- SPI通信の設定
- LTC2450からデータを取得
- 取得したデータをShellに表示
- 2.~3.を繰り返します
1.SPI通信の初期設定
#SPI設定
spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 10000
spi.mode = 3
spi.open(0,0)
Bus0をチップセレクト0でオープンします。
spi.max_speed_hz = 100000
クロックのスピードを10kHzにします。
spi.mode = 3
SPI通信のハードウェア設定です。(mode 3は負論理の立下りエッジ検出)
SPI通信の詳しい説明はこちら
「シリアル・ペリフェラル・インタフェース」(2021年10月21日 (木) 02:31 UTCの版)『ウィキペディア日本語版』
2.LTC2450からデータを取得
#読み込み
ret = spi.xfer2(dat)
ret = spi.xfer2(dat)
ADのカウント値を読み込みます。16bitデータです。
#データ変換
ad_count = (dat[0] << 8) & 0xFF00 | (dat[1] & 0x00FF)
ad_count = (dat[0] << 8) & 0xFF00 | (dat[1] & 0x00FF)
8bitの入れ物2つにデータが入っているので、16bitにします。
3.取得したデータを画面に表示
#表示
print('A/D count: ' + str(ad_count))
#一時停止
time.sleep(0.1)
print(‘ad: ‘ + str(count))
ADのカウント値を画面に表示します。
time.sleep(0.1)
カッコ内の秒数の0.1秒間一時停止します。
4.2.~3.を繰り返します
#繰り返し
while True:
while True:
Stopボタンが押されるまで繰り返します。
※この『while True:』は、13行目のwhile文です。
spi.close()
spi.close()
SPI通信終了します。
ただし、プログラムはSTOPボタンで終了するので、spi.close()は実行されません。
プログラムの実行結果
プログラムを実行します。
①Runボタンを押します。
②ADのカウント値を0.1秒間隔で画面に表示します。
③Stopボタンを押すとプログラムは終了です。
以上、アナログデジタル変コンバータ LTC2450を使用してADのカウント値を画面に表示するサンプルでした。
LTC2450を使ってアナログ加速度センサーで測定した記事です。
まとめ
LTC2450からデジタル変換したデータを受け取るサンプルプログラムの解説をしました。如何でしたでしょうか。
アナログデジタルコンバータが使えると、いろいろな機会で活躍できると思います。
アナログ出力センサーも使えるようになりますので、今まで出来なかったことが出来るようになれば幸いです。
プログラミングやソフトウェアの記事です。
コメント