使用matlab进行凸轮设计

目录

一、凸轮设计函数文件

fun1:

fun2:

fun3:

fun4:

二、函数使用说明及注意事项


一、凸轮设计函数文件

fun1:

function [i,d,v,a]=fun1(x,y)
%% FUN1函数介绍
%   输入初末位置和推程/回程,用三四五次运动多项式计算这一段凸轮的各个点升距,
%   输出各点对应升/降距向量。
%-------------------------------------------------------------------------%

%   输入参数:
%   x为1*2的向量,用来储存初末位置的推程(回程)角位置。
%   y为1*2的向量,用来储存初末位置的总升距(降距)。

%   输出参数:
%   i为分段数。
%   d对应分段上的升距。

%% 参数初始化
if y(1)<y(2)       %模式系数,1为推程,0为回程
    m=1;
else
    m=0;
end

f=abs(x(1)-x(2));  %推(回)程角
h=abs(y(1)-y(2));  %升(降)距离
derta=x(1);        %x移动系数,左加右减
d=[];              %从动件位移向量
v=[];              %从动件速度向量
a=[];              %从动件加速度向量
%% 计算
for i=x(1):0.001:x(2)
    
    if m==1        %推程的位移,速度,加速度
       d=[d h*(10*((i-derta)/f).^3-15*((i-derta)/f).^4+6*((i-derta)/f).^5)+y(1)];
       v=[v h/f*((30*((i-derta)/f).^2-60*((i-derta)/f).^3+30*((i-derta)/f).^4))];
       a=[a h/(f.^2)*((60*((i-derta)/f)-180*((i-derta)/f).^2)+120*((i-derta)/f).^3)];
    else           %回程的位移,速度,加速度
       d=[d h*(1-10*((i-derta)/f).^3+15*((i-derta)/f).^4-6*((i-derta)/f).^5)+y(2)];
       v=[v -h/f*((30*((i-derta)/f).^2-60*((i-derta)/f).^3+30*((i-derta)/f).^4))];
       a=[a -h/(f.^2)*((60*((i-derta)/f)-180*((i-derta)/f).^2)+120*((i-derta)/f).^3)];
    end

end

i=x(1):0.001:x(2);                 %去掉最后一个点
[~ ,l]=size(i); 
i(l)=[];
d(l)=[];
v(l)=[];
a(l)=[];
%% 绘图与输出
hold on;                           %保持命令
subplot(2,2,1);plot(i,d);          %绘图
hold on;
subplot(2,2,2);plot(i,v); 
hold on;
subplot(2,2,3);plot(i,a); 
end

fun2:

function [i,d,v,a]=fun2(x,y)
%% FUN2函数介绍
%   输入一组x时序坐标,以及对应的y升/降距,
%   输出其对应的三四五次多项式位置坐标并绘图。
%-------------------------------------------------------------------------%

%   输入参数:
%   x为输入各个分段位置的角度分界。
%   y为对应各个分段的升/降距。
%% 参数初始化
[~,l]=size(x);       %段位数
x=x./x(l)*2*pi;      %更新x向量,化为角度型
i=[];                %储存的角度向量
d=[];                %储存的升/降距向量
v=[];                %储存的速度向量
a=[];                %储存的加速度向量
%% 分割图形区
hold on,subplot(2,2,1),axis normal,grid on,title('从动件位移曲线图'),xlabel('角度/rad'),ylabel('位移/mm');
hold on,subplot(2,2,2),axis normal,grid on,title('从动件速度曲线图(纵坐标乘以ω即得速度)'),xlabel('角度/rad'),ylabel('速度');
hold on,subplot(2,2,3),axis normal,grid on,title('从动件加速度曲线图(纵坐标乘以ω的平方即得加速度)'),xlabel('角度/rad'),ylabel('加速度');
%% 计算
for num=1:l-1
    [i0,d0,v0,a0]=fun1([x(num) x(num+1)],[y(num) y(num+1)]);%计算临时向量i0,d0
    i=[i i0];%储存角度向量
    d=[d d0];%储存升/降距向量
    v=[v v0];%储存速度向量
    a=[a a0];%储存加速度向量
end

fun3:

%% FUN3函数介绍
%   输入基圆半径,偏心距,角度分界,对应分界的升/降距,
%   输出理论轮廓线坐标矩阵,基圆坐标矩阵,偏距圆坐标矩阵,并绘图。
%-------------------------------------------------------------------------%
%   输入参数:

%   rb为基圆半径。
%   e为偏距。
%   x为输入时序分界。
%   y为对应分界的升/降距。

%% 坐标导入
[i,s,~,~]=fun2(x,y);%i代表每个计算点的角度,s为各角度对应升距
%% 参数初始化
x0=[];%存储理论轮廓线的x坐标
y0=[];%存储理论轮廓线的y坐标
z0=[];%存储理论轮廓线的z坐标
x1=[];%储存基圆x坐标
y1=[];%储存基圆y坐标
x2=[];%储存偏距圆x坐标
y2=[];%储存偏距圆y坐标
z=[]; %储存基圆,偏距圆z坐标
s0=(rb^2-e^2)^0.5;%初始距离
[~,l]=size(i);%向量长度
%% 计算
%理论轮廓线坐标计算:
for k=1:l
    x0=[x0 (s0+s(k))*sin(i(k))+e*cos(i(k))];
    y0=[y0 (s0+s(k))*cos(i(k))-e*sin(i(k))];
    z0=[z0 0];
end
%基圆坐标及偏距圆坐标计算:
for t=0:2*pi/360:2*pi
x1=[x1 rb*cos(t)];
y1=[y1 rb*sin(t)];
x2=[x2 e*cos(t)];
y2=[y2 e*sin(t)];
z=[z 0];
end
G0=[x0',y0',z0'];%理论轮廓线坐标矩阵
G1=[x1',y1',z'];%基圆坐标矩阵
G2=[x2',y2',z'];%偏距圆坐标矩阵
%% 绘图
hold on;
subplot(2,2,4),axis equal;
plot(x0,y0,'r');
hold on;
plot(x1,y1,'b');
hold on;
plot(x2,y2,'g');
title('滚子移动从动件盘型凸轮曲线图');
grid on;
legend('理论轮廓线','基圆','偏距圆');
text(0,rb,'ω↷');

fun4:

function [G0,G1]=fun4(rb,x,y)
%% 坐标导入
[i,s,v,~]=fun2(x,y);%i代表每个计算点的角度,s为各角度对应升距,v为速度
%% 参数初始化
x0=[];%存储实际轮廓线的x坐标
y0=[];%存储实际轮廓线的y坐标
z0=[];%存储实际轮廓线的z坐标
x1=[];%储存基圆的x坐标
y1=[];%储存基圆的y坐标
z1=[];%储存基圆的z坐标
[~,l]=size(i);%向量长度
%% 计算
%实际轮廓线坐标计算:
for k=1:l
    x0=[x0 (rb+s(k))*sin(i(k))+v(k)*cos(i(k))];
    y0=[y0 (rb+s(k))*cos(i(k))-v(k)*sin(i(k))];
    z0=[z0 0];
end
%基圆坐标计算:
for t=0:2*pi/360:2*pi
x1=[x1 rb*cos(t)];
y1=[y1 rb*sin(t)];
z1=[z1 0];
end
G0=[x0',y0',z0'];%实际轮廓线坐标矩阵
G1=[x1',y1',z1'];%基圆坐标矩阵

%% 绘图
hold on;
subplot(2,2,4),axis equal;
plot(x0,y0,'r');
hold on;
plot(x1,y1,'b');
title('平底移动从动件盘型凸轮曲线图');
grid on;
legend('实际轮廓线','基圆');
text(0,110,'ω↷');

end

=========================================================================

二、函数使用说明及注意事项

        2023.12.23更新:

        看到很多小伙伴问我要源代码哈,其实上面这四个就是四个文件的源代码哈。大家使用的时候,把代码复制,按照函数文件的格式名命保存到一个文件夹下面,然后再matlab里面打开这个文件夹就可以进行调用啦。fun1主要使用多项式进行插值计算一段行程的升距坐标;fun2主要用来多次调用fun1,计算出整个凸轮行程的升距坐标;fun3和fun4主要是根据fun2升距坐标计算凸轮实际轮廓线的,不过fun3计算的是滚子凸轮,fun4计算的是平底凸轮。大家调用的时候要注意,计算的时候直接调用fun3或者fun4回传G0矩阵保存为txt文件就行,G0矩阵txt文件导入solidwoorks的时候注意将第一行数据复制到最后一行生成闭环曲线。设计的凸轮我默认顺时针转动,大家注意一下。

        这个代码还有很多优化空间,比如说这个输出的G0矩阵太过庞大,导致SW进行插值计算的时候要很久,其实可以抽部分数据导入sw的,只是精度可能损失那么一点。不过这个代码也已经是很久前写的了,我现在太久没碰matlab,机械原理也几乎忘完了[捂脸哭]。一时半会儿也搞不太清这个逻辑,具体调用还行,但大的改动应该不能再指导哈。

         但还是要强调一点:fun3,fun4调用了fun1,fun2,fun3用于设计滚子移动从动件盘形凸轮机构,fun4用于设计平底移动从动件盘型凸轮机构。

        附上函数具体使用说明:

 

  • 24
    点赞
  • 134
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论
根据提供的引用内容,可以了解到MATLAB可以用于凸轮设计。具体步骤如下: 1.确定凸轮的基本参数,包括凸轮的半径、滚柱的半径、凸轮的角度等。 2.根据凸轮的基本参数,计算出凸轮的理论运动轨迹。 3.根据凸轮的理论运动轨迹,设计凸轮的具体形状。 4.使用MATLAB进行凸轮的绘制和仿真。 下面是一个MATLAB凸轮设计的例子: ```matlab % 凸轮基圆半径 global r % 滚柱半径 global R % 凸轮角度 global xxx xxx2 yyy yyy2 o0e % 标签长度 length1=163; length2=163+79; length3=163+79+67; length4=360; % 凸轮角度范围 degree=0:1:360; degree1=degree/180*pi; % 初始化 x1=zeros(length(degree),1); y1=zeros(length(degree),1); rr=zeros(length(degree),1); % 计算凸轮的理论运动轨迹 for i=1:length(degree) if degree(i)>=0 && degree(i)<=90 xxx=degree(i); xxx2=xxx; yyy=90-xxx; yyy2=yyy; o0e=0; elseif degree(i)>90 && degree(i)<=180 xxx=degree(i)-90; xxx2=xxx; yyy=0-xxx; yyy2=yyy; o0e=0; elseif degree(i)>180 && degree(i)<=270 xxx=degree(i)-180; xxx2=xxx; yyy=xxx-90; yyy2=yyy; o0e=0; elseif degree(i)>270 && degree(i)<=360 xxx=degree(i)-270; xxx2=xxx; yyy=180-xxx; yyy2=yyy; o0e=0; end x1(i)=r*cos(xxx1(i))+R*cos(yyy1(i)+o0e); y1(i)=r*sin(xxx1(i))+R*sin(yyy1(i)+o0e); rr(i)=sqrt(x1(i)^2+y1(i)^2); end % 绘制凸轮图形 figure(1) plot(x1,y1) axis equal title('凸轮图形') % 仿真凸轮运动 figure(2) for i=1:length(degree) plot(x1(i),y1(i),'ro') axis([-300 300 -300 300]) axis equal pause(0.01) end ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

诗和远方曾来过

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

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

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

打赏作者

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

抵扣说明:

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

余额充值