目次

A/Dコンバータ制御

 工業用のA/Dコンバータは、12ビットが主流なので、  2種のシリアルインタフェースA/Dコンバータの制御を  説明する。  シリアルインタフェースA/Dコンバータは、概ね次のように  制御する。
  1. ChipSelectをenableにする
  2. 制御ワードをclockに同期させて入力
  3. 変換待ち
  4. 変換データをclockに同期させて出力
  5. ChipSelectをdisableにする

MAX186制御

 MAX186は、8チャネルの入力をもつ12ビットのA/Dコンバータ。  8チャネルは、シングルエンド入力の場合。バイポーラ入力では  4チャネルになる。  シングルエンド、バイポーラを切り替える、どのチャネルを使う  かは、制御ワードの中のビットを組み合わせることで指定する。  制御ワードはDIN入力に与えるが、結果はDOUT出力から取得  する。  関数を徐々に、仕上げていく。  関数名はget_max186、返値は16ビットとして、制御ワードを入力  パラメータとしておく。 UWORD get_max186(UBYTE x) { UWORD result ; return result ; }  処理内容は、次のようになっているので、コメントで動作を記述する。
  1. ChipSelectをenableにする
  2. 制御ワードをclockに同期させて入力
  3. 変換待ち
  4. 変換データをclockに同期させて出力
  5. ChipSelectをdisableにする
UWORD get_max186(UBYTE x) { UWORD result ; /* 0 -> CS */ /* send control word */ /* wait conversion */ /* get data */ /* 1 -> CS */ return result ; }  ChipSelectの処理を加える。 UWORD get_max186(UBYTE x) { UWORD result ; /* 0 -> CS */ AD_CS = OFF ; /* send control word */ /* wait conversion */ /* get data */ /* 1 -> CS */ AD_CS = ON ; return result ; }  制御ワード転送を加える。  DINにクロック同期で制御ワードを転送する。 #define MASK80 0x80 UWORD get_max186(UBYTE x) { UBYTE tmp ; UBYTE i ; UBYTE j ; UWORD result ; /* 0 -> CS */ AD_CS = OFF ; /* send control word */ for ( i = 0 ; i < 8 ; i++ ) { AD_DIN = OFF ; if ( tmp & MASK80 ) { AD_DIN = ON ; } AD_SCLK = ON ; for ( j = 0 ; j < 4 ; j++ ) ; tmp <<= 1 ; AD_SCLK = OFF ; for ( j = 0 ; j < 4 ; j++ ) ; } AD_CS = ON ; AD_DIN = OFF ; /* wait conversion */ /* get data */ /* 1 -> CS */ AD_CS = ON ; return result ; }  変換時間待ちを加える。 #define MASK80 0x80 UWORD get_max186(UBYTE x) { UBYTE tmp ; UBYTE i ; UBYTE j ; UWORD result ; /* 0 -> CS */ AD_CS = OFF ; /* send control word */ for ( i = 0 ; i < 8 ; i++ ) { AD_DIN = OFF ; if ( tmp & MASK80 ) { AD_DIN = ON ; } AD_SCLK = ON ; for ( j = 0 ; j < 4 ; j++ ) ; tmp <<= 1 ; AD_SCLK = OFF ; for ( j = 0 ; j < 4 ; j++ ) ; } AD_CS = ON ; AD_DIN = OFF ; /* wait conversion */ for ( j = 0 ; j < 200 ; j++ ) ; AD_CS = OFF ; /* get data */ /* 1 -> CS */ AD_CS = ON ; return result ; }  変換結果をDOUTから入力する。 #define MASK80 0x80 #define DAC_LAST 16 UWORD get_max186(UBYTE x) { UBYTE tmp ; UBYTE i ; UBYTE j ; UWORD result ; /* 0 -> CS */ AD_CS = OFF ; tmp = x ; /* send control word */ for ( i = 0 ; i < 8 ; i++ ) { AD_DIN = OFF ; if ( tmp & MASK80 ) { AD_DIN = ON ; } AD_SCLK = ON ; for ( j = 0 ; j < 4 ; j++ ) ; tmp <<= 1 ; AD_SCLK = OFF ; for ( j = 0 ; j < 4 ; j++ ) ; } AD_CS = ON ; AD_DIN = OFF ; /* wait conversion */ for ( j = 0 ; j < 200 ; j++ ) ; AD_CS = OFF ; /* get data */ for ( i = 0 ; i < DAC_LAST ; i++ ) { /* 1 -> SCLK */ AD_SCLK = ON ; for ( j = 0 ; j < 4 ; j++ ) ; /* shift */ result <<= 1 ; /* 0 -> SCLK */ AD_SCLK = OFF ; for ( j = 0 ; j < 4 ; j++ ) ; /* adjust */ if ( AD_DOUT ) { result |= 1 ; } } for ( j = 0 ; j < 4 ; j++ ) ; /* 1 -> CS */ AD_CS = ON ; return result ; }  12ビットは、16ビットの上位側にずれているので  LSBからの12ビットに入るように調整する。 #define MASK80 0x80 #define DAC_LAST 16 UWORD get_max186(UBYTE x) { UBYTE tmp ; UBYTE i ; UBYTE j ; UWORD result ; /* 0 -> CS */ AD_CS = OFF ; tmp = x ; /* send control word */ for ( i = 0 ; i < 8 ; i++ ) { AD_DIN = OFF ; if ( tmp & MASK80 ) { AD_DIN = ON ; } AD_SCLK = ON ; for ( j = 0 ; j < 4 ; j++ ) ; tmp <<= 1 ; AD_SCLK = OFF ; for ( j = 0 ; j < 4 ; j++ ) ; } AD_CS = ON ; AD_DIN = OFF ; /* wait conversion */ for ( j = 0 ; j < 200 ; j++ ) ; AD_CS = OFF ; /* get data */ for ( i = 0 ; i < DAC_LAST ; i++ ) { /* 1 -> SCLK */ AD_SCLK = ON ; for ( j = 0 ; j < 4 ; j++ ) ; /* shift */ result <<= 1 ; /* 0 -> SCLK */ AD_SCLK = OFF ; for ( j = 0 ; j < 4 ; j++ ) ; /* adjust */ if ( AD_DOUT ) { result |= 1 ; } } for ( j = 0 ; j < 4 ; j++ ) ; /* 1 -> CS */ AD_CS = ON ; /* adjust */ result >>= 4 ; result &= 0x0fff ; return result ; }  制御の8ビットは、次のように指定する。

MCP3208制御

 MCP3208は、8チャネルの入力をもつ12ビットのA/Dコンバータ。  シングルエンド、バイポーラを切り替える、どのチャネルを使う  かは、制御ワードの中のビットを組み合わせることで指定する。  制御ワードはDIN入力に与えるが、結果はDOUT出力から取得  する。  シングルエンド、バイポーラを切り替える、どのチャネルを使う  かは、制御ワードの中のビットを組み合わせることで指定する。  制御ワードはCH入力に与えるが、結果はDOUT出力から取得  する。  関数を徐々に、仕上げていく。  関数名はget_mcp3208、返値は16ビットとして、制御ワードを入力  パラメータとしておく。 UWORD get_mcp3208(UBYTE x) { UWORD result ; return result ; }  処理内容は、次のようになっているので、コメントで動作を記述する。
  1. ChipSelectをenableにする
  2. 制御ワードをclockに同期させて入力
  3. 変換待ち
  4. 変換データをclockに同期させて出力
  5. ChipSelectをdisableにする
UWORD get_mcp3208(UBYTE x) { UWORD result ; /* 0 -> CS */ /* send control word */ /* wait conversion */ /* get data */ /* 1 -> CS */ return result ; }  ChipSelectの処理を加える。 UWORD get_mcp3208(UBYTE x) { UWORD result ; /* 0 -> CS */ AD_CS = OFF ; /* send control word */ /* wait conversion */ /* get data */ /* 1 -> CS */ AD_CS = ON ; return result ; }  制御ワード転送を加える。  DINにクロック同期で制御ワードを転送する。 #define MASKF8 0xf8 #define MASK80 0x80 UWORD get_mcp3208(UBYTE x) { UBYTE tmp ; UBYTE i ; UWORD result ; /* 0 -> CS */ AD_CS = OFF ; /* send control word */ tmp = (x << 3) & MASKF8 ; for ( i = 0 ; i < 5 ; i++ ) { AD_DIN = OFF ; if ( tmp & MASK80 ) { AD_DIN = ON ; } AD_SCLK = ON ; tmp <<= 1 ; AD_SCLK = OFF ; } /* wait conversion */ /* get data */ /* 1 -> CS */ AD_CS = ON ; return result ; }  変換時間待ちを加える。 #define MASKF8 0xf8 #define MASK80 0x80 UWORD get_mcp3208(UBYTE x) { UBYTE tmp ; UBYTE i ; UWORD result ; /* 0 -> CS */ AD_CS = OFF ; /* send control word */ tmp = (x << 3) & MASKF8 ; for ( i = 0 ; i < 5 ; i++ ) { AD_DIN = OFF ; if ( tmp & MASK80 ) { AD_DIN = ON ; } AD_SCLK = ON ; tmp <<= 1 ; AD_SCLK = OFF ; } /* wait conversion */ AD_SCLK = ON ; AD_SCLK = OFF ; AD_SCLK = ON ; AD_SCLK = OFF ; /* get data */ /* 1 -> CS */ AD_CS = ON ; return result ; }  変換結果をDOUTから入力する。 #define MASKF8 0xf8 #define MASK80 0x80 UWORD get_mcp3208(UBYTE x) { UBYTE tmp ; UBYTE i ; UWORD result ; /* 0 -> CS */ AD_CS = OFF ; /* send control word */ tmp = (x << 3) & MASKF8 ; for ( i = 0 ; i < 5 ; i++ ) { AD_DIN = OFF ; if ( tmp & MASK80 ) { AD_DIN = ON ; } AD_SCLK = ON ; tmp <<= 1 ; AD_SCLK = OFF ; } /* wait conversion */ AD_SCLK = ON ; AD_SCLK = OFF ; AD_SCLK = ON ; AD_SCLK = OFF ; /* get data */ for ( i = 0 ; i < 12 ; i++ ) { result |= AD_DOUT ; AD_SCLK = ON ; if ( i != 11 ) { result <<= 1 ; } AD_SCLK = OFF ; } /* 1 -> CS */ AD_CS = ON ; return result ; }  制御の4ビットは、開始指定の1ビットと合わせて  以下のビットパターンになる。
目次

inserted by FC2 system