用的ai8g1k08a 10位的adc ,ntc用的 B3950 10k
电路是 VCC3.3V-10K固定电阻,NTC -GND P55脚在NTC和10k固定电阻中间
温度不管怎么降,只能到20°左右.. 用打火机烧也只能到40°,, 环境温度26°,和当前值差不多
因为我用的10位adc, 冲哥教程里用的12位的.我也把4096改成1024了
程序如下.大佬帮看看哪里出问题了.
- void AdcSetRate(void) //50KSPS@11.0592MHz
- {
- ADCCFG &= ~0x0f;
- ADCCFG |= 0x02; //SPEED(2)
- ADCTIM = 0x35; //CSSETUP(0), CSHOLD(1), SMPDUTY(21)
- }
-
-
-
- void ADC_Init(void)
- {
-
-
-
- //1.初始化IO为高祖输入 P55高阻
- P5M0 &= ~0x20; P5M1 |= 0x20;
-
- //2.初始化ADC速度
- AdcSetRate();
-
- //3.对齐模式
- ADCCFG |= 0x20;
-
- //4.打开ADC电源
- ADC_CONTR |= 0x80; //ADC_POWER = 1;
- }
-
- u16 ADC_Read(u8 no)
- {
- u16 adcval = 0;
- ADC_CONTR &= 0Xf0; //清空低四位
- ADC_CONTR |= no;
-
- ADC_CONTR |= 0x40; //ADC_START = 1; //启动ADC转化
- _nop_();
- _nop_();
- while(!(ADC_CONTR & 0x20)); //while(!ADC_FLAG); //等待采集完成
- ADC_CONTR &= ~0x20; //ADC_FLAG = 0;
-
- adcval = (((u16)ADC_RES) << 8) + (ADC_RESL); //获取到最终的ADC数值
-
- return adcval;
- }
-
-
- u16 code Temp_Tab[]=
- {
- 140 , //-40
- 149 ,
- 159 ,
- 168 ,
- 178 ,
- 188 ,
- 199 ,
- 210 ,
- 222 ,
- 233 ,
- 246 ,
- 259 ,
- 272 ,
- 286 ,
- 301 ,
- 317 ,
- 333 ,
- 349 ,
- 367 ,
- 385 ,
- 403 ,
- 423 ,
- 443 ,
- 464 ,
- 486 ,
- 509 ,
- 533 ,
- 558 ,
- 583 ,
- 610 ,
- 638 ,
- 667 ,
- 696 ,
- 727 ,
- 758 ,
- 791 ,
- 824 ,
- 858 ,
- 893 ,
- 929 ,
- 965 ,
- 1003,
- 1041,
- 1080,
- 1119,
- 1160,
- 1201,
- 1243,
- 1285,
- 1328,
- 1371,
- 1414,
- 1459,
- 1503,
- 1548,
- 1593,
- 1638,
- 1684,
- 1730,
- 1775,
- 1821,
- 1867,
- 1912,
- 1958,
- 2003,
- 2048,
- 2093,
- 2137,
- 2182,
- 2225,
- 2269,
- 2312,
- 2354,
- 2397,
- 2438,
- 2479,
- 2519,
- 2559,
- 2598,
- 2637,
- 2675,
- 2712,
- 2748,
- 2784,
- 2819,
- 2853,
- 2887,
- 2920,
- 2952,
- 2984,
- 3014,
- 3044,
- 3073,
- 3102,
- 3130,
- 3157,
- 3183,
- 3209,
- 3234,
- 3259,
- 3283,
- 3306,
- 3328,
- 3351,
- 3372,
- 3393,
- 3413,
- 3432,
- 3452,
- 3470,
- 3488,
- 3506,
- 3523,
- 3539,
- 3555,
- 3571,
- 3586,
- 3601,
- 3615,
- 3628,
- 3642,
- 3655,
- 3667,
- 3679,
- 3691,
- 3702,
- 3714,
- 3724,
- 3735,
- 3745,
- 3754,
- 3764,
- 3773,
- 3782,
- 3791,
- 3799,
- 3807,
- 3815,
- 3822,
- 3830,
- 3837,
- 3844,
- 3850,
- 3857,
- 3863,
- 3869,
- 3875,
- 3881,
- 3887,
- 3892,
- 3897,
- 3902,
- 3907,
- 3912,
- 3917,
- 3921,
- 3926,
- 3930,
- 3934,
- 3938,
- 3942, //120
- };
-
-
- u16 Temp_Cal(u16 adc) //返回结果是放大10背的数值16.9*10 = 169
- {
- u8 j = 0;
- u16 k = 0;
- u16 min; //当前的位置
- u16 max; //当前最大的位置
- u16 i; //温度
-
- adc = 1024 - adc; //得到当前的adc数值 4096 12位 1024 10位
-
- if( adc < Temp_Tab[0] ) //温度最小值检测
- return 0xfffe;
- if( adc > Temp_Tab[160] ) //温度最大值检测
- return 0xfffF;
-
- min = 0;
- max = 160;
-
- for( j=0;j<5;j++ ) //实现五次二分法查询
- {
- k = (min + max)/2;
- if( adc <= Temp_Tab[k] )
- max = k;
- else
- min = k;
- }
-
- if( adc == Temp_Tab[min] )
- i = min *10; //(20*10 - 400)/10 = -20.0
- else if( adc == Temp_Tab[max] )
- i = max * 10;
- else //50 -51之间
- {
- while(min <= max )
- {
- min++;
- if( Temp_Tab[min] == adc )
- {
- i = min * 10;
- break;
- }
- else if( adc < Temp_Tab[min] ) //超过这一档的温度的adc
- {
- min --;
- i = Temp_Tab[min]; //上一档的adc数值记下来
- j = Temp_Tab[min+1] -Temp_Tab[min] ;//这两档之间的差值 2-8
- j = ( adc - i )*10/j;
- i = min*10+j;
- break;
- }
- }
- }
- return i;
- }
-
- void main()
- {
- u16 tempwfdu;
-
- sys_init();
-
- while(1)
- {
- delayms(500);
- tempwfdu = Temp_Cal(ADC_Read(5));
-
- printf("Temp_Cal= %u \r\n",tempwfdu);
-
- }
- }
复制代码
|