2

我目前使用以下函数来计算每个发生的温度读数的移动平均值200ms

uint16_t ntc_average(uint16_t adcdata)
{ 

    static uint8_t      first = 1;
    static uint16_t t1,t2,t3,t4,t5;

    if(first == 1)
    {
        first = 0;
        t1 = t2 = t3 = t4 = t5 = adcdata;
    }

    t5 = t4;
    t4 = t3;
    t3 = t2;
    t2 = t1;
    t1 = adcdata;
    adcdata = (t1+t2+t3+t4+t5)/5;

    return(adcdata);
}

但是,5 个点是不够的,我可能需要更长的缓冲才能更平滑。例如,每 10-20 个读数一次或两次,该值可能会向上或向下下降一个点,我需要对其进行平滑处理。增加 tn 变量似乎很难看……我想我可能需要 t1-t50。

谁能建议C我可以用来平滑温度读数的另一个功能?请注意,这些值是无符号整数而不是浮点数。

4

2 回答 2

4

您可以在不进行算术平均的情况下进行平滑处理。例如,与其丢弃从移动窗口中掉出的特定样本,不如在每次迭代中丢弃平均值本身。

newAverage = (oldAverage * (windowSize - 1) + newSample) / windowSize;

它可能对您的系统足够好,也可能不够好,但值得一试。

于 2012-12-21T21:09:22.127 回答
1

为此通常使用一个简单的过滤器:

ave = ave * (1-a) + samp * a;

其中a是 0.0 到 1.0 之间的一个小常数


在 s0.15 定点:

int32 bigAverage; 
int16 ave;
int16 sample;
int16 alpha = 32768L*(0.1) //your constant here
int16 oneLessAlpha = 32768L-alpha;

//... in loop ...
bigAverage = (bigAverage>>15)*oneLessAlpha;
bigAverage += sample*alpha;
ave = bigAverage>>15;

您在很长一段时间内进行累积以保持更好的精度。

于 2012-12-21T21:14:32.743 回答