在线时间23 小时
UID2001525
注册时间2013-4-15
NXP金币0
该用户从未签到
中级会员
 
- 积分
- 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. |
|