我目前正在研究温度控制器.
我有一个Temperature_PID()函数返回操纵变量(它是P,I和D项的总和),但我该如何处理这个输出?
温度由PWM控制,因此0%占空比=加热器关闭和100%占空比=加热器开启.
到目前为止我试过了
Duty_Cycle += Temperature_PID();
if(Duty_Cycle > 100) Duty_Cycle = 100;
else if(Duty_Cycle < 0) Duty_Cycle = 0;
Run Code Online (Sandbox Code Playgroud)
这对我不起作用,因为I术语基本上使得这个系统非常不稳定.想象一下,整合一个区域,添加另一个小数据点,再次整合该区域,并对它们求和.一遍又一遍.这意味着每个数据点使得该控制方案呈指数级恶化.
我想尝试的另一件事是
Duty_Cycle = Expected_Duty_Cycle + Temperature_PID();
Run Code Online (Sandbox Code Playgroud)
其中Expected_Duty_Cycle是控制器达到稳定点并且Temperature_PID()为0时应设置的温度.但是,这也不起作用,因为Expected_Duty_Cycle将始终根据加热器的条件而变化,例如不同的天气.
所以我的问题是我究竟如何处理PID的输出?我不明白如何根据PID输出分配占空比.理想情况下,这将保持100%的占空比,直到温度几乎达到设定点并开始下降到较低的占空比.但是使用我的第一种方法(我的增益设置为零)它只会在已经超调之后开始降低占空比.
这是我的第一篇文章.希望我找到答案.谢谢stackoverflow.
编辑:这是我的PID功能.
double TempCtrl_PID(PID_Data *pid)
{
Thermo_Data tc;
double error, pTerm, iTerm, dTerm;
Thermo_Read(CHIP_TC1, &tc);
pid->last_pv = pid->pv;
pid->pv = Thermo_Temperature(&tc);
error = pid->sp - pid->pv;
if(error/pid->sp < 0.1)
pid->err_sum += error;
pTerm = pid->kp * error;
iTerm = pid->ki * pid->err_sum;
dTerm = pid->kd * (pid->last_pv - pid->pv);
return pTerm …Run Code Online (Sandbox Code Playgroud) 只是想知道,有没有办法在Ruby中使用宏,以C的方式进行文本替换?
例如:
define ARGS 1,2
sum(ARGS) # returns 3
Run Code Online (Sandbox Code Playgroud)
编辑:更具体地说,我的问题看起来更像:
@button1 = FXButton.new(self, "Button 1",:opts => BUTTONPROPERTIES,:width => width, :height => height)
@button2 = FXButton.new(self, "Button 2",:opts => BUTTONPROPERTIES,:width => width, :height => height)
@button3 = FXButton.new(self, "Button 3",:opts => BUTTONPROPERTIES,:width => width, :height => height)
Run Code Online (Sandbox Code Playgroud)
理想情况下,我希望代码看起来像:
@button1 = FXButton.new(self, "Button 1", ALLBUTTONPROPERTIES)
@button2 = FXButton.new(self, "Button 2", ALLBUTTONPROPERTIES)
@button3 = FXButton.new(self, "Button 3", ALLBUTTONPROPERTIES)
Run Code Online (Sandbox Code Playgroud)
注意如果我将它们设置为某个预定值,我将如何将"width"和"height"变量传递给FXButton类的初始化.是否有某种代码替换可以解决这个问题?