GPIOAGPPCfg() 配置引脚为AIN,在别的芯片是作为校准用的,不过CH573已经改为使用内部通道校准,因此这行程序是多余的,可以删除不用(已咨询官方技术)。可以查看下一行的校准函数 ADC_DataCalib_Rough( void ) 实现,可以看到使用的是内部通道(通道6),也证实这一点
以下是修改后的单通道采样的初始化函数:
void adc_single_init()
{
/* 单通道采样:选择adc通道0做采样,对应 PA4引脚, 带数据校准功能 */
PRINT( "\n2.Single channel sampling...\n" );
GPIOA_ModeCfg( GPIO_Pin_4, GPIO_ModeIN_Floating );
ADC_ExtSingleChSampInit( SampleFreq_3_2, ADC_PGA_1_2 );
//GPIOA_ModeCfg( GPIO_Pin_5, GPIO_ModeIN_Floating );
RoughCalib_Value = ADC_DataCalib_Rough(); // 用于计算ADC内部偏差,记录到全局变量 RoughCalib_Value中
PRINT( "RoughCalib_Value =%d \n", RoughCalib_Value );
ADC_ChannelCfg( 0 );
}
以下是库中校准函数的实现:(使用的是内部通道6)
/*******************************************************************************
* Function Name : ADC_DataCalib_Rough
* Description : 采样数据粗调,获取偏差值
* Input : None
* Return : 偏差值
*******************************************************************************/
signed short ADC_DataCalib_Rough( void ) // 采样数据粗调,获取偏差值
{
UINT16 i;
UINT32 sum=0;
UINT8 ch=0; // 备份通道
UINT8 ctrl=0; // 备份控制寄存器
ch = R8_ADC_CHANNEL;
ctrl = R8_ADC_CFG;
R8_ADC_CFG = 0;
ADC_ChannelCfg( 6 ); // 6/7/10/11 可选
R8_ADC_CFG |= RB_ADC_OFS_TEST|RB_ADC_POWER_ON|(2<<4); // 进入测试模式
R8_ADC_CONVERT = RB_ADC_START;
while( R8_ADC_CONVERT & RB_ADC_START );
for(i=0; i<16; i++)
{
R8_ADC_CONVERT = RB_ADC_START;
while( R8_ADC_CONVERT & RB_ADC_START );
sum += (~R16_ADC_DATA)&RB_ADC_DATA;
}
sum = (sum+8)>>4;
R8_ADC_CFG &= ~RB_ADC_OFS_TEST; // 关闭测试模式
R8_ADC_CHANNEL = ch;
R8_ADC_CFG = ctrl;
return (2048 - sum);
}
|