查看: 2708|回复: 2

[分享] KL25 AD转换结果不对

[复制链接]

该用户从未签到

37

主题

132

帖子

0

新手上路

Rank: 1

积分
40
最后登录
1970-1-1
发表于 2013-9-12 20:51:24 | 显示全部楼层 |阅读模式
 使用KL25 内部的AD模块,但转换出来的结果总是不对,乱七八糟的值,求指教!
 
void ADC0_InitCfg(void)
{
  SIM_SCGC6 |=  SIM_SCGC6_ADC0_MASK;                 
  ADC0_CFG1 = ADC_CFG1_ADIV(3)                         
            | ADC_CFG1_ADLSMP_MASK                 
            | ADC_CFG1_MODE(3)                          
            | ADC_CFG1_ADICLK(0);                   
 
  ADC0_CFG2 = ADC_CFG2_ADHSC_MASK                    
            | ADC_CFG2_ADLSTS(0);                    
  ADC0_SC3 = ADC_SC3_AVGE_MASK
           | ADC_SC3_AVGS(0)
           | ADC_SC3_ADCO_MASK;
  ADC0_SC1A = ADC_SC1_ADCH(31) & (~ADC_SC1_AIEN_MASK);                        
  ADC0_SC1B = ADC_SC1_ADCH(31) & (~ADC_SC1_AIEN_MASK);
}
 
unsigned char ADC0_Calibration(void)
{
  unsigned short cal_var;
  ADC0_SC2 &=  ~ADC_SC2_ADTRG_MASK ;                            // Enable Software Conversion Trigger for Calibration Process    - ADC0_SC2 = ADC0_SC2 | ADC_SC2_ADTRGW(0);   
  ADC0_SC3 &= ( ~ADC_SC3_ADCO_MASK & ~ADC_SC3_AVGS_MASK );      // set single conversion, clear avgs bitfield for next writing
  ADC0_SC3 |= ( ADC_SC3_AVGE_MASK | ADC_SC3_AVGS(3) );    // Turn averaging ON and set at max value ( 32 )
  ADC0_SC3 = ADC_SC3_CAL_MASK ;                                // Start CAL
  while ( !(ADC0_SC1A & ADC_SC1_COCO_MASK ) );                  // Wait calibration end
  if ((ADC0_SC3 & ADC_SC3_CALF_MASK) == ADC_SC3_CALF_MASK )
  {  
   return 1;                                                   // Check for Calibration fail error and return 
  }
  // Calculate plus-side calibration
  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);
  // Calculate minus-side calibration
  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 ; /* Clear CAL bit */
  return 0;
}
 
 
int main(void)
{
  float result;
  unsigned char i;
  unsigned char m,n;
  
  ADC0_InitCfg();
  ADC0_Calibration();
  ADC0_InitCfg();
  
  ADC0_SC1A = ADC_SC1_ADCH(8) | ADC_SC1_AIEN_MASK;                      
  
  //ADC0_SC1B = ADC_SC1_ADCH(8) | ADC_SC1_AIEN_MASK;
  
  PITDelay_ms(1);                           
  
  while(1)
  {
    if( (ADC0_SC1A & ADC_SC1_COCO_MASK) )
    {
      result = ADC0_RA;
      result = ((result * 33) / 655360) * 100;
      m = (unsigned int)(result) / 100;
      n = (unsigned int)(result) % 100;
      printf("%d.%dV \n",m,n);
    }

    for(i=0;i
回复

使用道具 举报

该用户从未签到

35

主题

508

帖子

0

金牌会员

Rank: 6Rank: 6

积分
2167
最后登录
1970-1-1
发表于 2013-9-13 12:07:22 | 显示全部楼层

RE:KL25 AD转换结果不对

你可以参考一下TWR-KL25Z板子的电路图。除了软件的问题还有硬件电路的原因。
软件你可以参考KL25例程:
http://cache.freescale.com/files/32bit/software/KL25_SC.exe
回复 支持 反对

使用道具 举报

该用户从未签到

37

主题

132

帖子

0

新手上路

Rank: 1

积分
40
最后登录
1970-1-1
 楼主| 发表于 2013-9-13 15:00:58 | 显示全部楼层

回复:KL25 AD转换结果不对

回复第 2 楼 于2013-09-13 12:07:22发表:
你可以参考一下TWR-KL25Z板子的电路图。除了软件的问题还有硬件电路的原因。
软件你可以参考KL25例程:
http://cache.freescale.com/files/32bit/software/KL25_SC.exe
 
我是使用B0口作为AD输入的,再加上一个可调节电源,有什么问题吗?
 
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2025-8-6 07:54 , Processed in 0.082295 second(s), 21 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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