目录

一、凸轮设计函数文件

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用于设计平底移动从动件盘型凸轮机构。

        附上函数具体使用说明:

codesys凸轮点位编写的注意事项 凸轮代码_轮廓线

 

codesys凸轮点位编写的注意事项 凸轮代码_轮廓线_02