【任何电机可使用的七段式s曲线-----包括matlab代码和simulink仿真】

永磁同步电机七段式s曲线

  • 一、前言
  • 二、理论分析
  • 三、7段式s曲线加减速关系图
  • 四、matlab代码
    • 代码结果
  • 五、simulink七段式s曲线
    • 整体框图
    • simulink结果
    • s-function内嵌代码
  • 六、使用双闭环FOC控制-----simulink仿真示意

一、前言

S形加加速(T1)→>匀加速(T2)→减加速(T3)→>匀速(T4 )>加减速(T5)>匀减速(T6)-→>减减速(T7)

二、理论分析

1、这个是7阶段的加速度

在这里插入图片描述

加速度是𝑎max,J是加加速度,𝜏𝑘(𝑘 = 1,2,… ,7)是每个区间时间坐标,𝑡𝑘(k = 0,1,2… ,7)是每区间转折点时刻,𝑇𝑘(𝑘 = 1,2,…. ,7)是每个区间的连续工作时间;

2、这个是7阶段的速度

在这里插入图片描述

3、这个是7阶段的位置

在这里插入图片描述

三、7段式s曲线加减速关系图

在这里插入图片描述


四、matlab代码

% 定义参数

q0 = 0;
q1 = 200;
vmax =15;
amax = 10;
v0 = 0;
v1 = 0;
jmax = 10;
count = 0;

% 计算Ta、Td、Tj1、Tj2、Tv、alima、alimd等参数,他们就是时间点
if (vmax - v0) * jmax < amax^2
    if v0 > vmax
        Tj1 = 0;
        Ta = 0;
        alima = 0;
    else
        Tj1 = ((vmax - v0) / jmax)^0.5;
        Ta = 2 * Tj1;
        alima = Tj1 * jmax;
    end
else
    Tj1 = amax / jmax;
    Ta = Tj1 + (vmax - v0) / amax;
    alima = amax;
end

if (vmax - v1) * jmax < amax^2
    Tj2 = ((vmax - v1) / jmax)^0.5;
    Td = 2 * Tj2;
    alimd = Tj2 * jmax;
else
    Tj2 = amax / jmax;
    Td = Tj2 + (vmax - v1) / amax;
    alimd = amax;
end

Tv = (q1 - q0) / vmax - Ta / 2 * (1 + v0 / vmax) - Td / 2 * (1 + v1 / vmax);

% 动态调整参数,确保轨迹满足条件
if Tv <= 0
    Tv = 0;
    amax_org = amax;
    
    while Ta < 2 * Tj1 || Td < 2 * Tj2
        count = count + 1;
        amax = amax - amax_org * 0.1;
        alima = amax;
        alimd = amax;
        
        delta = (amax^4) / (jmax^2) + 2 * (v0^2 + v1^2) + amax * (4 * (q1 - q0) - 2 * amax / jmax * (v0 + v1));
        Tj1 = amax / jmax;
        Ta = (amax^2 / jmax - 2 * v0 + delta^0.5) / (2 * amax);
        Tj2 = amax / jmax;
        Td = (amax^2 / jmax - 2 * v1 + delta^0.5) / (2 * amax);
    end
end

% 计算轨迹
p = [];
vc = [];
ac = [];
jc = [];

if Tv > 0
    vlim = vmax;
    T = Tv + Ta + Td;
else
    Tv = 0;
    vlim = v0 + (Ta - Tj1) * alima;
    T = Tv + Ta + Td;
end

for t = 0:0.1:T
    if t >= 0 && t < Tj1
        % 段1:加加速度段
        q = q0 + v0 * t + jmax * t^3 / 6;
        p = [p q];
        v = v0 + jmax * t^2 / 2;
        vc = [vc v];
        a = jmax * t;
        ac = [ac a];
        jc = [jc jmax];
    elseif t >= Tj1 && t < (Ta - Tj1)
        % 段2:匀加速度段
        q = q0 + v0 * t + alima / 6 * (3 * t^2 - 3 * Tj1 * t + Tj1^2);
        p = [p q];
        v = v0 + alima * (t - Tj1 / 2);
        vc = [vc v];
        a = alima;
        ac = [ac a];
        jc = [jc 0];
    elseif t >= (Ta - Tj1) && t < Ta
        % 段3:减加速度段
        q = q0 + (vlim + v0) * Ta / 2 - vlim * (Ta - t) + jmax * (Ta - t)^3 / 6;
        p = [p q];
        v = vlim - jmax * (Ta - t)^2 / 2;
        vc = [vc v];
        a = jmax * (Ta - t);
        ac = [ac a];
        jc = [jc -jmax];
    elseif t >= Ta && t < (Ta + Tv)
        % 段4:匀速段
        q = q0 + (vlim + v0) * Ta / 2 + vlim * (t - Ta);
        p = [p q];
        v = vlim;
        vc = [vc v];
        a = 0;
        ac = [ac 0];
        jc = [jc 0];
    elseif t >= (T - Td) && t < (T - Td + Tj2)
        % 段5:加减速度段
        q = q1 - (vlim + v1) * Td / 2 + vlim * (t - T + Td) - jmax * (t - T + Td)^3 / 6;
        p = [p q];
        v = vlim - jmax * (t - T + Td)^2 / 2;
        vc = [vc v];
        a = -jmax * (t - T + Td);
        ac = [ac a];
        jc = [jc -jmax];
    elseif t >= (T - Td + Tj2) && t < (T - Tj2)
        % 段6:匀减速度段
        q = q1 - (vlim + v1) * Td / 2 + vlim * (t - T + Td) - alimd / 6 * (3 * (t - T + Td)^2 - 3 * Tj2 * (t - T + Td) + Tj2^2);
        p = [p q];
        v = vlim - alimd * (t - T + Td - Tj2 / 2);
        vc = [vc v];
        a = -alimd;
        ac = [ac a];
        jc = [jc 0];
    elseif t >= (T - Tj2) && t < T
        % 段7:减减速度段
        q = q1 - v1 * (T - t) - jmax * (T - t)^3 / 6;
        p = [p q];
        v = v1 + jmax * (T - t)^2 / 2;
        vc = [vc v];
        a = -jmax * (T - t);
        ac = [ac a];
        jc = [jc jmax];
    end
end

% 绘制位置曲线
subplot(4, 1, 1);
plot(0:0.1:T, p, 'LineWidth', 2);
xlabel('时间 (秒)');
ylabel('位置');
title('位置随时间变化');

% 绘制速度曲线
subplot(4, 1, 2);
plot(0:0.1:T, vc, 'LineWidth', 2);
xlabel('时间 (秒)');
ylabel('速度');
title('速度随时间变化');

% 绘制加速度曲线
subplot(4, 1, 3);
plot(0:0.1:T, ac, 'LineWidth', 2);
xlabel('时间 (秒)');
ylabel('加速度');
title('加速度随时间变化');

% 绘制加加速度曲线
subplot(4, 1, 4);
plot(0:0.1:T, jc, 'LineWidth', 2);
xlabel('时间 (秒)');
ylabel('加加速度');
title('加加速度随时间变化');

代码结果

在这里插入图片描述

五、simulink七段式s曲线

有小伙伴想在永磁同步电机或者其他电机的simulink仿真上使用,所以我在此修改,得到下面的结果。

整体框图

在这里插入图片描述

simulink结果

从0到400rpm,在从400rpm到0

在这里插入图片描述

s-function内嵌代码

有一个事情非常重要

最大加速度和最大加加速度越大,目标位置越小,可以使采样时间变小

这就说明你想关注 最大速度和采样时间就得注意这一点,增大或者减小最大速度就得变其他两个,而采样时间是使你的simulink仿真时间变短

下面这个函数名字是fun,所以你的simulink中s-function的名字也要设置一致

function [sys,x0,str,ts,simStateCompliance] = fun(t,x,u,flag)



switch flag,
 
  case 0,
    [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;
 
  case 1,
    sys=mdlDerivatives(t,x,u);
    
  case 2,
    sys=mdlUpdate(t,x,u);
 
  case 3,
    sys=mdlOutputs(t,x,u);
 
  case 4,
    sys=mdlGetTimeOfNextVarHit(t,x,u);
 
 
  case 9,
    sys=mdlTerminate(t,x,u);
 
  otherwise
    DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
 
end
 
 
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes
 
sizes = simsizes;
 
sizes.NumContStates  = 0;
sizes.NumDiscStates  = 0;
sizes.NumOutputs     = 1;
sizes.NumInputs      = 1;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;  
 
sys = simsizes(sizes);
x0  = [];
str = [];
ts  = [0 0];
 
simStateCompliance = 'UnknownSimState';
 
function sys=mdlDerivatives(t,x,u)
 
sys = [];
 
 
function sys=mdlUpdate(t,x,u)
 
sys = [];
 
 
function sys=mdlOutputs(t,x,u)
% 定义参数
q0 = 0;     % 初始位置
q1 = 500;   % 目标位置
vmax = 400;  % 最大速度
amax = 5000;  % 最大加速度
v0 = 0;     % 初始速度
v1 = 0;     % 最终速度
jmax = 5000;  % 最大加加速度
count = 0;  % 计数器

 %% 最大加速度越大,目标位置越小,可以使采样时间变小
 
 %%
 
% 计算Ta、Td、Tj1、Tj2、Tv、alima、alimd等参数
if (vmax - v0) * jmax < amax^2
    if v0 > vmax
        Tj1 = 0;
        Ta = 0;
        alima = 0;
    else
        Tj1 = ((vmax - v0) / jmax)^0.5;
        Ta = 2 * Tj1;
        alima = Tj1 * jmax;
    end
else
    Tj1 = amax / jmax;
    Ta = Tj1 + (vmax - v0) / amax;
    alima = amax;
end

if (vmax - v1) * jmax < amax^2
    Tj2 = ((vmax - v1) / jmax)^0.5;
    Td = 2 * Tj2;
    alimd = Tj2 * jmax;
else
    Tj2 = amax / jmax;
    Td = Tj2 + (vmax - v1) / amax;
    alimd = amax;
end

Tv = (q1 - q0) / vmax - Ta / 2 * (1 + v0 / vmax) - Td / 2 * (1 + v1 / vmax);

% 动态调整参数,确保轨迹满足条件
if Tv <= 0
    Tv = 0;
    amax_org = amax;
    
    while Ta < 2 * Tj1 || Td < 2 * Tj2
        count = count + 1;
        amax = amax - amax_org * 0.1;
        alima = amax;
        alimd = amax;
        
        delta = (amax^4) / (jmax^2) + 2 * (v0^2 + v1^2) + amax * (4 * (q1 - q0) - 2 * amax / jmax * (v0 + v1));
        Tj1 = amax / jmax;
        Ta = (amax^2 / jmax - 2 * v0 + delta^0.5) / (2 * amax);
        Tj2 = amax / jmax;
        Td = (amax^2 / jmax - 2 * v1 + delta^0.5) / (2 * amax);
    end
end

% 计算轨迹
p = []; % 位置数据
vc = []; % 速度数据
ac = []; % 加速度数据
jc = []; % 加加速度数据

if Tv > 0
    vlim = vmax;
    T = Tv + Ta + Td;
else
    Tv = 0;
    vlim = v0 + (Ta - Tj1) * alima;
    T = Tv + Ta + Td;
end

    if u >= 0 && u < Tj1
        % 段1:加加速度段

        sys = v0 + jmax * u^2 / 2;

    elseif u >= Tj1 && u < (Ta - Tj1)
        % 段2:匀加速度段

        sys = v0 + alima * (u - Tj1 / 2);

    elseif u >= (Ta - Tj1) && u < Ta
        % 段3:减加速度段

        sys = vlim - jmax * (Ta - u)^2 / 2;

    elseif u >= Ta && u < (Ta + Tv)
        % 段4:匀速段

        sys = vlim;
    elseif u >= (T - Td) && u < (T - Td + Tj2)
        % 段5:加减速度段

        sys = vlim - jmax * (u - T + Td)^2 / 2;

    elseif u >= (T - Td + Tj2) && u < (T - Tj2)
        % 段6:匀减速度段

        sys = vlim - alimd * (u - T + Td - Tj2 / 2);

    elseif u >= (T - Tj2) && u < T
        % 段7:减减速度段

        sys = v1 + jmax * (T - u)^2 / 2;
else
    sys = 1;
end

 
 
function sys=mdlGetTimeOfNextVarHit(t,x,u)
 
sampleTime = 1;   
sys = t + sampleTime;
 
function sys=mdlTerminate(t,x,u)
 
sys = [];
 
 

六、使用双闭环FOC控制-----simulink仿真示意

在这里插入图片描述
输出得到转速图,如下所示:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/411725.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JVM】StringTable 字符串常量池

参考&#xff1a;javaGuide 字符串常量池 是 JVM 为了提升性能和减少内存消耗针对字符串&#xff08;String 类&#xff09;专门开辟的一块区域&#xff0c;主要目的是为了避免字符串的重复创建 String的不可变性 1.通过字面量的方式&#xff08;区别于new&#xff09;给一个…

Avalonia学习(二十六)-桌面系统界面Ribbon

这个界面是开源项目中拔下来的&#xff0c;我没有全部改完&#xff0c;只能按照我得界面测试。我还有一个bug没有找到&#xff0c;但是解决了一下。这里没有任何和大家说的&#xff0c;给大家看一下界面效果。 另外地图研究了缩放和显示鼠标位置经纬度

https://htmlunit.sourceforge.io/

https://htmlunit.sourceforge.io/ 爬虫 HtmlUnit – Welcome to HtmlUnit HtmlUnit 3.11.0 API https://mvnrepository.com/artifact/net.sourceforge.htmlunit/htmlunit/2.70.0 https://s01.oss.sonatype.org/service/local/repositories/releases/content/org/htmlunit…

Java核心知识点常考面试题(持续更新中)

Java核心知识点常考面试题&#xff08;持续更新中&#xff09; 线程与线程池线程线程池 Java锁机制java线程模型java锁分类轻量级锁重量级锁ReentrantLock 底层原理与源码深度解析ReentrantReadWriteLock 深入理解读写锁CountDownLatchsemaphore 实现公平锁与非公平锁线程死锁与…

Android 9.0 禁用插入耳机时弹出的保护听力对话框

1.前言 在9.0的系统rom定制化开发中,在某些产品中会对耳机音量调节过高限制,在调高到最大音量的70%的时候,会弹出音量过高弹出警告,所以产品 开发的需要要求去掉这个音量弹窗警告功能,接下来就来具体实现这个功能 2.禁用插入耳机时弹出的保护听力对话框的核心类 framework…

第六十八天 APP攻防-XposedFridaHook证书校验反代理代理转发

第68天 APP攻防-Xposed&Frida&Hook&证书校验&反代理&代理转发 知识点&#xff1a; 1、APP防代理绕过-应用&转发 2、APP证书校验类型-单向&双向 3、APP证书校验绕过-Frida&XP框架等 章节点&#xff1a; 1、信息收集-应用&资产提取&权…

蓝桥杯-标题统计

知识点: 关键是考察getline的作用 #include <iostream> using namespace std; int main() { string a; int t0; getline(cin,a);//每次读取一整行并把Enter键生成的换行符抛弃 for(int i0;i<a.length();i){ if(a[i]! )t; } cout<<t; return …

【LTSPICE】宏模型中的语法分析(持续更新)

本篇文章用来总结模型文件、仿真文件中的语法&#xff0c;写给自己看的&#xff0c;格式和内容上比较随意 上图是在安森美官网上下载的一款二极管的spice模型文件。 * 字符串&#xff1a;注释&#xff0c;能看到这篇文章的应该都懂啥叫注释.model&#xff1a;.一个词是命令…

如何修改图片尺寸大小不变形?简单的图片改大小的方法

在平时工作或者学习时&#xff0c;有时候需要将图片的大小进行修改&#xff0c;以便于存储、分享或打印&#xff0c;很多人都习惯性的去下载一些图片处理软件&#xff0c;比较麻烦&#xff0c;这里推荐大家使用图片在线处理工具&#xff0c;打开浏览器直接将图片尺寸修改&#…

【Flink】Flink 中的时间和窗口之窗口(Window)

1. 窗口的概念 Flink是一种流式计算引擎&#xff0c;主要是来处理无界数据流&#xff0c;数据流的数据是一直都有的&#xff0c;等待流结束输入数据获取所有的流数据在做聚合计算是不可能的。为了更方便高效的处理无界流&#xff0c;一种方式就是把无限的流数据切割成有限的数…

【析】装卸一体化车辆路径问题的自适应并行遗传算法

0 引言 国内外有关 &#xff36;&#xff32;&#xff30;&#xff33;&#xff30;&#xff24;的文献较多&#xff0c;求解目标多以最小化车辆行驶距离为主&#xff0c;但现实中可能存在由租赁费用产生的单次派出成本&#xff0c;需要综合考 虑单次派车成本和配送路径成本。…

消息中间件之RocketMQ源码分析(十八)

Broker CommitLog索引机制中的构建过程 1.创建ConsumeQueue和IndexFile。 ConsumeQueue和IndexFile两个索引都是由ReputMessageService类创建的 RequestMessageService类图 ReputMessageService服务启动后的执行过程。 doReput()方法用于创建索引的入口&#xff0c;通常通过…

Redis 管道详解

Redis 管道 关键词&#xff1a;Pipeline Pipeline 简介 Redis 是一种基于 C/S 模型以及请求/响应协议的 TCP 服务。通常情况下&#xff0c;一个 Redis 命令的请求、响应遵循以下步骤&#xff1a; 客户端向服务端发送一个查询请求&#xff0c;并监听 Socket 返回&#xff08…

3 easy 26. 删除有序数组中的重复项

双指针&#xff1a; //给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 //一致 。然后返回 nums 中唯一元素的个数。 // // 考虑 nums 的唯…

PreMaint CMS系统:数字化驱动起重机远程管理的智能未来

在港口起重机领域&#xff0c;数字化解决方案正成为提高效率、降低停机时间的关键。PreMaint CMS作为起重机核心可视化系统&#xff0c;融合了操作人员、维护团队和管理者的需求&#xff0c;通过智能化的方式&#xff0c;将复杂的数据转化为简洁的信息&#xff0c;实现对起重机…

Node.js中的错误处理和日志记录

在Node.js应用程序中&#xff0c;错误处理和日志记录是非常重要的方面。正确的错误处理和日志记录可以帮助我们更好地跟踪问题、排查 bug&#xff0c;并提供更好的用户体验。在本篇博客中&#xff0c;我将为大家介绍在Node.js中如何进行错误处理和日志记录&#xff0c;以及一些…

BIO实战、NIO编程与直接内存、零拷贝深入辨析

BIO实战、NIO编程与直接内存、零拷贝深入辨析 长连接、短连接 长连接 socket连接后不管是否使用都会保持连接状态多用于操作频繁&#xff0c;点对点的通讯&#xff0c;避免频繁socket创建造成资源浪费&#xff0c;比如TCP 短连接 socket连接后发送完数据后就断开早期的http服…

基于JSP的毕业设计选题系统的设计与实现

基于JSP的毕业设计选题系统的设计与实现 (源代码论文) A. 项目简介 毕业设计选题系统就是能够使学生通过互联网完成毕业设计课题的选定&#xff0c;它采用Web方式&#xff0c;同时适用于局域网和Internet&#xff0c;它要实现审核&#xff0c;权限管理&#xff0c;邮件通知…

Spring6学习技术|IoC|基于注解管理bean

学习材料 尚硅谷Spring零基础入门到进阶&#xff0c;一套搞定spring6全套视频教程&#xff08;源码级讲解&#xff09; IoC注解 首先这是最常用的方法。&#xff08;在学Java基础的时候明明是非常不起眼的知识点啊&#xff01;&#xff01;&#xff01;&#xff09; 从 Java…

二进制部署k8s之网络部分

1 CNI 网络组件 1.1 K8S的三种接口 CRI 容器运行时接口 docker containerd podman cri-o CNI 容器网络接口 flannel calico cilium CSI 容器存储接口 nfs ceph gfs oss s3 minio 1.2 K8S的三种网络 节点网络 nodeIP 物理网卡的IP实现节点间的通信 Pod网络 podIP Pod与Po…