查看: 2658|回复: 6

[已解决] KL25的ADC模块的校准功能,如何理解?(已解决)

[复制链接]

该用户从未签到

196

主题

495

帖子

0

金牌会员

Rank: 6Rank: 6

积分
1482
最后登录
2020-12-3
发表于 2013-12-25 13:12:39 | 显示全部楼层 |阅读模式
KL25的ADC模块有校准功能,不明白这是什么作用?必须要做吗?不做好像也可以啊。
 
我知道答案 目前已有5人回答
回复

使用道具 举报

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
发表于 2013-12-25 13:51:50 | 显示全部楼层

回复:KL25的ADC模块的校准功能,如何理解?

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

使用道具 举报

该用户从未签到

196

主题

495

帖子

0

金牌会员

Rank: 6Rank: 6

积分
1482
最后登录
2020-12-3
 楼主| 发表于 2013-12-25 14:19:22 | 显示全部楼层

回复:KL25的ADC模块的校准功能,如何理解?

回复第 2 楼 于2013-12-25 13:51:50发表:
 校准功能是基于你的ADC功能配置,如时钟源选择,频率大小,参考电源等,进行的一种校准运算,生成对应的补偿参数,当然ADC采样操作,不一定需要校准功能的,校准工作只是为了让ADC转换更加精确而已。
 

喔,我看KL25的ADC例程中有这样一段校准的代码
uint8 ADC_Cal(ADC_MemMapPtr adcmap)
{

  unsigned short cal_var;
 
  ADC_SC2_REG(adcmap) &=  ~ADC_SC2_ADTRG_MASK ; // Enable Software Conversion Trigger for Calibration Process    - ADC0_SC2 = ADC0_SC2 | ADC_SC2_ADTRGW(0);  
  ADC_SC3_REG(adcmap) &= ( ~ADC_SC3_ADCO_MASK & ~ADC_SC3_AVGS_MASK ); // set single conversion, clear avgs bitfield for next writing
  ADC_SC3_REG(adcmap) |= ( ADC_SC3_AVGE_MASK | ADC_SC3_AVGS(AVGS_32) );  // Turn averaging ON and set at max value ( 32 )
 
 
  ADC_SC3_REG(adcmap) |= ADC_SC3_CAL_MASK ;      // Start CAL
  while ( (ADC_SC1_REG(adcmap,A) & ADC_SC1_COCO_MASK ) == COCO_NOT ); // Wait calibration end
     
  if ((ADC_SC3_REG(adcmap)& ADC_SC3_CALF_MASK) == CALF_FAIL )
  { 
   return(1);    // Check for Calibration fail error and return
  }
  // Calculate plus-side calibration
  cal_var = 0x00;
 
  cal_var =  ADC_CLP0_REG(adcmap);
  cal_var += ADC_CLP1_REG(adcmap);
  cal_var += ADC_CLP2_REG(adcmap);
  cal_var += ADC_CLP3_REG(adcmap);
  cal_var += ADC_CLP4_REG(adcmap);
  cal_var += ADC_CLPS_REG(adcmap);

  cal_var = cal_var/2;
  cal_var |= 0x8000; // Set MSB

  ADC_PG_REG(adcmap) = ADC_PG_PG(cal_var);
 

  // Calculate minus-side calibration
  cal_var = 0x00;

  cal_var =  ADC_CLM0_REG(adcmap);
  cal_var += ADC_CLM1_REG(adcmap);
  cal_var += ADC_CLM2_REG(adcmap);
  cal_var += ADC_CLM3_REG(adcmap);
  cal_var += ADC_CLM4_REG(adcmap);
  cal_var += ADC_CLMS_REG(adcmap);

  cal_var = cal_var/2;

  cal_var |= 0x8000; // Set MSB

  ADC_MG_REG(adcmap) = ADC_MG_MG(cal_var);
 
  ADC_SC3_REG(adcmap) &= ~ADC_SC3_CAL_MASK ; /* Clear CAL bit */

  return(0);
}
 
如果我想在ADC中校准的话,我直接调用这个函数就可以吗?还需要做其他的工作吗?
 
回复 支持 反对

使用道具 举报

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
发表于 2013-12-25 14:27:04 | 显示全部楼层

回复:KL25的ADC模块的校准功能,如何理解?

回复第 3 楼 于2013-12-25 14:19:22发表:
回复第 2 楼 于2013-12-25 13:51:50发表:
 校准功能是基于你的ADC功能配置,如时钟源选择,频率大小,参考电源等,进行的一种校准运算,生成对应的补偿参数,当然ADC采样操作,不一定需要校准功能的,校准工作只是为了让ADC转换更加精确而已。
 

喔,我看KL25的ADC例程中有这样一段校准的代码
uint8 ADC_Cal(ADC_MemMapPtr adcmap)
{

  unsigned short cal_var;
 
  ADC_SC2_REG(adcmap) &=  ~ADC_SC2_ADTRG_MASK ; // Enable Software Conversion Trigger for Calibration Process    - ADC0_SC2 = ADC0_SC2 | ADC_SC2_ADTRGW(0);  
  ADC_SC3_REG(adcmap) &= ( ~ADC_SC3_ADCO_MASK & ~ADC_SC3_AVGS_MASK ); // set single conversion, clear avgs bitfield for next writing
  ADC_SC3_REG(adcmap) |= ( ADC_SC3_AVGE_MASK | ADC_SC3_AVGS(AVGS_32) );  // Turn averaging ON and set at max value ( 32 )
 
 
  ADC_SC3_REG(adcmap) |= ADC_SC3_CAL_MASK ;      // Start CAL
  while ( (ADC_SC1_REG(adcmap,A) & ADC_SC1_COCO_MASK ) == COCO_NOT ); // Wait calibration end
     
  if ((ADC_SC3_REG(adcmap)& ADC_SC3_CALF_MASK) == CALF_FAIL )
  { 
   return(1);    // Check for Calibration fail error and return
  }
  // Calculate plus-side calibration
  cal_var = 0x00;
 
  cal_var =  ADC_CLP0_REG(adcmap);
  cal_var += ADC_CLP1_REG(adcmap);
  cal_var += ADC_CLP2_REG(adcmap);
  cal_var += ADC_CLP3_REG(adcmap);
  cal_var += ADC_CLP4_REG(adcmap);
  cal_var += ADC_CLPS_REG(adcmap);

  cal_var = cal_var/2;
  cal_var |= 0x8000; // Set MSB

  ADC_PG_REG(adcmap) = ADC_PG_PG(cal_var);
 

  // Calculate minus-side calibration
  cal_var = 0x00;

  cal_var =  ADC_CLM0_REG(adcmap);
  cal_var += ADC_CLM1_REG(adcmap);
  cal_var += ADC_CLM2_REG(adcmap);
  cal_var += ADC_CLM3_REG(adcmap);
  cal_var += ADC_CLM4_REG(adcmap);
  cal_var += ADC_CLMS_REG(adcmap);

  cal_var = cal_var/2;

  cal_var |= 0x8000; // Set MSB

  ADC_MG_REG(adcmap) = ADC_MG_MG(cal_var);
 
  ADC_SC3_REG(adcmap) &= ~ADC_SC3_CAL_MASK ; /* Clear CAL bit */

  return(0);
}
 
如果我想在ADC中校准的话,我直接调用这个函数就可以吗?还需要做其他的工作吗?
 对的,这就自校准函数,调用就好了!!
 
回复 支持 反对

使用道具 举报

该用户从未签到

196

主题

495

帖子

0

金牌会员

Rank: 6Rank: 6

积分
1482
最后登录
2020-12-3
 楼主| 发表于 2013-12-25 14:42:44 | 显示全部楼层

回复:KL25的ADC模块的校准功能,如何理解?

回复第 4 楼 于2013-12-25 14:27:04发表:
回复第 3 楼 于2013-12-25 14:19:22发表:
回复第 2 楼 于2013-12-25 13:51:50发表:
 校准功能是基于你的ADC功能配置,如时钟源选择,频率大小,参考电源等,进行的一种校准运算,生成对应的补偿参数,当然ADC采样操作,不一定需要校准功能的,校准工作只是为了让ADC转换更加精确而已。
 

喔,我看KL25的ADC例程中有这样一段校准的代码
uint8 ADC_Cal(ADC_MemMapPtr adcmap)
{

  unsigned short cal_var;
 
  ADC_SC2_REG(adcmap) &=  ~ADC_SC2_ADTRG_MASK ; // Enable Software Conversion Trigger for Calibration Process    - ADC0_SC2 = ADC0_SC2 | ADC_SC2_ADTRGW(0);  
  ADC_SC3_REG(adcmap) &= ( ~ADC_SC3_ADCO_MASK & ~ADC_SC3_AVGS_MASK ); // set single conversion, clear avgs bitfield for next writing
  ADC_SC3_REG(adcmap) |= ( ADC_SC3_AVGE_MASK | ADC_SC3_AVGS(AVGS_32) );  // Turn averaging ON and set at max value ( 32 )
 
 
  ADC_SC3_REG(adcmap) |= ADC_SC3_CAL_MASK ;      // Start CAL
  while ( (ADC_SC1_REG(adcmap,A) & ADC_SC1_COCO_MASK ) == COCO_NOT ); // Wait calibration end
     
  if ((ADC_SC3_REG(adcmap)& ADC_SC3_CALF_MASK) == CALF_FAIL )
  { 
   return(1);    // Check for Calibration fail error and return
  }
  // Calculate plus-side calibration
  cal_var = 0x00;
 
  cal_var =  ADC_CLP0_REG(adcmap);
  cal_var += ADC_CLP1_REG(adcmap);
  cal_var += ADC_CLP2_REG(adcmap);
  cal_var += ADC_CLP3_REG(adcmap);
  cal_var += ADC_CLP4_REG(adcmap);
  cal_var += ADC_CLPS_REG(adcmap);

  cal_var = cal_var/2;
  cal_var |= 0x8000; // Set MSB

  ADC_PG_REG(adcmap) = ADC_PG_PG(cal_var);
 

  // Calculate minus-side calibration
  cal_var = 0x00;

  cal_var =  ADC_CLM0_REG(adcmap);
  cal_var += ADC_CLM1_REG(adcmap);
  cal_var += ADC_CLM2_REG(adcmap);
  cal_var += ADC_CLM3_REG(adcmap);
  cal_var += ADC_CLM4_REG(adcmap);
  cal_var += ADC_CLMS_REG(adcmap);

  cal_var = cal_var/2;

  cal_var |= 0x8000; // Set MSB

  ADC_MG_REG(adcmap) = ADC_MG_MG(cal_var);
 
  ADC_SC3_REG(adcmap) &= ~ADC_SC3_CAL_MASK ; /* Clear CAL bit */

  return(0);
}
 
如果我想在ADC中校准的话,我直接调用这个函数就可以吗?还需要做其他的工作吗?
 对的,这就自校准函数,调用就好了!!
 

 

好的,谢谢。
回复 支持 反对

使用道具 举报

该用户从未签到

12

主题

103

帖子

0

新手上路

Rank: 1

积分
173
最后登录
1970-1-1
发表于 2013-12-25 15:08:08 | 显示全部楼层

RE:KL25的ADC模块的校准功能,如何理解?

初始化的时候校准一次就可以吧
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2018-7-2 06:04
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    59

    主题

    2888

    帖子

    10

    金牌会员

    Rank: 6Rank: 6

    积分
    6020
    最后登录
    2020-9-28
    发表于 2014-1-21 10:57:36 | 显示全部楼层

    回复:KL25的ADC模块的校准功能,如何理解?(已解决)

    回复第 6 楼 于2013-12-25 15:08:08发表:
    初始化的时候校准一次就可以吧 

    校准功能是基于你的ADC功能配置,如时钟源选择,频率大小,参考电源等,进行的一种校准运算,生成对应的补偿参数,当然ADC采样操作,不一定需要校准功能的,校准工作只是为了让ADC转换更加精确而已。
    如果你初始化后配置完就不再改变,那只需要初始化时校准一次。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-18 22:38 , Processed in 0.097585 second(s), 27 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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