前言
单片机在实际读取AD值时,读到的值是不稳定的,在不断的变化,如果不经过处理,直接使用,是很难获得其准确的值,因此我们需要对其进行消抖滤波处理。
滤波
一般来说AD值的不稳,我们可以将一段时间读取到的数值取平均值,为了防止数值突变的影响,我们可以减去最大和最小值。
我们10ms读取一次AD值,取10次AD值的平均值即可。
static u16_t s_wMaxAdVal = 0; // AD最大值
static u16_t s_wMinAdVal = 1023; // AD最小值
static u16_t s_wSumAdVal = 0; // AD和
static u16_t s_wAdFiltVal = 0; // 滤波后的值
static u8_t s_nAdCnt = 0;
void AdFilter(u16_t wAdData)
{
if (wAdData > s_wMaxAdVal)
{
wMaxAdVal = wAdData;
}
if (wAdData < s_wMinAdVal)
{
s_wMinAdVal = wAdData;
}
s_nAdCnt++;
if (s_nAdCnt <= 10)
{
s_wSumAdVal += wAdData;
}
else
{
s_nAdCnt = 0;
s_wSumAdVal -= (s_wMaxAdVal + s_wMinAdVal);
s_wAdFiltVal = s_wSumAdVal >> 3; // 除以8
/* 重新计算最大最小值 */
s_wMaxAdVal = 0;
s_wMinAdVal = 1023;
s_wSumAdVal = 0;
}
}
该函数中s_wAdFiltVal的值即是滤波后的AD值。
温度转换
通常我们可以使用热敏电阻来检测温度,但是热敏电阻的阻值和温度的关系一般不可以通过数学表达式来描述,而是根据热敏电阻的规格书中阻值和温度的关系表来查找。
因此我们需要在程序中编写查找与AD值对应的温度。
硬件简述
简单的分压计算,通过温度与阻值的关系表,计算出温度与AD值关系表。
下面列出一个计算好的关系表:
#define RT_NUM 160
#define MINTEMP 0
const u16_t wRTtable[RT_NUM] =
{
/* 0 1 2 3 4 5 6 7