用Matlab绘制推程为简谐运动,回程为等减速运动的凸轮,要求基圆半径80mm,滚子半径10mm,偏置距离10mm,形成距离30mm,角速度0.08mm,推成运动角130°,远休止角25°,回城运动角145°,进休止角60°,从动件长度30mm,要求图中标出各个从动件位置的压力角,标出最大压力角以及最小压力角的位置,从而使Matlab最终实现凸轮廓线显示变化的gif图和压力角a的变化曲线的gif图,并给出最大最小压力角值。
时间: 2023-07-15 19:13:40 浏览: 174
MATLAB在简谐运动图像教学中的应用公开课.pdf
这是一道比较复杂的机械设计题目,需要考虑很多几何参数和运动学参数。下面是一份可能的 Matlab 代码:
```matlab
% 凸轮绘制程序
r_base = 80; % 基圆半径
r_roller = 10; % 滚子半径
e = 10; % 偏置距离
d = 30; % 形成距离
omega = 0.08; % 角速度
theta1 = 130/180*pi; % 推程运动角度
theta2 = 25/180*pi; % 远休止角度
theta3 = 145/180*pi; % 回程运动角度
theta4 = 60/180*pi; % 进休止角度
L = 30; % 从动件长度
% 计算各个点的坐标
N = 500; % 绘制的点数
theta = linspace(0, 2*pi, N);
x_base = r_base*cos(theta);
y_base = r_base*sin(theta);
x_roller = (r_base+e-d*cos(theta/2)+r_roller)*cos(theta);
y_roller = (r_base+e-d*cos(theta/2)+r_roller)*sin(theta);
x_follower = (r_base+e-L)*cos(theta)-L*sin(theta/2).*tan((pi-theta)/4);
y_follower = (r_base+e-L)*sin(theta)+L*cos(theta/2).*tan((pi-theta)/4);
% 计算压力角
alpha = atan(r_base*sin(theta)./(r_base*cos(theta)+e-d*cos(theta/2)+r_roller));
% 找出最大和最小压力角
[alpha_max, idx_max] = max(alpha);
[alpha_min, idx_min] = min(alpha);
% 绘制凸轮形状图
figure(1);
plot(x_base, y_base, 'b-', x_roller, y_roller, 'r-', x_follower, y_follower, 'g-');
hold on;
plot(x_follower(idx_max), y_follower(idx_max), 'ro', x_follower(idx_min), y_follower(idx_min), 'rx');
xlabel('x');
ylabel('y');
axis equal;
legend('基圆', '凸轮', '从动件', '最大压力角', '最小压力角');
title('凸轮形状');
% 绘制压力角变化图
figure(2);
plot(theta/pi*180, alpha/pi*180);
hold on;
plot(theta(idx_max)/pi*180, alpha_max/pi*180, 'ro', theta(idx_min)/pi*180, alpha_min/pi*180, 'rx');
xlabel('凸轮角度(°)');
ylabel('压力角(°)');
legend('压力角', '最大压力角', '最小压力角');
title('压力角变化');
% 生成动画
frames = [];
for i = 1:N
x = [x_base(i), x_roller(i), x_follower(i)];
y = [y_base(i), y_roller(i), y_follower(i)];
plot(x, y, 'b-o', 'MarkerFaceColor', 'b');
axis equal;
xlim([-120, 120]);
ylim([-120, 120]);
frames = [frames, getframe(gcf)];
end
imwrite(frames(1).cdata, 'cam.gif', 'DelayTime', 0.02, 'LoopCount', inf);
for i = 2:N
imwrite(frames(i).cdata, 'cam.gif', 'DelayTime', 0.02, 'WriteMode', 'append');
end
frames = [];
for i = 1:N
plot(theta(1:i)/pi*180, alpha(1:i)/pi*180, 'b-', theta(i)/pi*180, alpha(i)/pi*180, 'ro');
ylim([0, 90]);
frames = [frames, getframe(gcf)];
end
imwrite(frames(1).cdata, 'alpha.gif', 'DelayTime', 0.02, 'LoopCount', inf);
for i = 2:N
imwrite(frames(i).cdata, 'alpha.gif', 'DelayTime', 0.02, 'WriteMode', 'append');
end
% 输出最大和最小压力角
fprintf('最大压力角:%f°,位置:%f°\n', alpha_max/pi*180, theta(idx_max)/pi*180);
fprintf('最小压力角:%f°,位置:%f°\n', alpha_min/pi*180, theta(idx_min)/pi*180);
```
上述代码首先计算了基圆、滚子、从动件的坐标,然后计算了各个点的压力角。接着找出了最大和最小压力角的位置,并在图中标出。最后生成了两个动画,一个是凸轮形状的变化,另一个是压力角的变化。最后输出了最大和最小压力角的值和位置。
阅读全文