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);
- }
|