本文将介绍逐次比较型ADC。
许多微控制器的ADC采用如下图所示的逐次比较型ADC。逐次比较型ADC通过比较VIN与VREF/2m的值来工作,因此VIN的值可通过以下公式计算:
VIN = ( ADC Data Register value × VREF ) / 2n

考虑了各种问题的ADC程序示例:
- ADC待机状态检查
- ADC启动 & ADC执行启动检查
- ADC在规定时间内未完成时的超时处理
ADC的转换时间会随着ADC的位数(2n)而变化,因此需要相应调整超时值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 ) );
}