[单片机芯片] CH573的ADC问题

[复制链接]
 楼主| linguanghua 发表于 2021-5-20 16:19 | 显示全部楼层 |阅读模式
本帖最后由 linguanghua 于 2021-5-20 16:30 编辑

使用ADC是遇到一些问题。
1. 有个GPIOAGPPCfg() 函数,把对应IO设为模拟口,发现官方历程没有使用。不知道为什么?只是为了省电吗?
2. ADC数值不对劲。比如使用内部电池通道用库里的ADC_InterBATSamInit(),-12DB模式,发现输出值为0XBA9。按手册的公式,(ADC/512-3)*Vref=6.1V;结果应该是是3.0V才对。
 楼主| linguanghua 发表于 2021-5-20 17:05 | 显示全部楼层
搞错公式,ADC=0XBA9 , (ADC/512-3)*Vref=2.97。
LonlyPan 发表于 2021-8-27 15:38 | 显示全部楼层
GPIOAGPPCfg() 配置引脚为AIN,在别的芯片是作为校准用的,不过CH573已经改为使用内部通道校准,因此这行程序是多余的,可以删除不用(已咨询官方技术)。可以查看下一行的校准函数 ADC_DataCalib_Rough( void ) 实现,可以看到使用的是内部通道(通道6),也证实这一点

以下是修改后的单通道采样的初始化函数:
  1. void adc_single_init()
  2. {
  3.     /* 单通道采样:选择adc通道0做采样,对应 PA4引脚, 带数据校准功能 */
  4.     PRINT( "\n2.Single channel sampling...\n" );
  5.     GPIOA_ModeCfg( GPIO_Pin_4, GPIO_ModeIN_Floating );
  6.     ADC_ExtSingleChSampInit( SampleFreq_3_2, ADC_PGA_1_2 );

  7.     //GPIOA_ModeCfg( GPIO_Pin_5, GPIO_ModeIN_Floating );
  8.     RoughCalib_Value = ADC_DataCalib_Rough(); // 用于计算ADC内部偏差,记录到全局变量 RoughCalib_Value中
  9.     PRINT( "RoughCalib_Value =%d \n", RoughCalib_Value );

  10.     ADC_ChannelCfg( 0 );
  11. }


以下是库中校准函数的实现:(使用的是内部通道6)
  1. /*******************************************************************************
  2. * Function Name  : ADC_DataCalib_Rough
  3. * Description    : 采样数据粗调,获取偏差值
  4. * Input          : None
  5. * Return         : 偏差值
  6. *******************************************************************************/
  7. signed short ADC_DataCalib_Rough( void )        // 采样数据粗调,获取偏差值
  8. {
  9.     UINT16  i;
  10.     UINT32  sum=0;
  11.     UINT8  ch=0;        // 备份通道
  12.     UINT8   ctrl=0;     // 备份控制寄存器
  13.    
  14.     ch = R8_ADC_CHANNEL;
  15.     ctrl = R8_ADC_CFG;

  16.     R8_ADC_CFG = 0;
  17.     ADC_ChannelCfg( 6 );                // 6/7/10/11 可选
  18.     R8_ADC_CFG |= RB_ADC_OFS_TEST|RB_ADC_POWER_ON|(2<<4);      // 进入测试模式
  19.     R8_ADC_CONVERT = RB_ADC_START;
  20.     while( R8_ADC_CONVERT & RB_ADC_START );
  21.     for(i=0; i<16; i++)
  22.     {
  23.         R8_ADC_CONVERT = RB_ADC_START;
  24.         while( R8_ADC_CONVERT & RB_ADC_START );
  25.         sum += (~R16_ADC_DATA)&RB_ADC_DATA;
  26.     }   
  27.     sum = (sum+8)>>4;
  28.     R8_ADC_CFG &= ~RB_ADC_OFS_TEST;      // 关闭测试模式
  29.    
  30.     R8_ADC_CHANNEL = ch;
  31.     R8_ADC_CFG = ctrl;
  32.     return (2048 - sum);
  33. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

220

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部

26

主题

220

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部