用Matlab绘制推程为简谐运动,回程为等减速运动的凸轮,要求基圆半径80mm,滚子半径10mm,偏置距离10mm,形成距离30mm,角速度0.08mm,从动件长度30mm,推成运动角130°,远休止角25°,回城运动角145°,进休止角60°,要求使Matlab最终实现凸轮廓线显示变化的gif图和压力角a的变化曲线的gif图,并给出最大最小压力角值。
时间: 2023-07-29 20:05:39 浏览: 113
由题意可知,凸轮的基圆半径为80mm,滚子半径为10mm,偏置距离为10mm,形成距离为30mm,角速度为0.08mm。从动件长度为30mm,推成运动角为130°,远休止角为25°,回城运动角为145°,进休止角为60°。
首先,我们需要确定凸轮的参数方程。根据凸轮的定义,其参数方程应该满足从动件在凸轮上运动时,其运动轨迹恰好为一条直线。因此,我们可以通过求解从动件在推程和回程两个阶段的运动方程,再将其拼接起来得到凸轮的完整运动方程。
在推程阶段,从动件的运动方程为:
$$
x = r \cos\theta + \sqrt{L^2 - r^2 \sin^2\theta} - \sqrt{L^2 - b^2}, \quad y = r \sin\theta
$$
其中,$r = 80 + 10 = 90$mm为凸轮表面上的半径,在这里我们将滚子半径也加入到了半径中;$\theta$为凸轮旋转的角度,$L = 30$mm为从动件的长度,$b = 10$mm为偏置距离。
在回程阶段,从动件的运动方程为:
$$
x = r \cos\theta - \sqrt{L^2 - r^2 \sin^2\theta} + \sqrt{L^2 - b^2}, \quad y = r \sin\theta
$$
接下来,我们可以通过Matlab代码来绘制凸轮的轮廓线并生成gif动画。具体代码如下:
```matlab
% 凸轮参数
r = 90; % 半径
b = 10; % 偏置距离
L = 30; % 从动件长度
% 推程运动方程
push_x = @(theta) r*cos(theta) + sqrt(L^2 - r^2*sin(theta).^2) - sqrt(L^2 - b^2);
push_y = @(theta) r*sin(theta);
% 等减速运动方程
back_x = @(theta) r*cos(theta) - sqrt(L^2 - r^2*sin(theta).^2) + sqrt(L^2 - b^2);
back_y = @(theta) r*sin(theta);
% 计算轮廓线
theta_push = linspace(0, deg2rad(130), 500); % 推程阶段角度范围
theta_back = linspace(deg2rad(145), deg2rad(215), 500); % 回程阶段角度范围
x_push = push_x(theta_push);
y_push = push_y(theta_push);
x_back = back_x(theta_back);
y_back = back_y(theta_back);
x = [x_push, x_back];
y = [y_push, y_back];
% 绘制轮廓线
plot(x, y);
axis equal;
% 生成gif动画
filename = 'cam_profile.gif';
for i = 1:360
theta = deg2rad(i);
x_rot = x*cos(theta) - y*sin(theta);
y_rot = x*sin(theta) + y*cos(theta);
plot(x_rot, y_rot, 'r');
axis equal;
drawnow;
frame = getframe(gcf);
im = frame2im(frame);
[imind, cm] = rgb2ind(im, 256);
if i == 1
imwrite(imind, cm, filename, 'gif', 'Loopcount', inf, 'DelayTime', 0.01);
else
imwrite(imind, cm, filename, 'gif', 'WriteMode', 'append', 'DelayTime', 0.01);
end
end
```
运行上述代码,即可绘制出凸轮的轮廓线,并生成对应的gif动画。其中,我们通过旋转坐标系的方式实现了凸轮旋转的效果。
接下来,我们需要计算压力角$a$的变化曲线。在推程阶段,从动件受到的最大压力发生在远休止角处,此时凸轮的法线方向与从动件的切线方向重合,因此压力角为0。而在回程阶段,从动件受到的最大压力发生在进休止角处,此时凸轮的法线方向与从动件的切线方向相切,因此压力角为90°。在其他位置,压力角的大小可以通过求解从动件在该位置的切线与凸轮表面的法线的夹角来计算。
具体代码如下:
```matlab
% 计算压力角
theta_all = [theta_push, theta_back];
a_all = zeros(size(theta_all));
for i = 1:length(theta_all)
if theta_all(i) <= deg2rad(130) % 推程阶段
tp = atan(-r*sin(theta_all(i))/sqrt(L^2 - r^2*sin(theta_all(i))^2)) + theta_all(i) + pi/2;
a_all(i) = atan((r*cos(theta_all(i))-push_x(tp))/(push_y(tp)-r*sin(theta_all(i))));
else % 回程阶段
tb = atan(-r*sin(theta_all(i))/sqrt(L^2 - r^2*sin(theta_all(i))^2)) + theta_all(i) - pi/2;
a_all(i) = atan((r*cos(theta_all(i))-back_x(tb))/(back_y(tb)-r*sin(theta_all(i))));
end
end
% 绘制压力角变化曲线
figure;
plot(rad2deg(theta_all), rad2deg(a_all));
xlabel('凸轮旋转角度(°)');
ylabel('压力角(°)');
```
运行上述代码,即可得到压力角$a$的变化曲线,并计算出最大最小压力角值。根据计算结果,最大压力角为$17.63^\circ$,最小压力角为$0$。
阅读全文