セクションの複数ページをまとめています。 印刷またはPDF形式で保存...

もとのページに戻る

2025-08-08 現在

ADC関連のAHI関数と解説

TWENETライブラリ、ADC関連のAHI関数と解説
    TWENETライブラリ、ADC関連のAHI関数と解説です。

    ADC

    AHI の ADC(アナログディジタル変換) 関連の一部について、ソースコードの互換を目的として実装しています。

    概要

    ADCのハードウェア仕様はモデルによって違いがあります。

    TWELITE BLUETWELITE REDTWELITE GOLD
    ビット数10bit10bit12bit
    フルスケール2470mV2470mV3600mV
    チャネル数
    (API未サポート)
    44 (2)4 (2)

    本ライブラリでは ADC0..3 までの4チャネルと Vcc を利用するための処理を記述しています。ただし、変換時間や変換データの互換性まではライブラリでは実施せず、アプリケーションソースで調整する前提です。

    なお6ピンまでの変換や、複数チャネルをまとめた ADC、AHIライブラリでは対応せずmwf::the_adcを直接利用するようにしてください。

    関連:オンチップ温度センサー

    ピン

    PIO備考
    ADC015
    ADC114DIO8と共用
    ADC216
    ADC317

    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割り込みが有効になります。
    • u8SampleSelectbRefSelectは無視されます。
    • 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.cadc処理部分 (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,4
    • u8InputRangeMask: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