工作と競馬2

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

BLEモジュール BL652ブレイクアウトボードで遊ぶ(4) --- A/D変換 ---

概要

BL652ブレイクアウトボードで、アナログ出力のセンサの値をA/D変換して読み取ってみた。



背景と目的

前回のI2C通信に引き続き、BL652ブレイクアウトボードでの実用を想定して、アナログ接続のセンサからA/D変換で値を読み取ってみる。



詳細

0. 実施環境と参考情報


1. 回路

以下の回路を使用し、AIN4~AIN7のA/D変換値を読み取る。

  • AIN4: 5V系の電源電圧検出用回路を接続
  • AIN5: 土壌水分センサを接続
  • AIN6: 光センサを接続
  • AIN7: 予備系統

なお、GPIO14,16,18,20は計測時以外の無駄な電流をなくすための制御ポートとして用意している。(今回はどうでもいいのでONしっぱなしで使う)


2. コーディング

参考資料2を参考に、コーディングした。動作は、3秒に1回、A/D変換入力4chを取得。AD変換の設定は、

  • 減衰比: 1/6
  • 分解能: 12bit
  • アクイジションタイム: 40usec

とした。BL652の仕様上、A/D変換の基準電圧が0.6Vで減衰比1/Nのとき、ディジタルフルスケールが0.6 * N [V]に対応する。

GPIO14,16,18,20は、今回は待機電流はどうでもいいのでHIGHにしたまま。

// 変数 -----------------------------------------------------------

DIM pinVBAT,pinMOIST,pinPHOTO,pinEX1 // ADC入力
pinVBAT = 28
pinMOIST = 29
pinPHOTO = 30
pinEX1 = 31

DIM pinVBATEN, pinMOISTEN, pinPHOTOEN, pinEX1EN // センサ電源
pinVBATEN = 20
pinMOISTEN = 18
pinPHOTOEN = 16
pinEX1EN = 14

DIM r // 作業用

DIM adcVBAT, adcMOIST, adcPHOTO, adcEX1 // ADC計測値
DIM VCE as float : VCE = 0.013 // VBAT計測回路オフセット, 13mV

// 関数 ----------------------------------------------------------------

// ADCピン設定
FUNCTION config_ADCPins()

    // GPIOSETFUNCEX (nSigNum, nFunction, subFunc$)
    // subFunc$ will be a string that has the following form:- "\Gain_hex\Resolution_hex\Acquisition_hex"
    // ADC基準電圧は0.6V、1/Nスケーリングの場合、0.6*N[V]がディジタルフルスケールになる
    DIM subFunc$ : subFunc$ = "\16\0C\14" // gain=1/6scaling, resolution=12bit, aquisition_time=40usec
    r = GPIOSETFUNCEX(pinVBAT, 3, subFunc$)
    r = GPIOSETFUNCEX(pinMOIST, 3, subFunc$)
    r = GPIOSETFUNCEX(pinPHOTO, 3, subFunc$)
    r = GPIOSETFUNCEX(pinEX1, 3, subFunc$)

ENDFUNC 1

// センサ回路電源設定
FUNCTION config_SensorPowerSupply()
    // GPIOSETFUNC (nSigNum, nFunction, nSubFunc)
    // nSubFunc
    r = GPIOSETFUNC(pinVBATEN, 2, 0) // VBAT
    r = GPIOSETFUNC(pinMOISTEN, 2, 0) // MOIST
    r = GPIOSETFUNC(pinPHOTOEN, 2, 0) // PHOTO
    r = GPIOSETFUNC(pinEX1EN, 2, 0) // EX1

ENDFUNC 1

// センサ回路ON
FUNCTION enable_Sensors()

    GpioWrite(pinVBATEN, 1) // VBAT
    GpioWrite(pinMOISTEN, 1) // MOIST
    GpioWrite(pinPHOTOEN, 1) // PHOTO
    GpioWrite(pinEX1EN, 1) // EX1

ENDFUNC 1

// AD変換
FUNCTION get_ADC()

    DIM VBAT as float

    // ADC
    adcVBAT = GpioRead(pinVBAT)
    adcMOIST = GpioRead(pinMOIST)
    adcPHOTO = GpioRead(pinPHOTO)
    adcEX1 = GpioRead(pinEX1)

    VBAT = (adcVBAT * 0.6 * 6 / 4096.0 - VCE) * 2.0 + VCE

    // 表示
    PRINT "VBAT = "; VBAT; "V\n"
    PRINT "MOIST = "; adcMOIST; "\n"
    PRINT "PHOTO = "; adcPHOTO; "\n"
    PRINT "EX1 = "; adcEX1; "\n"
    PRINT "\n"

ENDFUNC 1

// メイン -------------------------------------------------------

// ADCピン設定
r = config_ADCPins()

// センサ回路電源設定
r = config_SensorPowerSupply()

// センサ回路ON
r = enable_Sensors()

ONEVENT EVTMR1 CALL get_ADC

TimerStart(1, 3000, 1)

WAITEVENT


3. 動作確認

以下の通り、チャンネルごとに多少ばらつきはあるが、ほぼ正しい値となっていることを確認した。

  • AIN4
    • 実測1: 4.55V、A/D変換値: 4.55V
    • 実測2: 3.38V、A/D変換値: 3.39V --- 電池が消耗した場合を想定して低めの電圧の時の精度を確認。
  • AIN5
    • 実測: 2.956V, ADC: 3370=2.956V
  • AIN6
    • 実測: 2.247V, ADC: 2576=2.261V

※AIN7は、予備なので精度確認なし。

※上記の数値は、下の画像とは別のタイミングで取得。


まとめと今後の課題

本記事までで、I2C、BLEアドバタイズ、A/D変換のコーディング方法が確認できた。次回は、センサ計測値をBLEで飛ばせるようにしたい。