优化代码达成当set大于0.5时OUT = fuzzy(e, ec); 当set小于0.5时out=set的目的,代码如下:int speed_pid() { int e = -1,ec = -2.6; static PID pid= {0.02, 0.3, 0}; //赋予初值 static int sumE = 0; //累加偏差 static int lastE = 0; PID OUT = {0, 0, 0}; e = set - DATE; //目标值-实际值 ec = e - lastE; //误差变化率 sumE += e; lastE = e; OUT = fuzzy(e, ec); //模糊控制调整 return (pid.Kp+OUT.Kp)*e + (pid.Kd+OUT.Kd)*ec + (pid.Ki+OUT.Ki)*sumE; }
时间: 2024-02-06 07:04:00 浏览: 21
您提供的代码并没有达成当set大于0.5时OUT = fuzzy(e, ec); 当set小于0.5时out=set的目的。
如果要实现该目的,可以在计算OUT之前加上一个判断语句,如下所示:
```c++
if (set > 0.5) {
OUT = fuzzy(e, ec);
} else {
OUT.Kp = OUT.Ki = OUT.Kd = 0; // OUT为0向量
}
```
这样,当set大于0.5时,使用模糊控制调整OUT;当set小于等于0.5时,将OUT置为0向量,即OUT.Kp = OUT.Ki = OUT.Kd = 0。
另外,建议将参数和变量名改为更具有意义的名称,以增加代码可读性。
相关问题
优化代码,当set大于0.5时OUT = fuzzy(e, ec); 当set小于0.5时out=set
下面是一个优化后的代码,实现了当 set 大于 0.5 时使用模糊控制算法计算 OUT,当 set 小于等于 0.5 时 OUT 直接等于 set。
```
void Display_1602(float set, float e, float ec) {
float out;
if (set > 0.5) {
out = fuzzy(e, ec);
} else {
out = set;
}
//设置电压
write_com(0x80+6);
write_data(0x30+(int)(set*100)/100);
write_data('.');
write_data(0x30+(int)(set*100)%100/10);
write_data(0x30+(int)(set*100)%10);
//时时电压
write_com(0x80+0x40+6);
write_data(0x30+(int)(out*100)/100);
write_data('.');
write_data(0x30+(int)(out*100)%100/10);
write_data(0x30+(int)(out*100)%10);
}
```
在这段代码中,首先定义了一个变量 out,用于存储输出的值。如果 set 大于 0.5,则调用 fuzzy() 函数计算 out,否则直接将 out 设为 set。
接着,代码使用 write_com() 和 write_data() 函数将电压值和时时电压值分别输出到显示屏上。在输出电压值时,代码使用了强制类型转换将浮点数转换为整数,然后再将整数转换为字符输出。这样可以避免浮点数运算时带来的误差。
总的来说,这段代码实现了在 LCD1602 显示屏上显示电压值和时时电压值,并且优化了代码结构,提高了代码的可读性和可维护性。
不改变语法更改代码使其达到set小于5时out=set的效果,代码如下: if (set > 5) { OUT = fuzzy(e, ec); return (pid.Kp+OUT.Kp)*e + (pid.Kd+OUT.Kd)*ec + (pid.Ki+OUT.Ki)*sumE; } else { OUT.Kp = OUT.Ki = OUT.Kd = 0; // OUT为0向量 }
要达到 `set` 小于 5 时 `OUT` 等于 `set` 的效果,可以将 `else` 分支中的赋值语句改为将 `OUT` 赋值为 `(set, set, set)`,即:
```
OUT = {set, set, set};
```
这样,当 `set` 小于 5 时,`OUT` 的值就被设置为 `(set, set, set)`,等效于输出 `set` 的值了。完整代码如下:
```
if (set > 5) {
OUT = fuzzy(e, ec);
return (pid.Kp + OUT.Kp) * e + (pid.Kd + OUT.Kd) * ec + (pid.Ki + OUT.Ki) * sumE;
} else {
OUT = {set, set, set}; // OUT为(set, set, set)向量
}
```
这种方法不改变代码原有的语法结构,只是在 `else` 分支中使用了另一种方式对 `OUT` 赋值,达到了修改代码的效果。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)