2007年5月24日 星期四

Homework 11

第十一次作業
b94611001 歐陽太閒
本週(5/24)有來上課

一,凸輪資料分析:


本次作業的凸輪之資料如下
升程:
加速度運動:0-100°滯留後開始提升(rise)到5cm,並且在200-260°間滯留,而後進入返程.
返程:
加速度運動:260-320°間為返程至0cm,滯留至360°
刻度:
10°

以上之狀況可做如下分析(加速度運動)θ為輸入角度,β=區間

升程上半段位移:y(θ)=2h(θ/β)²
升程下半段位移:y(θ)=h[1-2(1-θ/β)²]
返程上半段位移:y(θ)=h[1-2(1-θ/β)²]
返程下半段位移:y(θ)=2h(1-θ/β)²

因此我們可以利用老師講義中的parabol_cam.m來進行此凸輪在不同角度時的位置,速度,加速度對角度的關係:

function [y, yy, yyy]=parabol_cam(phi, phi_in,beta_range,direct,travel,rpm)
各項參數分別的代表意義為:
phi=當前輸入角度
phi_in=升降程起始角度
beta_range=本程所經之角度
direct=方向,1為升程,-1為返程
travel=衝程
rpm=轉速

因此可以對於凸輪的運動進行分析,在此選擇返程也為一加速度運動,當然也可以選擇其他運動.

程式架構:
1.程式資訊
2.建立向量
3.計算升程引用parabol_cam
4.計算停滯
5.計算返程引用parabol_cam
6.計算停滯
7.向量合成
8.繪圖

故撰寫程式如下:

function [ss, vv, aa]=acccam(rstart,rend,rstart2,rend2,c,stroke)
%作者 b94611001 歐陽太閒
%rstart=升程起始角度,rend=升程結束角度,rstart2=降程開始角度,rend2=降程結束角度,c=分割度數,stroke=衝程
%for example:acccam(100,200,260,320,10,5)

title('作業11 作者:歐陽太閒 b94611001'); %資訊
xlabel('x-axis degree');
ylabel('y-axis cm');
axis equal;
itmr=rstart/c; %進行角度處理
itme=rend/c;
itmr2=rstart2/c;
itme2=rend2/c;
hold on; %多層繪圖

theta1=linspace(0,0,itme); %建立一0向量

for q=1:itmr %先填入升程前的角度
theta1(q)=q*c
end
for j=itmr:length(theta1); %計算升程
theta1(j)=j*c; %填入角度
[ss1(j), vv1(j), aa1(j)]=parabol_cam(theta1(j),rstart,rend-rstart,1,stroke,0); %引用parabol_cam
end

theta2=linspace(rend,rstart2,itmr2-itme+1); %計算滯留
ss2=linspace(ss1(itme),ss1(itme),itmr2-itme+1); %延續升程資料
vv2=linspace(vv1(itme),vv1(itme),itmr2-itme+1);
aa2=linspace(0,0,itmr2-itme+1);

theta3=rstart2:c:rend2 %計算返程
for k=1:(length(theta3))
[ss3(k), vv3(k), aa3(k)]=parabol_cam(theta3(k),rstart2,rend2-rstart2,-1,5,0) %引用parabol_cam
end;

theta4=linspace(rend2,360,(360/c)-itme2+1); %計算滯留
ss4=linspace(ss3(length(theta3)),ss3(length(theta3)),(360/c)-itme2+1);
vv4=linspace(vv3(length(theta3)),vv3(length(theta3)),(360/c)-itme2+1);
aa4=linspace(0,0,(360/c)-itme2+1);

theta=[theta1 theta2 theta3 theta4];
ss=[ss1 ss2 ss3 ss4]; %合併向量
vv=[vv1 vv2 vv3 vv4];
aa=[aa1 aa2 aa3 aa4];
h1=plot(theta,ss,'b-',theta,vv,'k-',theta,aa,'r-') %繪製
legend('位移','速度','加速度',3) %標註


因此我們可以輸入以下指令

>>acccam(100,200,260,320,10,5)

結果如圖


只顯示位移時:
結果如圖



當然我們也可以使用老師的plot_dwell.m來進行繪製,但plotdwell只適用於末段為回程者,但我們也可以測試之.
升程:
加速度運動:0-100°滯留後開始提升(rise)到5cm,並且在200-260°間滯留,而後進入返程.
返程:
加速度運動:260-360°間為返程至0cm
刻度:
10°

可以輸入以下指令

>>plot_dwell(0:10:360,5,[2 2],[100 200 260])

結果如圖



二,凸輪工作曲線


在此作業中,需繪製第一題中的凸輪之工作曲線半徑為15公分,順時鐘方向旋轉,梢形垂直接觸從動件,長10cm
因此本題可以老師的

function [x,y]=pincam(cth,r0,s,e,L,range,pattern,cw)

為基礎,由於選擇的範圍dwell.m無法處理,故無法直接使用pincam.m,因此改寫一程式pincam_acc,其中引用了上一題中的acccam.m計算結果,而

可得此凸輪之工作曲線.

程式架構:
1.程式資訊
2.處理偏置量
2.引入acccam計算資料(位移)
3.計算轉軸並存入向量
4.繪製延伸線及梢
5.繪圖

程式碼如下:

function [x,y]=pincam_acc(cth,r0,s,e,L,rstart,rend,rstart2,rend2,cw)
%作者 b94611001 歐陽太閒
%rstart=升程起始角度,rend=升程結束角度,rstart2=降程開始角度,rend2=降程結束角度,cth=範圍,s=衝程,r0=凸輪基圓半徑
%e=偏置量,L:從動件(銷型)長度,cw:凸輪轉動方向(+1,-1)
%for example:pincam_acc([0:10:360],15,5,0,10,100,200,260,320,+1)
title('作業11 作者:歐陽太閒 b94611001'); %資訊
xlabel('x-axis cm');
ylabel('y-axis cm');
th=cth*pi/180;
s0=sqrt(r0*r0-e*e); %含偏置量時計算
[ss,vv,aa]=acccam(rstart,rend,rstart2,rend2,10,s) %引入acccam計算資料
for i=1:length(cth) %引入範圍內的位移,並以軸旋轉
t=th(i)*cw;
A=[cos(t) -sin(t);sin(t) cos(t)];%以軸轉
ym=ss(i);
x0=s0+ym;
Sx=[0 x0 x0+L;e e e];
X=A\Sx;
x(i)=X(1,2);y(i)=X(2,2);
line(X(1,1:2),X(2,1:2)); %繪製延伸線
line(X(1,2:3),X(2,2:3),'linewidth',3,'color','blue') %繪製梢
end
hold on;
plot([0 x],[0 y],'ro',x,y,'k-') %繪圖
rb = linspace(0, 2*pi, 301);
plot(r0*cos(rb), r0*sin(rb),'r-'); %畫基圓
axis equal;


輸入pincam_acc([0:10:360],15,5,0,10,100,200,260,320,-1)

>>pincam_acc([0:10:360],15,5,0,10,100,200,260,320,-1)

結果如圖


顯示基圓時:



而假設有偏置量e=5時

>>pincam_acc([0:10:360],15,5,5,10,100,200,260,320,-1)

結果如圖


本題若選擇為
升程:
加速度運動:0-100°滯留後開始提升(rise)到5cm,並且在200-260°間滯留,而後進入返程.
返程:
加速度運動:260-360°間為返程至0cm

符合dwell.m的設計,則可使用pincam.m

輸入
pincam([0:10:360],15,5,0,10,[100 200 260],[2 2],-1)
結果如圖


>>pincam([0:10:360],15,5,0,10,[100 200 260],[2 2],-1)

與剛剛撰寫的pincam_acc([0:10:360],15,5,0,10,100,200,260,360,-1)結果相同

>>pincam_acc([0:10:360],15,5,0,10,100,200,260,360,-1)

結果如圖



三,凸輪之動畫


在本程式中,嘗試利用rotate(把手,[1 0 0],角度)這個命令,可以大幅減少程式碼,並且嘗試更簡潔的動畫結構.

程式結構如下:
1.程式資訊
2.處理偏置量
2.引入acccam計算資料(位移)
3.計算轉軸並存入向量
4.進行動畫繪製
a.旋轉及平移
b.暫停


因此撰寫以下程式:

function [x,y]=pincammov(cth,r0,s,e,L,rstart,rend,rstart2,rend2,cw)
%作者 b94611001 歐陽太閒
%rstart=升程起始角度,rend=升程結束角度,rstart2=降程開始角度,rend2=降程結束角度,cth=範圍,s=衝程,r0=凸輪基圓半徑
%e=偏置量,L:從動件(銷型)長度,cw:凸輪轉動方向(+1,-1)
%for example:pincam_acc([0:10:360],15,5,0,10,100,200,260,320,+1)
title('作業11 作者:歐陽太閒 b94611001'); %資訊
xlabel('x-axis cm');
ylabel('y-axis cm');
th=cth*pi/180;
s0=sqrt(r0*r0-e*e); %含偏置量時計算
[ss,vv,aa]=acccam(rstart,rend,rstart2,rend2,10,s) %引入acccam計算資料

for i=1:length(cth) %引入範圍內的位移,並以軸旋轉
t=th(i)*cw;
A=[cos(t) -sin(t);sin(t) cos(t)];%以軸轉
ym=ss(i);
x0=s0+ym;
Sx=[0 x0 x0+L;e e e];
X=A\Sx;
x(i)=X(1,2);y(i)=X(2,2);
end

h1=plot([0 x],[0 y],'ro',x,y,'k-') %標點
axis equal;
axis([-25 25 -25 25]);

for j=1:100 %進行旋轉
q=37-rem(j,37);
ys=r0+ss(q);
%clf;
h2=line([0 0],[ys ys+L],'linewidth',3,'color','blue'); %繪製梢
rotate(h1,[0 0 1],(-10));
pause(0.1);
h2=line([0 0],[ys ys+L],'linewidth',3,'color','white');
pause(0.05)
end

輸入pincam_acc([0:10:360],15,5,0,10,100,200,260,320,-1)

>>pincam_acc([0:10:360],15,5,0,10,100,200,260,320,-1)

結果如圖


影片


附錄:acccam(100,200,260,320,10,5) 運算結果

ss =
Columns 1 through 7
0 0 0 0 0 0 0
Columns 8 through 14
0 0 0 0.1000 0.4000 0.9000 1.6000
Columns 15 through 21
2.5000 3.4000 4.1000 4.6000 4.9000 5.0000 5.0000
Columns 22 through 28
5.0000 5.0000 5.0000 5.0000 5.0000 5.0000 5.0000
Columns 29 through 35
4.7222 3.8889 2.5000 1.1111 0.2778 0.0000 0.0000
Columns 36 through 39
0.0000 0.0000 0.0000 0.0000
vv =
Columns 1 through 7
0 0 0 0 0 0 0
Columns 8 through 14
0 0 11.4592 12.6051 13.7510 14.8969 16.0428
Columns 15 through 21
5.7296 4.5837 3.4377 2.2918 1.1459 0 0
Columns 22 through 28
0 0 0 0 0 0 -82.7606
Columns 29 through 35
-85.9437 -89.1268 -9.5493 -6.3662 -3.1831 -0.0000 -0.0000
Columns 36 through 39
-0.0000 -0.0000 -0.0000 -0.0000
aa =
Columns 1 through 7
0 0 0 0 0 0 0
Columns 8 through 14
0 0 6.5656 6.5656 6.5656 6.5656 6.5656
Columns 15 through 21
-6.5656 -6.5656 -6.5656 -6.5656 -6.5656 -6.5656 0
Columns 22 through 28
0 0 0 0 0 0 -18.2378
Columns 29 through 35
-18.2378 -18.2378 18.2378 18.2378 18.2378 18.2378 0
Columns 36 through 39
0 0 0 0

1 則留言:

gorrilazz 提到...

你好, 我想讀你的blog, 能把我加入嗎?不明白parabol_cam的程式.因為在學matlab的凸輪程式.謝謝!!我是明新的研究生.