逐次比較型ADC

この投稿では、逐次比較型ADCについて説明します。

多くのMCUのADCは、下図のような逐次比較型ADCです。逐次比較型ADCは、VINVREF/2mとの比較なので、 VIN の値は次の式で求めます。

 VIN = ( ADC Data Register value × VREF ) / 2n

色んな問題を考慮したADCのプログラムの例

  1. ADC待機中チェック
  2. ADC開始 & ADC実行開始チェック
  3. ADCが所定時間以内に終わらなった場合のタイムアウト
    ADCの変換時間はADC 2n bitで変わるのでタイムアウトTIME_OUT_ADCも合わせる
  4. 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のプログラム例

  1. 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 ) );
}
OSS-ECAL Japanese
error: コンテンツは保護されている