查看: 2362|回复: 1

[求助] KL46z 内部温度传感器问题咨询

[复制链接]

该用户从未签到

4

主题

37

帖子

0

新手上路

Rank: 1

积分
48
最后登录
1970-1-1
发表于 2014-3-24 08:28:12 | 显示全部楼层 |阅读模式
 各位大神,我现在使用KL46z开发板,用内部温度传感器采集温度,按照例程配置了ADC,可是在采集时候ADC0_SC1B寄存器COCO
 
状态位怎么都不置高。我看资料里面说ADC0_SC1B寄存器要在硬件触发情况下才能使用,但是我配置了硬件触发之后,
 
ADC0_SC1A寄存器的COCO怎么都不置高了,纠结啊!大家帮忙分析下呗,谢谢啦
void adc_Init(void) 
{
    PMC_REGSC |= PMC_REGSC_BGBE_MASK;
  
  SIM_SCGC5 |= SIM_SCGC5_PORTE_MASK;                                  // 开启PE GPIO时钟              
  
  PORTE_PCR18 = PORT_PCR_MUX(0);                                      // 开启PE0管脚模拟功能ADC通道8  
  PORTE_PCR20 = PORT_PCR_MUX(0);
  
  SIM_SCGC6 |= SIM_SCGC6_ADC0_MASK;                                   // 开启ADC时钟                
 
  ADC0_CFG1 = ADC_CFG1_ADLSMP_MASK | 
                 ADC_CFG1_MODE(3) | 
                   ADC_CFG1_ADICLK(0);
  ADC0_SC2 |= ADC_SC2_ADTRG_MASK | ADC_SC2_REFSEL(0);                                      // 选择电源参考源    
 
           
  ADC0_SC3 = (ADC_SC3_ADCO_MASK | 
                ADC_SC3_AVGE_MASK | 
                ADC_SC3_AVGS(0x02));                                    // AD持续转换,平均使能,16次采样取平均
  
  ADC0_SC1A = ADC_SC1_ADCH(27);                                       // 选择27通道 BandGap                     
 
         
  ADC0_SC1B = ADC_SC1_ADCH(26);                                       // 选择26通道 Temp sensor     
}
uint16 getTempVal(void)
{
  ADC0_SC1A = ADC_SC1_ADCH(27);                                       // 选择27通道 BandGap                     
 
         
  ADC0_SC1B = ADC_SC1_ADCH(26);       
  
  while(( ADC0_SC1A & ADC_SC1_COCO_MASK ) != ADC_SC1_COCO_MASK);
  result0A = ADC0_RA;
  
  while(( ADC0_SC1B & ADC_SC1_COCO_MASK ) != ADC_SC1_COCO_MASK);
  result0B = ADC0_RB;
  Temperature = (uint16)ADC_Calculate(result0A, result0B);
  return   Temperature;
}
还有一个函数
float ADC_Calculate(uint16 result_A,uint16 result_B)
{
  float Vdd_Cal,ADCR_Temp25,ADCR_100m;
  float i;
  float Temp;
  
  Vdd_Cal=655350/result_A;
  ADCR_Temp25=471197/Vdd_Cal;
  ADCR_100m=112393/Vdd_Cal;
  Temp=(float)((result_B-ADCR_Temp25)*100/ADCR_100m);
  i=(float)(25-Temp);
  return (uint16)i;
}
我知道答案 目前已有0人回答
回复

使用道具 举报

该用户从未签到

10

主题

459

帖子

0

中级会员

Rank: 3Rank: 3

积分
303
最后登录
2024-10-24
发表于 2014-3-24 10:37:42 | 显示全部楼层

回复:KL46z 内部温度传感器问题咨询

 各位大神,我现在使用KL46z开发板,用内部温度传感器采集温度,按照例程配置了ADC,可是在采集时候ADC0_SC1B寄存器COCO
 
状态位怎么都不置高。我看资料里面说ADC0_SC1B寄存器要在硬件触发情况下才能使用,但是我配置了硬件触发之后,
 
ADC0_SC1A寄存器的COCO怎么都不置高了,纠结啊!大家帮忙分析下呗,谢谢啦
void adc_Init(void) 
{
    PMC_REGSC |= PMC_REGSC_BGBE_MASK;
  
  SIM_SCGC5 |= SIM_SCGC5_PORTE_MASK;                                  // 开启PE GPIO时钟              
  
  PORTE_PCR18 = PORT_PCR_MUX(0);                                      // 开启PE0管脚模拟功能ADC通道8  
  PORTE_PCR20 = PORT_PCR_MUX(0);
  
  SIM_SCGC6 |= SIM_SCGC6_ADC0_MASK;                                   // 开启ADC时钟                
 
  ADC0_CFG1 = ADC_CFG1_ADLSMP_MASK | 
                 ADC_CFG1_MODE(3) | 
                   ADC_CFG1_ADICLK(0);
  ADC0_SC2 |= ADC_SC2_ADTRG_MASK | ADC_SC2_REFSEL(0);                                      // 选择电源参考源    
            
  ADC0_SC3 = (ADC_SC3_ADCO_MASK | 
                ADC_SC3_AVGE_MASK | 
                ADC_SC3_AVGS(0x02));                                    // AD持续转换,平均使能,16次采样取平均
  
  ADC0_SC1A = ADC_SC1_ADCH(27);                                       // 选择27通道 BandGap                     
        
  ADC0_SC1B = ADC_SC1_ADCH(26);                                       // 选择26通道 Temp sensor     
 
}
uint16 getTempVal(void)
{
  ADC0_SC1A = ADC_SC1_ADCH(27);                                       // 选择27通道 BandGap                     
 
         
  ADC0_SC1B = ADC_SC1_ADCH(26);       
  
  while(( ADC0_SC1A & ADC_SC1_COCO_MASK ) != ADC_SC1_COCO_MASK);
  result0A = ADC0_RA;
  
  while(( ADC0_SC1B & ADC_SC1_COCO_MASK ) != ADC_SC1_COCO_MASK);
  result0B = ADC0_RB;
  Temperature = (uint16)ADC_Calculate(result0A, result0B);
  return   Temperature;
}
还有一个函数
float ADC_Calculate(uint16 result_A,uint16 result_B)
{
  float Vdd_Cal,ADCR_Temp25,ADCR_100m;
  float i;
  float Temp;
  
  Vdd_Cal=655350/result_A;
  ADCR_Temp25=471197/Vdd_Cal;
  ADCR_100m=112393/Vdd_Cal;
  Temp=(float)((result_B-ADCR_Temp25)*100/ADCR_100m);
  i=(float)(25-Temp);
  return (uint16)i;
}
 
KL46内部包含一个ADC模块,双路采样的方法分两种:采用Back to back方法和通道轮询方法,对于第一种要用到ADC0_SC1A和DC0_SC1B,触发方式必须是硬件PDB,使用PDB的两个通道分别预触发两个AD通道。另外一种,只需要用到ADC0_SC1A,顺序配置为不同的通道ADC_SC1_ADCH(N),可以采用软件触发和硬件触发。你的代码中看起来采用的应该是第一种方法,所以需要在代码中配置ADC为HW触发,并配置PDB预触发的值。这一点你可以参看https://www.eefocus.com/bbs/article_1280_557533.html贴中的Topic 1.
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2025-7-19 05:12 , Processed in 0.098660 second(s), 22 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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