【控制原理】使用C语言模拟simulink算法仿真

本文介绍如何使用C语言模拟Simulink中的传递函数,以验证ADRC算法的准确性。通过将传递函数转化为微分方程并采用不同的积分方法,实现了与Simulink仿真的对比验证。

在上几篇文章中建立了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代码啦!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙猫略略略

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值