この投稿では、逐次比較型ADCについて説明します。
多くのMCUのADCは、下図のような逐次比較型ADCです。逐次比較型ADCは、VIN と VREF/2mとの比較なので、 VIN の値は次の式で求めます。
VIN = ( ADC Data Register value × VREF ) / 2n
色んな問題を考慮したADCのプログラムの例
- ADC待機中チェック
- ADC開始 & ADC実行開始チェック
- ADCが所定時間以内に終わらなった場合のタイムアウト
ADCの変換時間はADC 2n bitで変わるのでタイムアウトTIME_OUT_ADCも合わせる - ADC読み出し
#define TIME_OUT_ADC 10 // 10[us]
// Sample HAL function
int hal_adc_status( int ); // ADC status read function
int hal_adc_start( int ); // ADC start function
int hal_adc_read( int ); // ADC read function
bool time_out( int ); // Time out function [us]
int ADC_Read( int ch)
{
bool flag = FALSE;
int val = 0;
// Check if ADC is running
if( hal_adc_status( ch ) == ADC_FIN )
{
// ADC start
if( hal_adc_start( ch ) == ADC_EXE )
{
flag = TRUE;
do{
// Check Time out
if( time_out( TIME_OUT_ADC ) == TRUE )
{
flag = FALSE;
break;
}
// Check ADC fin
}while( hal_adc_status( ch ) == ADC_FIN )
}
}
if( flag == TRUE )
{
// ADC read
val = hal_adc_read( ch );
}
return( val );
}
簡単なADCのプログラム例
- ADC開始およびADC変換待機、ADC読み出し
// Sample HAL function
int hal_adc_start_read( int ); // ADC start & read function
int ADC_Read( int ch)
{
// ADC start & read
return( hal_adc_start_read( ch ) );
}