??STM32F4的AD采样结果为12位,即采样最大值为4096。参考电压为3.3V,所以3.3V对应4096。.3V只是理想状态,实际上可能有轻微的偏差。假设单片机AD引脚电压采集为x,实际单片机的参考电压为z伏,读取AD值与x的对应关系如下: ??分析温度采集电路中电压值与电阻值的关系。 ??可以得出两个等式联立AD与电阻的关系: ??可以在程序中获得AD计算电阻值后,检查表格,根据电阻值计算温度值。 ??这里可以做一些优化。既然要查表,能不能干脆不算,把所有的计算工作都放在查表里? ??在一定温度下,将相应的电阻值带入公式,计算相应的温度AD值。我把零下30℃到150℃的 算出来,放在了数组中:
const u16 tempRes_buf[181] = {
3876, 3863, 3849, 3835, 3819, 3804, 3787, 3769, 3751, 3732, 3712, 3692, 3670, 3648, 3625, 3601, 3576, 3550, 3523, 3496, 3467, 3438, 3408, 3377, 3344, 3312, 3278, 3243, 3208, 3171, 3134, 3096, 3057, 3018, 2978, 2937, 2896, 2854, 2811, 2768, 2725, 2681, 2637, 2592, 2547, 2502, 2457, 2411, 2366
,
2320
,
2274
,
2229
,
2183
,
2138
,
2092
,
2048
,
2003
,
1958
,
1914
,
1871
,
1827
,
1784
,
1742
,
1700
,
1659
,
1618
,
1578
,
1538
,
1499
,
1461
,
1423
,
1386
,
1350
,
1314
,
1279
,
1245
,
1211
,
1179
,
1146
,
1115
,
1084
,
1054
,
1025
,
996
,
968
,
941
,
915
,
889
,
864
,
839
,
815
,
792
,
769
,
747
,
726
,
705
,
685
,
665
,
646
,
628
,
610
,
592
,
575
,
558
,
542
,
527
,
512
,
497
,
483
,
469
,
456
,
443
,
430
,
418
,
406
,
395
,
383
,
373
,
362
,
352
,
342
,
333
,
323
,
314
,
306
,
297
,
289
,
281
,
273
,
266
,
259
,
252
,
245
,
238
,
232
,
225
,
219
,
214
,
208
,
202
,
197
,
192
,
187
,
182
,
177
,
173
,
168
,
164
,
160
,
155
,
152
,
148
,
144
,
140
,
137
,
133
,
130
,
127
,
124
,
121
,
118
,
115
,
112
,
109
,
107
,
104
,
102
,
99
,
97
,
94
,
92
,
90
,
88
,
86
,
84
,
82
,
80
,
78
,
76
,
75
,
73
}
;
然后可以编写查表函数:
/** * @brief 通过查表法,根据AD值计算温度 * @param AD值 * @Note 温度范围是-30~150度 如果超过范围,返回32767 ℃。10K上拉,3950 10K热敏电阻 * @retval 温度值 */
short calcuTem(u16 ad_value)
{
short tempValue= 0x7fff;
if ((ad_value < 3877)&&(ad_value > 72))
{
for (short i = 0 ; i < 181 ; i++)
{
if (ad_value > tempRes_buf[i])
{
tempValue = i-30;
break;
}
}
}
//else err return 0x7fff
return tempValue;
}
主函数的打印语句也做相应修改:
while (1)
{
HAL_Delay(1000);
short tempA = calcuTem(ADC1_RANK1_AVG);
short tempB = calcuTem(ADC1_RANK2_AVG);
printf("采样次数: %d\n",ADC_CHANNEL_CNT/2);
printf("温度A的AD值是 %d ;温度是%d ℃\n ",ADC1_RANK1_AVG,tempA);
printf("温度B的AD值是 %d ;温度是%d ℃\n ",ADC1_RANK2_AVG,tempB);
}
附上源码