2016-02-15 4 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, но очень плохо с метрологической точки зрения. Вы должны рассмотреть некоторую обусловленность вашего сигнала (в данном случае температуру), чтобы вытащить какие-либо всплески.

Конечно, вы можете добавить букву для формирования сигнала. Для (легкий), например смотреть на Simple Moving насчитайте: https://en.wikipedia.org/wiki/Moving_average

Если вы хотите контролировать скорость вращения вентилятора «правильный путь» вы должны рассмотреть немного узнать о ПИД-регулятора: 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, я знаю ПИД-регуляторы достаточно хорошо, но мой единственный опыт использования их использовал MATLAB. Я никогда не писал код на C++! Я посмотрю на это сейчас :) – FrankWhite

+0

Есть ли шанс, что вы могли бы добавить комментарии к этому коду, пожалуйста? – FrankWhite

+0

Где m_setpoint delcared? – FrankWhite

Смежные вопросы