打印
[单片机芯片]

CH573的ADC问题

[复制链接]
8579|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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),也证实这一点

以下是修改后的单通道采样的初始化函数:
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);
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

216

帖子

4

粉丝