2007年6月6日

6/6- 第十二次作業

作業十二 廖婉婷 b94611040


*5/31日曾全程來上課*


Q1:一組標準全齒輪齒輪之徑節為8(亦可使用自設值),齒數分別為30T與48T,
其工作壓力角為20度(可為14.5或25度,自選)。
試求其接觸線長度,與接觸比。


這題使用講義上function contact_ratio
此函式之輸入值為徑節、兩齒輪之齒數及壓力角
輸出參數為接觸比,接觸長度,節圓直徑等
須留意此函式中未輸出"基圓直徑"
因此在函式輸出參數中加入D2,D3代表兩齒輪之基圓直徑
其值可由以下式子求出:

基圓直徑 = 齒數x基周節/pi

而其中齒數,基周節皆為函式輸出函數
因此函式改為:
function [c_ratio,c_length,ad,pc,pb,d2,d3,D2,D3,ag]=contact_ratio(pd,n2,n3,phi)
% Inputs:
% Pd= 徑節
% n2,n3= 兩齒輪之齒數
% phi= 壓力角(deg)
% Outputs:
% c_ratio, c_length= 接觸比,接觸長度
% ad= 齒冠
% pc,pb= 周節及基周節
% d2,d3= 兩齒輪節圓直徑
% D2,D3= 兩齒輪基圓直徑(增加之輸出參數)
% ag= 兩齒輪之接近角,遠退角及作用角
% = [alpha2 beta2 theta2 alpha3 beta3 theta3]
d2g=pi/180;
pangle=phi*d2g;
cosx=cos(pangle);sinx=sin(pangle);
ad=1./pd;pc=pi./pd;
pb=pc.*cosx;
r2=n2./(2*pd);
r3=n3./(2*pd);
d2=2*r2;
d3=2*r3;
rb2=r2.*cosx;rb3=r3.*cosx;
D2=n2.*pb./pi;
D3=n3.*pb./pi;
%此處為增加之基圓直徑參數運算
ax=sqrt((r3+ad).^2-(r3.*cosx).^2)-r3.*sinx;
xb=sqrt((r2+ad).^2-(r2.*cosx).^2)-r2.*sinx;
c_length=ax+xb;
c_ratio=c_length./pb;
ag1=[ax./rb2 xb./rb2 c_length./rb2]/d2g;
ag2=[ax./rb3 xb./rb3 c_length./rb3]/d2g;
ag=[ag1;ag2];

由題目給定:
徑節Pd= 8;齒數n2= 30,n3= 48;壓力角phi= 20
>> [c_ratio,c_length,ad,pc,pb,r2,r3,d2,d3,D2,D3,ag]=contact_ratio(8,30,48, 20)

c_ratio =
1.7005

c_length =
0.6275

ad =
0.1250

pc =
0.3927

pb =
0.3690

r2 =
1.8750

r3 =
3

d2 =
3.7500

d3 =
6

D2 =
3.5238

D3 =
5.6382

ag =
10.4850 9.9211 20.4061
6.5532 6.2007 12.7538
得到接觸比 = 1.7005; 接觸長度 = 0.6275




Q2:兩齒輪之節圓、基圓直徑各為如何?請列式計算其結果。

依課本所列式子:
Pd = N/d (徑節=齒數/節徑)
d = N/Pd

又由題目給定徑節Pd = 8;齒數分別為30,48
可以得到d2 = 30/8 = 3.75
d3 = 48/8 = 6

至於基圓直徑則由式:
Pb = pi*D/N (基周節 = pi*基圓直徑/齒數)
D = Pb*N/pi

由程式得到Pb = 0.369
代入式子得D2 = 0.369*30/pi = 3.52
D3 = 0.369*48/pi = 5.64


最後由第一題function contact_ratio驗證之結果:

d2 =
3.7500

d3 =
6

D2 =
3.5238

D3 =
5.6382

發現與計算結果相符!




Q3:此組齒輪是否會產生干涉現象?試列式證明之。


借用講義的圖
當兩輪齒冠圓與作用線交點A,B均落在作用線MN內,無干涉產生
因此要避免干涉
在接近角部分,線段MP應大於AP;退遠角部分NP應大於BP
因此由兩式MP>=AP;NP>=BP
詳細計算如下(參考自課本)



推導出
(N3^2 + 2*N3N2)sin^2φ >= 4 + 4*N2
(N2^2 + 2*N2N3)sin^2φ >= 4 + 4*N3


代入此題得:
左項 = (48^2+2*48*30)sin^2(20) = 606.41
右項 = 4 + 4*30 = 124
左項 > 右項

又由第二式
左項 = (30^2+2*30*48)sin^2(20) = 442.18
右項 = 4 + 4*48 = 196
左項 > 右項

兩式皆成立,我們得到此二齒輪無干涉產生


接著,由講義上isinterf函式作驗證
以下是函式內容:
function [x]=isinterf(phi,N1,N2)
% N1,N2= 兩齒輪齒數
% x=0:無干涉產生 ; x=1:有干涉產生
x=0;
sinx=sin(phi*pi/180);
if N2 < N1,nn=N1;N1=N2;N2=nn;end
if N1*(N1+2*N2)*sinx*sinx<4*(1+N2), x=1;
end

題目給定壓力角phi=20,兩齒輪齒數=30,48
執行程式:
>> isinterf(20,30,48)

ans =

0
無干涉產生,與計算結果相符!




Q4:可否利用draw_gear.m繪出其接合情形,並繪出其動畫效果。

本題將講義中draw_gear函式稍作修改
因為使用draw_gear時發現兩齒輪角度上無法契合
以下為修改後函式 draw_gears:
function [coords]=draw_gears(Dp,N,phi,range,x0,y0,i) 
%利用講義之draw_gear.m作修改
%Dp= 徑節
%N= 齒數
%range= 繪製範圍
%x0,y0= 繪製中心座標
%新增變數i= 齒輪的起始角度
[coord,theta,rp,rb]=tooth(Dp,N,phi);
coords=[];
%去掉原本的i=0;將i值改為自行輸入
%也就是自行設定齒輪繪製起始角度
%以達到讓尺輪旋轉之效果
while i < range
coord1=rotate2D(coord,-i,x0,y0);
coords=[coords;coord1];
i=i+theta;
end
plot(coords(:,1),coords(:,2));hold on;
[coord]=bushing(rp/8,x0,y0);
plot(coord(:,1),coord(:,2),'b-');
[coord]=bushing(-rp,x0,y0);
plot(coord(:,1),coord(:,2),'r:');
[coord]=bushing(-rb,x0,y0);
plot(coord(:,1),coord(:,2),'b:');
axis equal;

接著再另設draw_2gears.m呼叫上面所列函式
以達繪製兩齒輪
以下為函式內容:
function A=draw_2gears(Dp,N1,N2,phi)
%Inputs:
%Pd= 徑節
%N1,N2= 兩輪齒數
%phi= 壓力角(deg)
[coords]=draw_gears(Dp,N1,phi,360,0,0,0);
%設以原點為第一齒輪中心
[c_ratio,c_length,ad,pc,pb,r2,r3,d2,d3,ag]=contact_ratio(Dp,N1,N2,phi);
%為了取d2和d3兩個節圓直徑參數值
x=d2/2+d3/2; %兩齒輪節圓半徑合 為了作為第二個齒輪的中心座標
[coords2]=draw_gears(Dp,N2,phi,360,x,0,360/N2/2);
%第二個齒輪設定中心在(x,0)
%並且旋轉一起始角度(半個齒的角度)使得兩齒輪能契合

執行程式:
draw_2gears(8,30,48,20)
title('兩齒輪接合情形')





如果要繪製動畫
講義之move2_gear函式可輸入函數直接繪製(稍後有執行範例)
不過也可直接由draw_gear函式直接改寫
承接上一題,
以下為改寫內容:
function [coords]=move_gears(Dp,N,phi,range,x0,y0,k) 
%利用老師的draw_gear.m修改成move_gears.m
%Dp= 節徑
%N= 齒輪數
%phi= 壓力角
%range= 繪製範圍
%x0,y0= 齒輪中心座標
%新增變數k= 齒輪的起始繪製角度
[coord,theta,rp,rb]=tooth(Dp,N,phi);
coords=[];
range2 = range+k;
%因起始角度增加,range也要跟著往後移
%不然會出現在360度內齒數越來越少之情況
while k < range2
coord1=rotate2D(coord,k,x0,y0);
%如果將k改為-k;旋轉方向會相反
coords=[coords;coord1];
k=k+theta;
end
plot(coords(:,1),coords(:,2));hold on;
[coord]=bushing(rp/8,x0,y0);
plot(coord(:,1),coord(:,2),'b-');
[coord]=bushing(-rp,x0,y0);
plot(coord(:,1),coord(:,2),'r:');
[coord]=bushing(-rb,x0,y0);
plot(coord(:,1),coord(:,2),'b:');
axis equal;

接著以move_two_gears函式呼叫
以繪製兩個齒輪
function A=move_two_gears(Dp,n2,n3,phi,k)
%Inputs:
%Pd= 徑節;
%N1,N2= 兩輪齒數;
%phi= 壓力角(deg);
%新增函數k= 起始繪製角度;
[coords]=move_gears(Dp,n2,phi,360,0,0,1.6*k);%第一個齒輪設定中心在(0,0)
[c_ratio,c_length,ad,pc,pb,r2,r3,d2,d3,ag]=contact_ratio(Dp,n2,n3,phi);
%這一行是為了取出d2和d3兩個節圓直徑
x=d2/2+d3/2;
%兩齒輪節圓半徑合 為了作為第二個齒輪的中心座標
[coords2]=move_gears(Dp,n3,phi,360,x,-0,360/n3/2-k);
%第二個齒輪設定中心在(x,0)
%並且旋轉一起始角度(半個齒的角度)使得兩齒輪能契合
%需留意此處起始角度加上一負號
%因此兩輪才會是反向旋轉


重點在新增一輸入函數k做為齒輪繪製起點角度
如此,就可以得到跟講義move2_gear.m相似動畫了!

執行程式:
for k = 0:360;
%以迴圈改變繪製起始角度以達動畫效果
title('b94611040-模擬兩齒輪運轉動畫') %標註
pause(0.08) %畫面停留時間
clf; %清除畫面
move_two_gears(8,30,48,20,k)
end;

得到以下結果:



另一方法
直接使用講義之move2_gear.m
function move2_gear(Dpitch,nn1,nn2,phi,omega1)
% Dpitch= 徑節
% nn1,nn2= 兩輪齒數
% phi= 壓力角(deg)
% omega1= 角速度
clf;
d2r=pi/180;delt=0.01;
[coord1,r1,rb1]=one_tooth(Dpitch,nn1,phi,360,0,0);
[coord2,r2,rb2]=one_tooth(Dpitch,nn2,phi,360,0,0);
st=180/nn2;if nn1+nn2>2*fix((nn1+nn2)/2),st=0;end
coord2=rotate2D(coord2,180+st,0,0);
xc1=coord1(:,1);yc1=coord1(:,2);
xc2=coord2(:,1);yc2=coord2(:,2);
height=max(r1,r2)*1.2;
ar=min(abs(r1),abs(r2));
coord=bushing(ar/5,0,0); % Get the coordinates of 1st bushing
xb1=coord(:,1)-r1;yb1=coord(:,2);
xb2=coord(:,1)+r2;yb2=coord(:,2);
coord=bushing(-r1,-r1,0);%Get the 1st pitch circle
xp1=coord(:,1);yp1=coord(:,2);
coord=bushing(-r2,r2,0);% Get the 2nd pitch circle
xp2=coord(:,1);yp2=coord(:,2);
plot(xb1,yb1,'r-');hold on;
plot(xb2,yb2,'k-');
plot(xp1,yp1,'r:');
plot(xp2,yp2,'k:');
plot([-r1,r2]',[0,0]','r:');
xx1=min([r1,r2])/2;phir=(90-phi)*d2r;
plot([0,0]',[-xx1*2,xx1*2]','b:');
plot([-xx1 xx1]',[-xx1*tan(phir), xx1*tan(phir)]','b:');

cir1=line('xdata',[],'ydata',[],'erasemode','xor','linewidth',1,'color','r');
cir2=line('xdata',[],'ydata',[],'erasemode','xor','linewidth',1,'color','k');
line1=line('xdata',[],'ydata',[],'erasemode','xor','linewidth',2,'color','r');
line2=line('xdata',[],'ydata',[],'erasemode','xor','linewidth',2,'color','k');
lx1=[0 -r1]';ly1=[0,0]';
lx2=[r2,0]';ly2=[0,0]';
axis([-2.5*r1 2.5*r2 -height height]);
axis equal;
title('Press Ctl-C to stop');
theta1=180;theta2=180;s1=omega1*delt/d2r;
while 1,
z1=rotate2D([xc1,yc1],theta1,-r1,0);
z2=rotate2D([xc2,yc2],theta2,r2,0);
L1=rotate2D([lx1,ly1],theta1,-r1,0);
L2=rotate2D([lx2,ly2],theta2,r2,0);
set(cir1,'xdata',z1(:,1),'ydata',z1(:,2)); % For 1st circle moving
set(cir2,'xdata',z2(:,1),'ydata',z2(:,2)); % For 2nd circle moving
set(line1,'xdata',L1(:,1),'ydata',L1(:,2)); % For 1st line
set(line2,'xdata',L2(:,1),'ydata',L2(:,2)); % For 2nd line
drawnow;
pause(1/s1); %Stop for a while so we can see the graph
theta1=theta1+s1;
theta2=theta2-s1*r1/r2;
if theta1 > 360, theta1=theta1-360;end; %Reverse the direction at bondary line
if theta2 > 360,theta2=theta2-360;end;
end

執行程式:
move2_gear(8,30,48,20,20)
結果如下:

沒有留言: