サンプリング開始
|
|
シングルチャンネルモード時: 変換するチャンネルを指定します。
マルチチャンネルモード時 : 変換するチャンネルの上限値(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程度であったことから、データ変換がうまくできていることを確認しました。 |