C++ 如何测量变量的增长率

C++ 如何测量变量的增长率,c++,loops,C++,Loops,我每1秒/分钟读取一个温度值(这个速率并不重要)。我想测量这个温度,如果它开始快速上升到某个临界值以上,我就执行一个动作 如果温度上升超过30度(无论如何),我会提高风扇转速 我想我必须做一些事情,比如将旧温度设置为新温度,然后每次循环时将旧温度设置为发动机的当前温度。但我不确定是否需要使用数组来表示发动机温度。当然,您可以只存储一个旧样本,然后检查差异,如: bool isHot(int sample) { static int oldSample = sample; retu

我每1秒/分钟读取一个温度值(这个速率并不重要)。我想测量这个温度,如果它开始快速上升到某个临界值以上,我就执行一个动作

如果温度上升超过30度(无论如何),我会提高风扇转速


我想我必须做一些事情,比如将旧温度设置为新温度,然后每次循环时将旧温度设置为发动机的当前温度。但我不确定是否需要使用数组来表示发动机温度。

当然,您可以只存储一个旧样本,然后检查差异,如:

bool isHot(int sample) {
    static int oldSample = sample;
    return ((sample > 30) || (sample - oldSample > threshold));
}
从C的角度看是可以的,但从计量学的角度看是非常糟糕的。你应该考虑一些信号的调节(在这种情况下,温度)来消除任何尖峰。< /P> 当然你可以在上面加上信号调理字母。有关(简单)示例,请参见简单移动平均值:

如果你想控制风扇速度“正确的方式”,你应该考虑学习PID控制器:

简单离散PID: PidController.h:

class PidController
{
public:
    PidController();
    double sim(double y);
    void UpdateParams(double kp, double ki, double kd);
    void setSP(double setPoint) { m_setPoint = setPoint; } //set current value of r(t)

private:
    double m_setPoint; //current value of r(t)
    double m_kp;
    double m_ki;
    double m_kd;
    double m_outPrev;
    double m_errPrev[2];
};
PidController.cpp

#include "PidController.h"

PidController::PidController():ControllerObject()
{
    m_errPrev[0] = 0;
    m_errPrev[1] = 0;
    m_outPrev = 0;
}
void PidController::UpdateParams(double kp, double ki, double kd)
{
    m_kp = kp;
    m_ki = ki;
    m_kd = kd;
}
//calculates PID output 
//y - sample of y(t)
//returns sample of u(t)
double PidController::sim(double y)
{
    double out; //u(t) sample
    double e = m_setPoint - y; //error
    out = m_outPrev + m_kp * (e - m_errPrev[0] + m_kd * (e - 2 * m_errPrev[0] + m_errPrev[1]) + m_ki * e);

    m_outPrev = out; //store previous output
    //store previous errors
    m_errPrev[1] = m_errPrev[0];
    m_errPrev[0] = e;

    return out;
}

1秒/分钟是多少?@HappyCoder:“这个速度并不重要”。“无论如何”。这取决于数据的性质。噪音水平是多少?与此相关的“快速增长”是什么。在计算增长率之前,您很可能希望平滑数据以减少噪声。就我所知,这是一个来自温度传感器的模拟输入。我没有想到noisem,所以谢谢你提到这一点!有没有可能创建一个不考虑噪音因素的简单程序,然后再将其合并?@FrankWhite“…如果它开始快速上升…”所以如果它没有快速上升,你不需要采取行动,只是让系统缓慢过热?如果它超过阈值,启动风扇,并将风扇速度与实际温度成比例地增加。谢谢Konserw,我知道PID控制器相当好,但是我使用它们的唯一经验是使用Matlab我从来没有在C++中编写过代码。我现在来看看:)有没有可能给代码添加一些注释呢?现在修复了缺失的m_设定点-它是从我复制的项目中的抽象ControllerClas继承的;)添加了一些注释,但当您查看时,大多数注释都是不言自明的