在线时间3 小时
UID2025368
注册时间2013-7-14
NXP金币0
该用户从未签到
新手上路
- 积分
- 40
- 最后登录
- 1970-1-1
|
被KL25内部的ADC模块困扰很久了,它总是不能读出正确的数值,跟例程对比了很多次了也没有发现那里写的有问题。求FAE帮忙,不要跟我给什么例程的链接,谢谢啦!代码见附件
//============================================================================//
//函数说明:ADC 初始化配置
//输入:
//输出:
//============================================================================//
void ADC0_InitCfg(void)
{
SIM_SCGC5 |= SIM_SCGC5_PORTB_MASK; // enable PORTB clock
SIM_SCGC6 |= SIM_SCGC6_ADC0_MASK; // enable ADC0 clock
PORTB_PCR0 = PORT_PCR_MUX(0);
ADC0_CFG1 = ADC_CFG1_ADIV(3) // clock divide ratio is 8
| ADC_CFG1_ADLSMP_MASK // long sample time
| ADC_CFG1_MODE(3) // based on DIFF,single-ended 16bit/differential 16bit conversion
| ADC_CFG1_ADICLK(0); // Bus clock as ADC0 clock source
ADC0_CFG2 = ADC_CFG2_ADLSTS(0); // long sample time select :20 extra ADCK cycles,24 ADCK cycles total
ADC0_SC3 = ADC_SC3_AVGE_MASK // hardware average enable
| ADC_SC3_AVGS(3) // 32 samples average
| ADC_SC3_ADCO_MASK; // continuous conversion
ADC0_SC1A = ADC_SC1_ADCH(31) & (~ADC_SC1_AIEN_MASK); // close ADC
ADC0_SC1B = ADC_SC1_ADCH(31) & (~ADC_SC1_AIEN_MASK);
}
//============================================================================//
//函数说明:ADC 校正
//输入:
//输出:
//============================================================================//
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); // a little delay for decrease noise effect
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
|
|