逐次比较型ADC

本文将介绍逐次比较型ADC。

许多微控制器的ADC采用如下图所示的逐次比较型ADC。逐次比较型ADC通过比较VINVREF/2m的值来工作,因此VIN的值可通过以下公式计算:

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

考虑了各种问题的ADC程序示例:

  1. ADC待机状态检查
  2. ADC启动 & ADC执行启动检查
  3. ADC在规定时间内未完成时的超时处理
    ADC的转换时间会随着ADC的位数(2n)而变化,因此需要相应调整超时值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 Chinese
error: 内容受保护 !