目次
前
次
A/Dコンバータ制御
工業用のA/Dコンバータは、12ビットが主流なので、
2種のシリアルインタフェースA/Dコンバータの制御を
説明する。
シリアルインタフェースA/Dコンバータは、概ね次のように
制御する。
- ChipSelectをenableにする
- 制御ワードをclockに同期させて入力
- 変換待ち
- 変換データをclockに同期させて出力
- ChipSelectをdisableにする
MAX186制御
MAX186は、8チャネルの入力をもつ12ビットのA/Dコンバータ。
8チャネルは、シングルエンド入力の場合。バイポーラ入力では
4チャネルになる。
シングルエンド、バイポーラを切り替える、どのチャネルを使う
かは、制御ワードの中のビットを組み合わせることで指定する。
制御ワードはDIN入力に与えるが、結果はDOUT出力から取得
する。
関数を徐々に、仕上げていく。
関数名はget_max186、返値は16ビットとして、制御ワードを入力
パラメータとしておく。
UWORD get_max186(UBYTE x)
{
UWORD result ;
return result ;
}
処理内容は、次のようになっているので、コメントで動作を記述する。
- ChipSelectをenableにする
- 制御ワードをclockに同期させて入力
- 変換待ち
- 変換データをclockに同期させて出力
- 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ビットは、次のように指定する。
- MSB(2^7) 開始指定ビットは、常に1
- 2^6-2^4 チャネル指定 000<->111
- 2^3 ユニポーラかバイポーラの指定
- 2^2 シングルエンドか差動の指定
- 2^1-2^0 クロックとパワーモード指定
MCP3208制御
MCP3208は、8チャネルの入力をもつ12ビットのA/Dコンバータ。
シングルエンド、バイポーラを切り替える、どのチャネルを使う
かは、制御ワードの中のビットを組み合わせることで指定する。
制御ワードはDIN入力に与えるが、結果はDOUT出力から取得
する。
シングルエンド、バイポーラを切り替える、どのチャネルを使う
かは、制御ワードの中のビットを組み合わせることで指定する。
制御ワードはCH入力に与えるが、結果はDOUT出力から取得
する。
関数を徐々に、仕上げていく。
関数名はget_mcp3208、返値は16ビットとして、制御ワードを入力
パラメータとしておく。
UWORD get_mcp3208(UBYTE x)
{
UWORD result ;
return result ;
}
処理内容は、次のようになっているので、コメントで動作を記述する。
- ChipSelectをenableにする
- 制御ワードをclockに同期させて入力
- 変換待ち
- 変換データをclockに同期させて出力
- 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ビットと合わせて
以下のビットパターンになる。
- シングルエンドCH0 11000
- シングルエンドCH1 11001
- シングルエンドCH2 11010
- シングルエンドCH3 11011
- シングルエンドCH4 11100
- シングルエンドCH5 11101
- シングルエンドCH6 11110
- シングルエンドCH7 11111
- バイポーラCH0(IN+)CH1(IN-) 10000
- バイポーラCH0(IN-)CH1(IN+) 10001
- バイポーラCH2(IN+)CH3(IN-) 10010
- バイポーラCH2(IN-)CH3(IN+) 10011
- バイポーラCH4(IN+)CH5(IN-) 10100
- バイポーラCH4(IN-)CH5(IN+) 10101
- バイポーラCH6(IN+)CH7(IN-) 10110
- バイポーラCH6(IN-)CH7(IN+) 10111
目次
前
次