2016-02-15 47 views
-2

我每隔1秒鐘讀取一次溫度值(此速率並不重要)。我想測量這個溫度,以便如果它開始迅速上升超過一定的閾值,我執行一個動作。如何測量變量的上升率

如果溫度上升超過30度(無論如何),我會增加風扇轉速。

我想我必須做一些事情,比如將舊溫度設置爲新溫度,然後每次循環將舊溫度設置爲發動機的當前溫度。但我不確定是否需要使用數組作爲引擎臨時文件。

+1

什麼是1秒/分鐘? – CinCout

+2

@HappyCoder:「這個速度並不重要」。 「好歹」。 –

+1

這取決於您的數據的性質。什麼是噪音水平?與此相關的是「快速上漲」。在計算增加率之前,您很可能想要平滑數據以減少噪音。這將需要你存儲一些歷史記錄。 – Christoph

回答

0

當然你也可以只存儲一箇舊樣品,然後檢查差像:

bool isHot(int sample) { 
    static int oldSample = sample; 
    return ((sample > 30) || (sample - oldSample > threshold)); 
} 

這是從視圖C點OK,但從測量點非常糟糕。你應該考慮對信號進行一些調節(在這種情況下是溫度)以消除任何尖峯。

當然,你可以添加信號調節信。對於(容易)的例子來看一下簡單移動Avarage:https://en.wikipedia.org/wiki/Moving_average

如果你想控制風扇轉速「正確的方式」,你應該考慮學習一些關於PID控制器:https://en.wikipedia.org/wiki/PID_controller

簡單的離散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; 
} 
+0

感謝Konserw,我很瞭解PID控制器,但是我唯一的經驗是使用MATLAB,我從來沒有用C++寫過代碼!我會看看現在:) – FrankWhite

+0

有沒有機會給該代碼添加一些評論? – FrankWhite

+0

m_setpoint delcared在哪裏? – FrankWhite