• 【控制原理】使用C语言模拟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代码啦!

  • 相关阅读:
    java毕业生设计学院学生论坛计算机源码+系统+mysql+调试部署+lw
    JS的优化技巧
    拆离褶皱(Detachment Fold)
    力扣数据库题
    蓝桥杯嵌入式STM32G431RBT6的学习(总大纲)(HAL库学习)板子介绍
    Unity VR 开发教程: Oculus 一体机开发 (一) 环境配置(基于 Oculus Integration v46)
    【保姆级】新机器部署RabbitMQ
    USB应用实战视频教程第3期:手把手玩转USB BULK方式下位机和QT6.4上位机开发(上篇)
    HTTP 介绍
    VIT quantization相关论文阅读
  • 原文地址:https://blog.csdn.net/a_xiaoning/article/details/124958103