アナログ・デバイセズ製のADC「AD7988」をArmadillo-640のCON9に接続する方法を紹介します。
Armadilloからの制御にはECSPI1とGPIOを使用します。
回路構成
使うもの
以下を使用します。
- Armadillo-640
- AD7988 (AD7988-1、AD7988-5どちらでも可)
- AD7988の基板・電源・配線等
接続方法
以下の通りに接続します。
Armadillo (CON9) |
ピンの機能 | AD7988 | ピンの機能 |
---|---|---|---|
15 | ECSPI1_SCLK | 8 | SCK |
16 | GPIO3_IO26 | 6 | CNV |
18 | ECSPI1_MISO | 7 | SDO |
19 | GND | 5 | GND |
20 | VCC_3.3V | 10 | VIO |
20 | VCC_3.3V | 9 | SDI |
ECSPI1_MOSIは接続しません。
AD7988の入力側の回路はデータシート等を参考にしてください。
ArmadilloのLinuxカーネルとDTBをビルド
ここでは「Armadillo-640 製品マニュアル」に倣い、Linuxカーネルのソースコードのディレクトリ名はlinux-v4.14-at[version]と表します。
各コマンドはlinux-v4.14-at[version]ディレクトリで開始してください。
ドライバの追加・デバイスの登録
以下のコマンドでAD7988.patchをダウンロードしLinux カーネルディレクトリでパッチをあててください。
patchコマンドでエラーが出ず、lsコマンドで4つのファイルすべてがファイルの更新日時=patch実行日時になっていれば成功です。
[PC ~/linux-v4.14-at[version]]$ wget https://download.atmark-techno.com/misc/howto_armadillo-640-SPI-ADC-AD7988/AD7988.patch
[PC ~/linux-v4.14-at[version]]$ patch -p 1 < AD7988.patch
patching file arch/arm/boot/dts/armadillo-640.dts
patching file drivers/iio/adc/ad7988.c
patching file drivers/iio/adc/Kconfig
patching file drivers/iio/adc/Makefile
[PC ~/linux-v4.14-at[version]]$ ls -l drivers/iio/adc/Kconfig drivers/iio/adc/Makefile arch/arm/boot/dts/armadillo-640.dts drivers/iio/adc/ad7988.c
-rw-rw-r-- 1 atmark atmark 7573 [patch実行日時] arch/arm/boot/dts/armadillo-640.dts
-rw-rw-r-- 1 atmark atmark 27351 [patch実行日時] drivers/iio/adc/Kconfig
-rw-rw-r-- 1 atmark atmark 3405 [patch実行日時] drivers/iio/adc/Makefile
-rw-rw-r-- 1 atmark atmark 6346 [patch実行日時] drivers/iio/adc/AD7988.c
ドライバの有効化
menuconfigでLinuxカーネルの以下のコンフィギュレーションを有効にしてください。
(Armadillo-640 製品マニュアル内「19.2. イメージをカスタマイズする」を参照)
[PC ~/linux-v4.14-at[version]]$ make ARCH=arm menuconfig
Device Drivers --->
[*] SPI support ---> ← 有効化
[*] Freescale i.MX SPI controllers ← 有効化
Device Drivers --->
[*] Industrial I/O support ---> ← 有効化
Analog to digital converters --->
[*] Analog Devices AD7988 ADC driver ← 有効化
ビルド/書き込み
以上の設定が終わりましたら、uImageとarmadillo-640.dtbをビルドしてください。
その後、2つのファイルをArmadilloに書き込んでください。
(Armadillo-640 製品マニュアル内「19.2. イメージをカスタマイズする」を参照)
[PC ~/linux-v4.14-at[version]]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
LOADADDR=0x82000000 uImage ←「~uImage」まで1つのコマンドです
[PC ~/linux-v4.14-at[version]]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
[PC ~/linux-v4.14-at[version]]$ ls arch/arm/boot/uImage
arch/arm/boot/uImage
[PC ~/linux-v4.14-at[version]]$ ls arch/arm/boot/dts/armadillo-640.dtb
arch/arm/boot/dts/armadillo-640.dtb
確認
さきほど書き込んだLinuxカーネルで起動すると/sys/bus/iio/devices/ディレクトリ下に、
新しくiio\:deviceX(Xには数字が入ります)ディレクトリが作成されています。
以下のコマンドで値を読むことができます。
[armadillo ~]# cat /sys/bus/iio/devices/iio\:device0/in_voltage0_raw
12345 ← 0~65535の数値が表示されます
AD7988のVREFが5Vの場合、以下の通りに換算できます。
in_voltage0_raw × 5 ÷ 65536 = 入力電圧(V)
in_voltage0_raw | 入力電圧(V) |
---|---|
0 | 0.000 |
~ | 〜 |
32768 | 2.500 |
~ | 〜 |
65535 | 4.999 |
その他の設定
Armadilloの/sys/bus/iio/devices/iio\:device0/in_voltage_scaleを参照する場合は、
arch/arm/boot/dts/armadillo-640.dts内のregulator-min-microvoltとregulator-max-microvoltの値をAD7988のREF端子の電圧(μV)に合わせてください。
以下のコマンドで値を読むことができます。(1LSBあたりの入力電圧(mV)になっています。)
[armadillo ~]# cat /sys/bus/iio/devices/iio\:device0/in_voltage_scale
0.076293945 ← 5Vの場合は約0.076mV
正しく合わせると、in_voltage0_raw ÷ in_voltage_scaleでAD7988の入力電圧(mV)を計算することができます。
注意事項
このドライバは「CS MODE, 3-WIRE」のみ対応します。(AD7988データシートを参照)
また、同じSPIのバスにAD7988以外を接続することは想定していません。
(AD7988のCNVをLにしてから変換結果を読み出すまでに、ECSPI1を使用した別の通信が発生するとデータを読み出せない可能性があるため)