ADC
AHI の ADC(アナログディジタル変換) 関連の一部について、ソースコードの互換を目的として実装しています。
- この実装は完全な互換性を保つことを目的とはしていません。
- 本書記述時点で判明している留意点などを記載します。
- 内部の実装は予告なく変更される場合があります。
概要
ADCのハードウェア仕様はモデルによって違いがあります。
TWELITE BLUE | TWELITE RED | TWELITE GOLD | |
---|---|---|---|
ビット数 | 10bit | 10bit | 12bit |
フルスケール | 2470mV | 2470mV | 3600mV |
チャネル数 (API未サポート) | 4 | 4 (2) | 4 (2) |
本ライブラリでは ADC0..3 までの4チャネルと Vcc を利用するための処理を記述しています。ただし、変換時間や変換データの互換性まではライブラリでは実施せず、アプリケーションソースで調整する前提です。
なお6ピンまでの変換や、複数チャネルをまとめた ADC、AHIライブラリでは対応せずmwf::the_adc
を直接利用するようにしてください。
関連:オンチップ温度センサー
ピン
PIO | 備考 | |
---|---|---|
ADC0 | 15 | |
ADC1 | 14 | DIO8と共用 |
ADC2 | 16 | |
ADC3 | 17 |
AHIcmpt_ADC.cpp
本ライブラリ内では、TWELITE BLUE/RED の AHI ライブラリとの違いについて記述します。APIの仕様については、AHIライブラリマニュアルも参照ください。
vAHI_ApConfigure()
void vAHI_ApConfigure(
bool_t bAPRegulator,
bool_t bIntEnable,
uint8 u8SampleSelect,
uint8 u8ClockDivRatio,
bool_t bRefSelect);
ADCの初期化(mwf::the_adc
オブジェクトの構築と the_adc->init()
初期化)を行います。
bAPRegulator
をTRUEに指定するとADCを有効化します。FALSEにした場合はADCを無効化します。bIntEnable
をTRUEに指定するとADC割り込みが有効になります。u8SampleSelect
とbRefSelect
は無視されます。u8ClockDivRatio
も現時点では設定が反映されません。bAHI_APRegulatorEnabled()
を用いたアナログ回路の安定化待ち処理は必要です。
bAHI_APRegulatorEnabled()
bool_t bAHI_APRegulatorEnabled(void)
ウェイクタイマを用いたFRWTを動作していない場合は(Cライブラリでは標準)、固定時間の待ち処理を行います(300usec)。この場合vAHI_ApConfigure()
呼び出し直後に本関数を呼び出すことを推奨します。相応の時間経過後であっても固定時間の待ち処理を行います。
FRWTを有効化している場合は、タイマカウント値に基づき、必要な待ち処理を行います。相応の時間経過後は、本関数内の待ち処理は行いません。
vAHI_APRegisterCallback()
void vAHI_APRegisterCallback(PR_HWINT_APPCALLBACK prApCallback);
割り込みハンドラを登録します。ADC完了時に呼び出されます。
vAHI_AdcEnable()
void void vAHI_AdcEnable(
bool_t bContinuous,
bool_t bInputRange,
uint8 u8Source);
ADCの変換設定を行います。
bContinuous
を選択すると連続変換しますが、内部的な割り込みが変換都度発生するため、パフォーマンス面で注意が必要です。bInputRange
を指定しても、そういったハードウェア機能がないため反映されません。- この呼出時に
u8Source
に対応したピンがADC用として設定されます。 vAHI_ApConfigure()
実行後にbAHI_APRegulatorEnabled()
を未実行で待ち処理が実行されなかった場合は、本呼び出しにて待ち処理を行います。
vAHI_AdcDisable()
void vAHI_AdcDisable(void);
ADCを停止します。
vAHI_AdcStartSample()
void vAHI_AdcStartSample(void);
ADCの変換開始を行います。
- 原則として初期化時は入力状態ですが、厳密には TWENETmcu ライブラリの pinmux.c
BOARD_InitPins()
の初期化状態が規定値になります。
bAHI_AdcPoll()
bool_t bAHI_AdcPoll(void);
ADC完了待ちを行うポーリング待ち処理while(bAHI_AdcPoll());
に使用します。
- ADC完了の割り込み後、本呼び出しは1度だけ FALSE を返します。
u16AHI_AdcRead(), i16AHI_AdcRead_mv()
uint16 u16AHI_AdcRead(void);
int16 i16AHI_AdcRead_mv(void); // 非AHI独自関数
実行したADC値を読み出します。
u16AHI_AdcRead()
は ADC 値を 12bit (0..4095) で返します。エラー時は 0xffff
を戻します。i16AHI_AdcRead_mv()
は AHI ライブラリにはない独自関数で、ADC値を mV で返します。エラー時は-32768
を戻します。
s_adc_int_handler()
static void s_adc_int_handler(uint32_t a1, uint32_t a2);
AHIcmpt_ADC.cpp
で定義された静的関数で、ADC完了時に呼び出される割り込みハンドラとして、TWENETの AppQApi に割り込みを伝達します。
vAHI_APRegisterCallback()
にてコールバック関数が指定されいている場合は、呼び出されません。
実験的な実装
複数チャネル一括処理
// TWELITE GOLD 専用
// FSLドライバ機能を用いて複数チャネルのADC取得を一括で行う。
// ADC実行(パラメータはvAHI_AdcEnable()と同様)
void vAHI_AdcEnableSeq(
bool_t bContinuous,
bool_t bInputRange,
uint32 u32MaskSource);
// ADC値の読出し
uint16 u16AHI_AdcReadSeq(
uint8 u8Source
);
// ADC値の読出し (mV値にて)
int16 i16AHI_AdcReadSeq_mv(
uint8 u8Source
);
sensor_driver, adc.c, adc.h
sensor_driver
は既存のTWEAppsアプリケーションなどで利用される処理関数群で、センサー処理の抽象化するためのメカニズムを提供しています。adc.c
,.h
は、sensor_driver
でチップ内ADCを動作させるために、一連のコマンド発行、待ち、データ取得といった順序処理を記述したものです。なお TWENETmwx/sensors/legacy
以下には ADC 以外のいくつかのセンサー向けの実装が含まれます。
TWELITE BLUE/REDのプロジェクトをTWELITE GOLDに移行する場合は、App_Twelite/Common
に格納された調整済みのファイルを利用下さい。但し、プロジェクトごとに内容が違う場合があるため、修正等が必要になる場合があります。
ソース名 | 内容 |
---|---|
adc.c | adc処理部分 (ADC値の変換部分は TWELITE GOLD の値域に合わせている) |
adc.h | 定義部 |
sensor_driver.c | センサー処理抽象化部分 |
sensor_driver.h | 定義部 |
コード例
以下のコード中のコメントを参照してください。
#include "sensor_driver.h"
#include "adc.h"
tsObjData_ADC sObjADC; // ADC管理構造体(データ部)
tsSnsObj sADC; // ADC管理構造体(制御部)
int16 a1,a2,ab; // 結果格納用
...
// ADC 初期化
vSnsObj_Init(&sADC);
vADC_Init(&sObjADC, &sADC, TRUE);
vADC_WaitInit(); // ハード初期化待ちを行う
...
// ADC計測したいポートの指定(以下では電源電圧とADC1,2)
sObjADC.u8SourceMask = TEH_ADC_SRC_VOLT
| TEH_ADC_SRC_ADC_1 | TEH_ADC_SRC_ADC_2;
// ADC開始
vSnsObj_Process(&sADC, E_ORDER_KICK); // 開始の号令
// ADCの1チャネル処理が終わるのを待って(=E_AHI_DEVICE_ANALOGUE割り込み)
// vSnsObj_Process() を順次呼び出す。
void cbToCoNet_vHwEvent(uint32 u32DeviceId, uint32 u32ItemBitmap) {
switch (u32DeviceId) {
case E_AHI_DEVICE_ANALOGUE:
// ADC完了割り込み
vSnsObj_Process(&sADC, E_ORDER_KICK);
if (bSnsObj_isComplete(&sADC)) {
// 全チャネルの処理が終わった。
// 値は以下に格納される
a1=sObjADC.ai16Result[TEH_ADC_IDX_ADC_1]; // ADC1[mV]
a2=sObjADC.ai16Result[TEH_ADC_IDX_ADC_2]; // ADC2[mV]
ab=sObjADC.ai16Result[TEH_ADC_IDX_VOLT]; // 電源電圧[mV]
// ADC開始前の初期状態に戻す
vSnsObj_Process(&sADC, E_ORDER_KICK);
// 連続して実行する場合はもう一度E_ORDER_KICK
vSnsObj_Process(&sADC, E_ORDER_KICK);
}
break;
default:
break;
}
}
関数
vSnsObj_Init()
void vSnsObj_Init(tsSnsObj *pSnsObj)
センサー管理構造体を初期化します。vADC_Init()
の直前に呼び出します。
vADC_Init()
void vADC_Init(tsObjData_ADC *pData, tsSnsObj *pSnsObj, bool_t bInitAPR)
ADCの初期化を行います。tsObjData構造体(結果格納用)とtsSnsObj構造体(ADC管理)はあらかじめ用意しておきます。
- bInitAPRはTRUEの場合、ADCハードウェアの初期化を行います。ハードウェアの初期化には若干の時間が必要ですので、必ずvADC_WaitInit()を実行して初期化を待ちます。
vSnsObj_Process()
void vSnsObj_Process(tsSnsObj *pObj, teEvent eEv)
ADC処理の進捗させる。具体的には、ADCの1ポート分の変換完了するたびに本処理を呼び出す。
本処理中で、ADC値の取得と mV値への演算処理が行われ、tsSnsObj
構造体中に値が格納される。
本処理は、tsSnsObj
構造体で管理される状態遷移に対するイベント処理になる。本処理直後にbSnsObj_isComplete()
を呼び出し処理が完了したかを確認する。再び初期状態に戻すには、改めてE_ORDER_KICK
を引数として本処理を実行する(つまりADCを再度実行するには完了後にE_ORDER_KICK
を2回実行することになる)。
tsObjData_ADC
構造体
この構造体には、指定する ADC チャネル、結果として得られる電圧値が含まれます。
u8SourceMask
:ADC対象のポートを指定するビットマップ。指定したポートがADC対象となる。- TEH_ADC_SRC_VOLT : 電源電圧-TEH_ADC_SRC_ADC_1-4
: ADC1,2,3,4u8InputRangeMask
:ADC対象のポートのレンジ(0-Vrefまたは0-2Vref)を指定する。指定したポートは0-Vrefとなる。未指定の場合 0-2Vref となる。ai16Result[]
:ADC値を保存する構造体。結果はmV値として格納される。- TEH_ADC_IDX_VOLT : 電源電圧-TEH_ADC_IDX_ADC_1-4
: ADC1,2,3,4