在线时间3 小时
UID2025368
注册时间2013-7-14
NXP金币0
该用户从未签到
新手上路

- 积分
- 40
- 最后登录
- 1970-1-1
|
使用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
|
|