查看: 2056|回复: 1

[其他] 关于ADC0的校正功能

[复制链接]

该用户从未签到

32

主题

138

帖子

0

中级会员

Rank: 3Rank: 3

积分
390
最后登录
2017-12-29
发表于 2017-4-22 13:55:13 | 显示全部楼层 |阅读模式
本帖最后由 胡孟龙 于 2017-4-22 16:29 编辑

”校准功能是基于你的ADC功能配置,如时钟源选择,频率大小,参考电源等,进行的一种校准运算,生成对应的补偿参数,当然ADC采样操作,不一定需要校准功能的,校准工作只是为了让ADC转换更加精确而已。“


我想问下参考手册里说在进行校正时频率不得高于4Mhz,硬件平均选用32个sample等等。但是如果我实际对ADC的设置和这些不一致,用这个校正函数可以吗?比如我使用的是ADC0的Pingpong方式,硬件平均是16个,ADC时钟频率为12Mhz。
/************************************************************************************
**        函数名:        uint8_t ADC0_Correct( void )
**        输    入:        无
**        输    出:        无
**        返回值:        0,校验成功, 1,校验失败
**        描    述:         ADC0校验
**                        在校正之前,须正确配置ADC时钟、采样时间、模式、硬件滤波32次
**                        更加详细的说明请参见芯片手册“校验功能”部分
*************************************************************************************/
uint8_t API_ADC0_Correct( void )
{
        uint32_t cal_var;
        
        SIM_SCGC6 |= SIM_SCGC6_ADC0_MASK;//打开ADC0的时钟
        
        ADC0_CFG1 = 0;
        ADC0_CFG1 |= ADC_CFG1_ADICLK(1)|ADC_CFG1_ADIV(3);//选择时钟48MHZ/2/8 = 3MHZ
        ADC0_CFG1 |= ADC_CFG1_MODE(3);        //选择16位分辨率
        
        ADC0_SC2 &=  ~ADC_SC2_ADTRG_MASK ; //使能软件触发   
        ADC0_SC3 &= ( ~ADC_SC3_ADCO_MASK & ~ADC_SC3_AVGS_MASK );//单次转换
        ADC0_SC3 |= ( ADC_SC3_AVGE_MASK | ADC_SC3_AVGS(3) ); //硬件平均滤波32次  
        ADC0_SC3 |= ADC_SC3_CAL_MASK ;//开始标定
        
        while (!(ADC0_SC1A & ADC_SC1_COCO_MASK)); // 等待标定结束
        
        if (ADC0_SC3& ADC_SC3_CALF_MASK) // 校正失败
                return (1);                                    
                                                                                       

                                       
        cal_var = 0x00;        // 计算正向输入校正
        cal_var =  ADC0_CLP0;
        cal_var += ADC0_CLP1;
        cal_var += ADC0_CLP2;
        cal_var += ADC0_CLP3;
        cal_var += ADC0_CLP4;
        cal_var += ADC0_CLPS;
        
        cal_var = cal_var >> 2;
        cal_var |= 0x8000;   //Set MSB
        
        ADC0_PG = ADC_PG_PG(cal_var);

        cal_var = 0x00;        // 计算负向输入校正
        cal_var =  ADC0_CLM0;
        cal_var += ADC0_CLM1;
        cal_var += ADC0_CLM2;
        cal_var += ADC0_CLM3;
        cal_var += ADC0_CLM4;
        cal_var += ADC0_CLMS;
        
        cal_var = cal_var >> 2;
        cal_var |= 0x8000; // Set MSB
        
        ADC0_MG = ADC_MG_MG(cal_var);
        
        ADC0_SC3 &= ~ADC_SC3_CAL_MASK ; //请CAL
        
        return 0;
}
补充问题:
ADC的正端增益和负端增益分别是什么意思?

我知道答案 目前已有1人回答
回复

使用道具 举报

该用户从未签到

712

主题

6371

帖子

0

超级版主

Rank: 8Rank: 8

积分
24871
最后登录
2025-7-18
发表于 2017-4-24 10:21:52 | 显示全部楼层
楼主你好!
问问题的时候,请给出你所使用的芯片型号,这样我们好帮你查看问题。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-19 20:45 , Processed in 0.086714 second(s), 22 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表