在上几篇文章中建立了ADRC算法的仿真,后续肯定是要在实物上进行验证,在编写C代码的过程中突发奇想,如果我可以用C语言来模拟simulink的传递函数,不就可以验证代码的准确性了,相当于不用在实物上实际测试就可以检查算法代码的正确性。说干就干,直接开撸验证。
首先必然是需要先将算法代码给编写好,之后就可以模拟simulink中的积分环节。假设我们的控制对象为:G = 1 / (s + 0.5),那么我们就可以根据此传递函数转化为微分方程来进行C代码的编写。
G = 1 / (s + 0.5) ==> x1_dot = -0.5*x1 + u;y = x1;
整个工程我只分了2个模块,5个文件:
这里对于传递函数来说,输入的话,也就是控制量u,输出的话,就系统状态x1。之后就会遇到积分的问题,关于积分的方法的话,有许多种,欧拉法进行积分,或者龙格库塔进行积分,我都进行了测试,因为我这里没有增加干扰,所以效果看不大出来,理论上是龙格库塔积分会效果更好一些:
上述代码的话,将控制 u 传进来,经过运算就会将系统输出 y 传出去。
main.c的话,也比较简单,也就是调用ADRC算法代码,之后调用sFun函数来进行模拟:
之后我们可以看一下结果:
我打印的时候只打印了四个:目标,控制量,实际状态,观测器ESO的输出状态,这里需要用逗号分割开,不进行分割的话,后续不好在excel中查看。之后我们可以将数据复制过来,新建一个excel表格,然后复制:
此时数据全在一列下,我们需要将数据分割开,点击数据->分列:
选择分隔符号:
选择“逗号”:
之后就可以看到已经分成了四列,之后就可以查看波形图了:
我们可以将目标与实际系统输出波形图打印出来:
也可以将实际跟随与观测器的输出打印出来看看:
我们可以将原matlab的仿真打印出来对比一下,参数,采样时间,观测器参数,控制器参数,仿真时间我都设置得跟C代码一样,C代码中的循环次数是2000次,时间周期T写的是0.004秒,所以总的仿真时间应该设置成8秒:
可以看出C代码中的响应与simulink仿真没有大的差别,以后就可以愉快的用这种方式来验证C代码啦!