INtimeドキュメンタリトップへ

アナログデータ変換値取得スレッド完成!!

10月18日・・・アナログデータ変換・取得

アナログデータの取得準備が整いました。
アナログボードに対してサンプリング開始コマンドを発行すると、そのデータ変換終了の割り込みとしてWaitForRtInterrupt()以下の処理が流れるような仕組みです。

それではサンプリング開始についてマニュアルの記述を見る必要があります。


サンプリング開始


サンプリング開始

シングルチャンネルモード時: 変換するチャンネルを指定します。
マルチチャンネルモード時  : 変換するチャンネルの上限値(1以上)を指定します。
例えば、10chを指定すると0~10chをサンプリングします。
今回の場合マルチチャンネルで取得チャンネルの上限値は7(0CH~7CH)であるため・・・

     outbyte(ベースアドレス+0x04, 7);

となるのでしょう。
変換データの入力
マニュアルによると、アナログデータのデジタルデータへの変換は以下のように行われます:

変換データの入力

入力値デジタル変換

-10~+10の入力範囲を設定した場合、変換データは上の図のようになります。つまり0x0000(0)~0x0FFF(4095)の範囲で電圧データが変換されます。-10.000V時はデジタルデータ0、+9.995V(10V)時はデジタルデータ4095となることを示しています。

今回の場合0V~10Vの範囲なので0v(デジタルデータ0)~10V(デジタルデータ4095)に変換されればよいということになります。

 

入力値デジタル変換

入力値デジタル変換
サンプルでは以下のように記されています
while( !inp( ADR + 6 ) & 2 ){
	AiData = inpw( ADR );
}     

この例では「+0x06のアナログ入力ステータスのレジスタをポーリングで検索し、Data Read Enableの値がたっているときにはアナログデータを取得する」とあります。

今回の場合、サンプリング開始を出力後、Data Read Enableの値をポーリングで検索しないので、この例は適用できません。その代わりに割り込みを使用します。

GetADataThreadの記述部分:

void	GetADataThread(void)
{
   int		i;
   WORD	aData[CH_CNT];
	
   if (!SetRtInterruptHandler(strInfo.wIntLevel, 1, Int1Handler))
         Fail("Cannot set interrupt task for Pci(0x1221,0x8153)");

   InitAnalogBord();/* アナログボードの初期化*/
   dataCnt = 0;	/*取得データ数初期化*/

   while (1)
   {
       RtSleep(100);	//サンプリング周期10..........(1)
        /*サンプリング開始コマンド: BASE+0x04-CH数:7 */
       outbyte(strInfo.analogAdd + 0x04, 7);..........(2)
        //変換データが設定されるまで(割り込みが発生するまで)待つ
        if(WaitForRtInterrupt(strInfo.wIntLevel,WAIT_FOREVER) != TRUE){
                 ;..........(3)
        };		
        /*	8CH分データ取り込み	*/		
        // 0~7CHの8回取り込み処理を繰り返す		
        for( i = 0 ; i < CH_CNT;i++){..........(4)
            aData[i] = inhword(strInfo.analogAdd) & 0x0FFF;
        }
    }
}

(1)サンプリング周期・・・100ms
(2)サンプリング開始コマンド出力
(3)割り込み待機
(4)変換データ取得
この後、あるチャンネルに5Vの電圧をかけ、入力値が2047程度であったことから、データ変換がうまくできていることを確認しました。


※TenAsys®, INtime®, eVM® and iRMX® are registered trademarks in USA of the TenAsys Corporation.