5/16/07

第十章 凸輪運動

10.1抛物線曲面之計算

利用MATLAB程式可以計算抛物線之運動參數,其程式內容如下,呼叫之名稱與參數分別為:
function [y, yy, yyy]=parabol_cam(phi, phi_in, beta_range, direct, travel,rpm)

8-4.3.2 MATLAB計算程式
function [y, yy, yyy]=parabol_cam(phi,phi_in,beta_range,direct,travel,rpm)
% code = 2
% [y, yy, yyy]=parabol_cam(phi,phi_in,beta_range,direct,travel,rpm)
% phi=cam angle, degrees
% phi_in=starting cam angle, degrees
% beta_range=motion range, degrees
% direct=motion type; +1 for upward, -1 for downward
% travel=the follower travels(=1 for a unit of travel)
% rpm=cam rotation speed, rpm(=0 for not effective)
% Example: [y, yy, yyy]=parabol_cam(10,180,120,1,1,0)
d2r=pi/180;
th=phi*d2r; thinit=phi_in*d2r; beta=beta_range*d2r;
speed=rpm*2*pi/60;if rpm==0, speed=1;end;
theta=th-thinit;
thmed=thinit+beta/2;
thx=theta/beta;
if direct==1,
if th<thmed
y=2*thx^2;
yyy=4/beta/beta;
yy=yyy*th;
else
y=1-2*(1-thx)^2;
yy=4/beta*(1-thx);
yyy=-4/beta/beta;
end
else
if th<thmed
y=1-2*thx^2;
yyy=-4/beta/beta;
yy=yyy*th;
else
y=2*(1-thx)^2;
yy=-4/beta*(1-thx);
yyy=4/beta/beta;
end
end
y=y*travel;
yy=yy*speed*travel;
yyy=yyy*speed*speed*travel;



執行例:
1. 升程起始點120∘,β=60∘,h=0.8cm,角度為150∘時之位移、速度及加速度:
>> [y, yy, yyy]=parabol_cam(150,120,60,1,0.8,0)
y =          0.4   (cm)
yy =       1.5279  (cm/s)
yyy =      -2.9181  (cm/s2)

2. 返程起始點210∘,β=150∘,h=0.8,角度為250∘時之位移、速度及加速度:
>> [y, yy, yyy]=parabol_cam(250,210,150,-1,0.8,0)
y =      0.68622(cm)
yy =      -0.3259(cm/s)
yyy =     -0.46689(cm/s2)


範例8.1


某凸輪開始時先在0-120∘區間滯留,其高度為零。升程落於120-180∘,並於180-210∘滯留,其總升程為8公分。設刻度區間為10∘,凸輪則以等角速度旋轉,且其升程與返程均採用等加速度運動。求其變化曲線。

[解]:

1. 設ψ凸輪之迴轉角度,ψ=120-180∘為升程,轉折點為150∘,起點120∘,令θ = ψ-120,β = 60及h = 8代入公式8.9,可得升程之第一段(θ=120-150∘):
y(θ)=2h(θ/β)²=2(8)[(ψ-120)/60]²

2. 而升程之第二段(θ=150-180∘)則仍以ψ-120=θ,β=60及h=8代入公式8.10,得:
y(θ)=h[1-2(1-θ/β)²]=(8)[1-2(1-{ψ-120}/60]²

3. 返程之區間為210∘至360∘,轉折點為(210+360)/2=285∘,而β=360-210=150∘。設ψ-210=θ,代入返程一段的位移公式8.11,得第一區段(θ=210-285∘):
y(θ)=h[1-2(θ/β)²]=(8)[1-2({ψ-210}/150]²


4. 返程第二段之區間為285至360度,其轉折點與β均與第3項同,代入返程二段的位移公式,可以得到:
y(θ)=2h[1-(θ/β)²]=2(8)[1-({ψ-210}/150]²


由上面所得之函數可以利用電腦程式運算。針對升程(Demo8.1)與返程( Demo8.2)計算結果如下:
% Demo8_1
% 計算升程對應點之資料:位移,速度及加速度
theta=120:10:180;
for i=1:length(theta)
[ss(i), vv(i), aa(i)]=parabol_cam(theta(i),120,60,1,8,0);
end;
%(theta:對應角度; ss:位移, vv:速度, aa:加速度)
[theta' ss' vv' aa']

>> demo8_1
ans =
120.0000         0         0   29.1805
130.0000    0.4444    5.0930   29.1805
140.0000    1.7778   10.1859   29.1805
150.0000    4.0000   15.2789  -29.1805
160.0000    6.2222   10.1859  -29.1805
170.0000    7.5556    5.0930  -29.1805
180.0000    8.0000   -0.0000  -29.1805
%----------------------------------------

% Demo8_2
% 計算返程對應點之資料:位移,速度及加速度
theta=210:10:360;
for i=1:length(theta)
[ss(i), vv(i), aa(i)]=parabol_cam(theta(i),210,150,-1,8,0);
end;
%(theta:對應角度; ss:位移, vv:速度, aa:加速度)
[theta' ss' vv' aa']

%------------------------------------------

>> demo8_2
ans =
210.0000    8.0000         0   -4.6689
220.0000    7.9289   -0.8149   -4.6689
230.0000    7.7156   -1.6297   -4.6689
240.0000    7.3600   -2.4446   -4.6689
250.0000    6.8622   -3.2595   -4.6689
260.0000    6.2222   -4.0744   -4.6689
270.0000    5.4400   -4.8892   -4.6689
280.0000    4.5156   -5.7041   -4.6689
290.0000    3.4844   -5.7041    4.6689
300.0000    2.5600   -4.8892    4.6689
310.0000    1.7778   -4.0744    4.6689
320.0000    1.1378   -3.2595    4.6689
330.0000    0.6400   -2.4446    4.6689
340.0000    0.2844   -1.6297    4.6689
350.0000    0.0711   -0.8149    4.6689
360.0000    0.0000   -0.0000    4.6689

若就從動件之位移,利用電腦之資料或依10度為區間實際計算,可以得出其運動圖如圖8.19。




10.2 擺線曲線之函數


撰寫一套程式,仿抛物線之parabol_cam(phi, phi_in, beta_range, direct, travel,rpm),作一產生擺線曲線之函數。並計算下面之情況:總升程為50mm,升程以擺線運動經歷180度,其後滯留90度,再以擺線返程。凸輪之最小半徑為25mm。輸出資料除位移、速度及加速度外,並計算對應點之曲率半徑ρ、壓力角Φ。

[解]

function [y, yy, yyy, rho, alpha]=cycloidal_cam(r0,theta,theta_in,beta_range,direct,travel,rpm)
% code = 2
% [y, yy, yyy,rho,phi]=cycloidal_cam(r0,theta,theta_in,beta_range,direct,travel,rpm)
% r0:min. radius of the pitch surface.
% theta=cam angle, degrees
% theta_in=starting cam angle, degrees
% beta_range=motion range, degrees
% direct=motion type; +1 for upward, -1 for downward
% travel=the follower travels(=1 for a unit of travel)
% rpm=cam rotation speed, rpm(=0 for not effective)
% rho: radius of curvature
% alpha: pressure angle, in degrees.
% Example: [y, yy, yyy,rho,alpha]=cycloidal_cam(25,10,180,120,50,1,0)
d2r=pi/180;
th=theta*d2r; thinit=theta_in*d2r; beta=beta_range*d2r;
speed=rpm*2*pi/60;if rpm==0, speed=1;end;
theta=th-thinit;
thmed=thinit+beta/2;
thx=theta/beta;pi2=pi*2;
if direct==1,
y=thx-(1/pi2)*sin(pi2*thx);
yy=(1/beta)*(1-cos(pi2*thx));
yyy=(pi2/beta/beta)*sin(pi2*thx);
else
y=1-thx+(1/pi2)*sin(pi2*thx);
yy=-(1/beta)*(1-cos(pi2*thx));
yyy=-(pi2/beta/beta)*sin(pi2*thx);
end
y=y*travel;
yy=yy*speed*travel;
yyy=yyy*speed*speed*travel;
r=r0+y;
rho=(r.*r+yy.*yy).^1.5./(r.*r+2*yy.*yy-r.*yyy);
alpha=atan2(yy,r)/d2r;


執行例:

>> [y, yy, yyy,rho,alpha]=cycloidal_cam(25,[0:30:180],0,180,1,50,0)

y = 0   1.4417   9.7751    25   40.225   48.558       50
yy = 0   7.9577  23.873   31.831  23.873   7.9577      0
yyy = 0   27.566   27.566  3.8982e-015  -27.566  -27.566 -7.7963e-015
rho = 25   217.26   53.972   46.005   46.589    53.537    75
alpha = 0   16.749   34.47    32.482   20.103    6.1744    0


10.3 簡諧曲線之函數


8.5 撰寫一套程式,仿抛物線之parabol_cam(phi, phi_in, beta_range, direct, travel,rpm),作一產生簡諧曲線之函數。並計算下面之情況:總升程為50mm,升程以擺線運動經歷90度,其後滯留90度,再以擺線返程。凸輪之最小半徑為25mm。輸出資料除位移、速度及加速度外,並計算對應點之曲率半徑ρ、壓力角Φ。

[解]
function [y, yy, yyy, rho, alpha]=harmonic_cam(r0,theta,theta_in,beta_range,direct,travel,rpm)
% code = 2
% [y, yy, yyy,rho,phi]=harmonic_cam(r0,theta,theta_in,beta_range,direct,travel,rpm)
% r0:min. radius of the pitch surface.
% theta=cam angle, degrees
% theta_in=starting cam angle, degrees
% beta_range=motion range, degrees
% direct=motion type; +1 for upward, -1 for downward
% travel=the follower travels(=1 for a unit of travel)
% rpm=cam rotation speed, rpm(=0 for not effective)
% rho: radius of curvature
% alpha: pressure angle, in degrees.
% Example: [y, yy, yyy,rho,alpha]=harmonic_cam(25,10,180,120,50,1,0)
d2r=pi/180;
th=theta*d2r; thinit=theta_in*d2r; beta=beta_range*d2r;
speed=rpm*2*pi/60;if rpm==0, speed=1;end;
theta=th-thinit;
thmed=thinit+beta/2;
thx=theta/beta;
if direct==1,
y=0.5*(1-cos(pi*thx));
yy=(pi/2/beta)*sin(pi*thx);
yyy=(pi/beta)^2/2*cos(pi*thx);
else
y=0.5*(1+cos(pi*thx));
yy=-(pi/2/beta)*sin(pi*thx);
yyy=-(pi/beta)^2/2*cos(pi*thx);
end
y=y*travel;
yy=yy*speed*travel;
yyy=yyy*speed*speed*travel;
r=r0+y;
rho=(r.*r+yy.*yy).^1.5./(r.*r+2*yy.*yy-r.*yyy);
alpha=atan2(yy,r)/d2r;


執行例:
>> [y, yy, yyy,rho,alpha]=harmonic_cam(25,10,180,120,50,1,0)
y =      0.37059
yy =     -0.72444
yyy =     0.29117
rho =    25.654
alpha =   -1.6356


範例8.11



某凸輪開始在0-90∘區間在零高度滯留,然後提升後在150至180∘區間滯留,時高度為10公分,其餘則為返程。設刻度區間為10∘繪出其高度圖。凸輪則以等角速度旋轉,其升程與返程均採用等加速度運動。

[解]
1. 設ψ凸輪之迴轉角度,ψ=90-150∘為升程,轉折點為120∘,起點90∘,令θ = ψ-90,β = 60及h = 10代入公式8.9,可得升程之第一段(θ =90-120):
y(θ)=2h(θ/β)²=2(10)[(ψ-90)/60]²


2. 而升程之第二段(θ =120-150),則以ψ-90=θ,β=60及h=10代入公式8.10,得:
y(θ)=h[1-2(1-θ/β)²]=(10)[1-2{1-(ψ-90)/60}²]


3. 返程之區間為180∘至360∘,轉折點為(180+360)/2=270∘,β=360-180=180∘。設ψ-180=θ,代入返程一段的位移公式8.11,第一區段(θ =180-270)得:

y(θ)=h[1-2(1-θ/β)²]=(10)[1-2{1-(ψ-180)/180}²]


4. 返程第二段之區間θ =270-360度,代入返程一段的位移公式,可以得到:

y(θ)=2h(1-θ/β)²=2(10)[1-(ψ-180)/180]²


利用MATLAB程式可撰寫如下:
function [theta,y]=P8_11(theta,limit0,s)
% ex P8.11
% Inputs: theta: angles in row matrix
%         limit0: mark angles [(dwell) t0 (rise) t1 (dwell) t2(return)t3]
%         s:stroke
% Example: [theta,y]=P8_11([0:10:360],[90 150 180 360],30)
d2r=pi/180;
h=s;lm=limit0*d2r;
lm=[lm(1) (lm(1)+lm(2))/2 lm(2) lm(3) (lm(3)+lm(4))/2 lm(4)]/d2r;
LM=lm*d2r;
th=theta*d2r;
y=ones(size(th));
y(th<LM(1))=0;
y(th>=LM(3))=h;
y(th>=LM(1)&th<LM(2))=2*h*((th(th>=LM(1)&th<LM(2))-LM(1))/(LM(3)-LM(1))).^2;
y(th>=LM(2)&th<LM(3))=h*(1-2*(1-(th(th>=LM(2)&th<LM(3))-LM(1))/(LM(3)-LM(1))).^2);
y(th>=LM(4)&th<LM(5))=h*(1-2*((th(th>=LM(4)&th<LM(5))-LM(4))/(LM(6)-LM(4))).^2);
y(th>=LM(5)&th<=LM(6))=2*h*(1-(th(th>=LM(5)&th<=LM(6))-LM(4))/(LM(6)-LM(4))).^2;
plot(th/d2r,y);
xlabel('Theta in degrees');
ylabel('Follower displacement');
grid on;

執行結果:
>> [theta,y]=P8_11([0:10:360],[90 150 180 360],30)
theta =      0    10    20    30    40    50    60    70    80    90   100   110   120   130   140   150   160   170   180   190   200   210   220   230   240   250   260   270   280   290   300   310   320   330   340   350   360
y =          0            0            0            0            0            0            0            0            0            0       1.6667       6.6667           15       23.333       28.333           30           30           30           30       29.815       29.259       28.333       27.037        25.37
23.333       20.926       18.148           15       11.852       9.0741       6.6667       4.6296        2.963       1.6667      0.74074      0.18519           0




10.4 DWELL函數簡介


上述各函數作為從動件運動件運動包括其上升下降之位移、速度、加速度等均可以利用程式表示。為求統一,可歸納到dwell.m這個函數之中。其呼叫法為:

function [y,yy,yyy]=dwell(ctheta,range,pattern)

其中參數定義如下:
ctheta = 需要計算之凸輪角度,單位為度數。可以使用矩陣輸入之型式。
pattern = 運動的型式,二元素之列矩陣,其代碼如下:
1:等速運動uniform 2:抛物線parabolic 3:簡諧simple harmonic
4:擺線cycloidal 5:多項式polynomial motion
e.g. [4 3]:升程為擺線運動cycloidal;返程為簡諧運動harmonic motion
range =升程及返程之範圍,三元素列矩陣 e.g.[90 180 240]升程始於90 度,止於180度;
返程始於240 度,止於360。
輸出: y:位移(其最大值為1,故得到對應值後應與從動件之衝程相乘,才是真正的位移,其第一及第二導數相同);yy 對於凸輪角ctheta之第一導數; yyy 對於凸輪角ctheta之第二導數。

程式內容:

function [y,yy,yyy]=dwell(ctheta,range,pattern)
%
% This function determines the follower displacement and derivatives
% for a full rotation cam.  The routine is set up for the displacement
% schedule in Examples 6.7 and 6.8

% The input values are:

%ctheta   = individual cam angles (deg)--can be a matrix to be processed
%pattern  = denote the types of motion used(a 2 element-row matrix). types
%         are:
%         1:uniform 2:parabolic 3:simple harmonic 4: cycloidal
%         5:polynomial motion
%         e.g. [4 3]:cycloidal motion for rise and harmonic motion for
%         return
%range    =the degrees the specific motion starts(array of 3 elements), e.g.
%          [90 180 240] starts to rise at 90 deg. and ends at 180 deg.
%           starts to return at 240 deg. and ends at 360 deg.
% Output: y is for displacement, yy is the derivative of the displacement with
% respect to theta, and yyy the second derivative with respect  to theta.
% Example dwell(60,[90 180 240],[4 3]);
% Author:DSFon, BIME, NTU Revise Date:May 18, 2007

d2r=pi/180;
theta=ctheta*d2r;range=range*d2r;
dim=length(ctheta);
y=zeros(size(ctheta));yy=y;yyy=y;
for i=1:dim
if theta(i)>=range(3)    %for the last motion(downward)
mode=pattern(2);betax=2*pi-range(3);
switch mode,
case 1, [y(i),yy(i),yyy(i)]=uniform(theta(i), range(3),betax,-1);
case 2, [y(i),yy(i),yyy(i)]=parabolicm(theta(i), range(3),betax,-1);
case 3, [y(i),yy(i),yyy(i)]=harmonicm(theta(i), range(3),betax,-1);
case 4, [y(i),yy(i),yyy(i)]=cycloidm(theta(i), range(3),betax,-1);
case 5, [y(i),yy(i),yyy(i)]=polynorm(theta(i), range(3),betax,-1);
end;

elseif theta(i)>=range(2) % dewell on the top
y(i)=1;
elseif theta(i)>=range(1) % for the 1st motion(upward)
mode=pattern(1);betax=range(2)-range(1);
switch mode,
case 1, [y(i), yy(i), yyy(i)]=uniform(theta(i), range(1),betax,+1);
case 2, [y(i), yy(i), yyy(i)]=parabolicm(theta(i), range(1),betax,+1);
case 3, [y(i), yy(i), yyy(i)]=harmonicm(theta(i), range(1),betax,+1);
case 4, [y(i), yy(i), yyy(i)]=cycloidm(theta(i), range(1),betax,+1);
case 5, [y(i), yy(i), yyy(i)]=polynorm(theta(i), range(1),betax,+1);
end
end
end


%*********************************************

function [t1, t2, t3]=uniform(th, thinit,beta,direct)
% code = 1 for uniform motion
%th=cam angle, radians
%beta=motion range, radians
%thinit=starting cam angle, radians
%beta=motion range, radians
%direct=motion type; +1 for upward, -1 for downward
theta=th-thinit;
t1=theta/beta;
if direct==-1,
t1=1-t1;
end;
t2=direct*1/beta;
t3=0;


%*********************************************
function [t1, t2, t3]=parabolicm(th,thinit,beta,direct)
% code = 2 for parabolic motion
%th=cam angle, radians
%beta=motion range, radians
%thinit=starting cam angle, radians
%beta=motion range, radians
%direct=motion type; +1 for upward, -1 for downward
theta=th-thinit;
thmed=thinit+beta/2;thx=theta/beta;
if direct==1,
if th<thmed
t1=2*thx^2;
t3=4/beta/beta;
t2=t3*th;
else
t1=1-2*(1-thx)^2;
t2=4/beta*(1-thx);
t3=-4/beta/beta;
end
else
if th<thmed
t1=1-2*thx^2;
t3=-4/beta/beta;
t2=t3*th;
else
t1=2*(1-thx)^2;
t2=-4/beta*(1-th/beta);
t3=4/beta/beta;
end
end

%*********************************************

function [t1, t2, t3]=harmonicm(th,thinit,beta,direct)
% code = 3 for harmonic motion
%th=cam angle, radians
%beta=motion range, radians
%thinit=starting cam angle, radians
%beta=motion range, radians
%direct=motion type; +1 for upward, -1 for downward
theta=th-thinit;
t1=0.5*(1-cos(pi*theta/beta));
if direct==-1,  t1=1-t1;end;
t2=direct*(0.5*pi/beta)*sin(pi*theta/beta);
t3=direct*0.5*(pi/beta)^2*cos(pi*theta/beta);


%*********************************************
function [t1, t2, t3]=cycloidm(th,thinit,beta,direct)
%
% code = 4 for cycloidal motion
%th=cam angle, radians
%thinit=starting cam angle, radians
%beta=motion range, radians
%direct=motion type; +1 for upward, -1 for downward
theta=th-thinit;
t1=theta/beta-(0.5/pi)*sin(2*pi*theta/beta);
if direct==-1,t1=1-t1;end;
t2=direct*(1-cos(2*pi*theta/beta));
t3=direct*2*pi/beta/beta*sin(2*pi*theta/beta);

%*********************************************

function [t1, t2, t3]=polynorm(th,thinit,beta,direct)
%
% code = 5 for polynormial motion
%th=cam angle, radians
%thinit=starting cam angle, radians
%beta=motion range, radians
%direct=motion type; +1 for upward, -1 for downward
theta=th-thinit;
thx=theta/beta;
t1=thx*thx*thx*(10+thx*(-15+thx*6));
if direct==-1, t1=1-t1;end;
t2=direct*(30/beta)*thx*thx*(1+thx*(-2+thx));
t3=direct*(60/beta/beta)*thx*(1+thx*(-3 +2*thx));


本程式將配合其他凸輪繪製時呼叫使用。

Dwell執行範例8.10


下面plot_dwell.m為一執行Dwell函數之範例。其指令如下:
function plot_dwell(ctheta,s,pattern,range)

相關參數請參照後節之程式介紹。

function plot_dwell(ctheta,s,pattern,range)
%ctheta   = cam angle (deg)--can be a matrix
%pattern  = denote the type of motion used(a 3 element-row matrix)
%         1:uniform 2:parabolic 3:simple harmonic 4: cycloidal
%         5:polynomial motion
%         example [4 3]
%range    =the degrees the specific motion starts
% Output: y is for displacement, yy is the derivative of the displacement with
% respect to theta, and yyy the second derivative with respect % to theta.
% Example plot_dwell(0:10:360,2,[4 3],[90 180 240]);
figure(1);clf;
[y,yy,yyy]=dwell(ctheta,range,pattern)
h1=plot(ctheta,y*s,'b-',ctheta,yy*s,'k-',ctheta,yyy*s,'r-')
legend('Displacement','Velocity','Acceleration',3)
xlabel('Elapsed Angle, degrees')
grid


執行例
>>plot_dwell(0:10:360,2,[4 3],[90 180 240]);



範例8.10


就梢從動件之凸輪通常可利用課本圖8.26及公式8.26之轉軸進行模擬各角度之位置,假設一從動件之梢長為L,其偏置量為e,凸輪之基圓半徑為r0,衝程為s。可以利用dwell函數求各角度對應衝程,然後依公式8.26進行轉軸。設此程式名稱為pincam,其呼叫方式如下:
function [x,y]=pincam(cth,r0,s,e,L,range,pattern,cw)

其中,各參數定義如下:
輸入參數:
cth:凸輪角度,度數
r0:凸輪基圓半徑
e:偏置量
s:從動件衝程
L:從動件長度
cw:凸輪轉動方向(反時鐘為正,順時鐘為負)
pattern  = 運動的型式,二元素之列矩陣,其代碼如下:
      1:等速運動uniform 2:抛物線parabolic 3:簡諧simple harmonic
      4:擺線cycloidal 5:多項式polynomial motion
      e.g. [4 3]:升程為擺線運動cycloidal;返程為簡諧運動harmonic motion
range    =升程及返程之範圍,三元素列矩陣 e.g.[90 180 240]升程始於90 度,
      止於180度;返程始於240 度,止於360。



程式內容

function [x,y]=pincam(cth,r0,s,e,L,range,pattern,cw)
%Find the pin type cam with an offsect e
%Inputs:
%  cth:angle of cam, degrees
%  r0:radius of base circle
%   e:offset
%   s:stroke
%   L:length of pin
%   cw:rotation direction of cam(-counterclockwise,+clockwise
%pattern  = denote the type of motion used(a 3 element-row matrix)
%         1:uniform 2:parabolic 3:simple harmonic 4: cycloidal
%         5:polynomial motion
%         example [4 3]
%range    =the degrees the specific motion starts, eg.[90 180 240]
% Example: [x y]=pincam([10 60],5,2,1,10,[90 180 240],[4 3],-1)
figure(1);
clf;
th=cth*pi/180;
s0=sqrt(r0*r0-e*e);
for i=1:length(cth)
t=th(i)*cw;
A=[cos(t) -sin(t);sin(t) cos(t)];
[ym,yy,yyy]=dwell(cth(i),range,pattern);
x0=s0+ym*s;
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','red')
end
hold on;
plot([0 x],[0 y],'ro',x,y,'k-')
axis equal

執行例一:偏置量為零時
>> [x y]=pincam([0:10:360],6,5,0,10,[90 180 240],[4 3],-1)


執行例二:偏置量不為零時
>> [x y]=pincam([0:10:360],6,5,4,10,[90 180 240],[4 3],-1);




範例8.12



試就問題8.11所得從動子之抛物線運動之位移量,繪製一凸輪,設從動子屬刀緣接觸型,其基圓半徑為35mm,順時鐘方向旋轉。

[解]請參考圖8.6

繪圖程式撰寫如下:
function [rp,rb]=drawcam(r0,y,direct)
% To draw a cam profile with base radius of r0 and rise in y
% The program may work with P8_11
% Input: direct: +1 for clockwise; -1 for counterclockwise
%
% Example: [s,T]=drawcam(35,y)
d2r=pi/180;
nn=length(y);
LM=max(y+r0);
figure(2);
line([-LM LM]',[0 0]');line([0 0]',[-LM LM]');
if direct==1,
theta=linspace(0,360,nn)'*d2r;
else
theta=linspace(360,0,nn)'*d2r;
end
theta=theta+pi/2;
rb=[r0*cos(theta) r0*sin(theta)];
rp=[(r0+y').*cos(theta) (r0+y').*sin(theta)];
line(rb(:,1),rb(:,2),'color','r')
line(rp(:,1),rp(:,2));
axis equal;

執行結果:
>> [s]=drawcam(35,y,1)
s =
35            0
34.468       6.0777
32.889       11.971
30.311         17.5
26.812       22.498
22.498       26.812
17.5       30.311
11.971       32.889
6.0777       34.468
2.1431e-015           35
-6.3671        36.11
-14.251       39.154
-25       43.301
-37.496       44.686
-48.516        40.71
-56.292         32.5
-61.08       22.231
-64.013       11.287
-65  7.9602e-015
-63.83      -11.255
-60.384      -21.978
-54.848      -31.667
-47.523      -39.877
-38.805      -46.246
-29.167      -50.518
-19.128      -52.553
-9.2291      -52.341
-9.1849e-015          -50
8.1357       -46.14
15.074      -41.416
20.833      -36.084
25.473      -30.358
29.081      -24.402
31.754      -18.333
33.585      -12.224
34.651      -6.1098
35 -8.5725e-015







範例8.13


試就問題8.11所得從動子之抛物線運動之位移量,繪製一凸輪,設從動子屬滾子型,其半徑為8mm,基圓半徑為40mm,順時鐘方向旋轉。
[解]請參考圖8.29

繪圖程式撰寫如下:
function [rp,rb]=draw_roller_cam(r0,r,y,direct)
% To draw a cam profile with base radius of r0 and rise in y
% The program may work with P8_11
% Input: direct: +1 for clockwise; -1 for counterclockwise
%
% Example: [rp,rb]=draw_roller_cam(40,6,y,1)
d2r=pi/180;
nn=length(y);
LM=max(y+r0);
figure(2);
line([-LM LM]',[0 0]');line([0 0]',[-LM LM]');
if direct==1,
theta=linspace(0,360,nn)'*d2r;
else
theta=linspace(360,0,nn)'*d2r;
end
theta=theta+pi/2;
rb=[r0*cos(theta) r0*sin(theta)];
rp=[(r0+y').*cos(theta) (r0+y').*sin(theta)];
line(rb(:,1),rb(:,2),'color','r');
line(rp(:,1),rp(:,2));
th=linspace(0,2*pi,50)';
for i=1:nn,
line(rp(i,1)+r*cos(th),rp(i,2)+r*sin(th));
end
axis equal;


執行結果:
>> [rp,rb]=draw_roller_cam(40,8,y,1)
rp =
2.4493e-015           40
-6.9459       39.392
-13.681       37.588
-20       34.641
-25.712       30.642

------------------------------------------
57.265      -10.097
55 -1.3471e-014
51.064        9.004
46.115       16.784
40.415       23.333
34.188       28.687
27.616       32.912
20.833       36.084
13.934       38.284
6.9781       39.575
1.2246e-014           40
rb =
2.4493e-015           40
-6.9459       39.392
-13.681       37.588
-20       34.641
-25.712       30.642

------------------------------------
25.712       30.642
20       34.641
13.681       37.588
6.9459       39.392
1.2246e-014           40




圖P8.1所得之結果作一切線切於各滾子內圈之弧即可得其工作曲線,而所採用的點數愈多,其內、外包絡線愈為顯明。

範例8.14



試就問題8.11所得從動子之抛物線運動之位移量,繪製一凸輪,設從動子屬平板型,基圓半徑為100mm,順時鐘方向旋轉。

[解]請參考圖8.32

繪圖程式撰寫如下:
function [rp,rb]=draw_plat_cam(nn,r0,s,d,range,pattern,cw)
% The program work with dewell.m
%Inputs:
%  nn:number of points in process
%  r0:radius of base circle
%  re:radius of the roller
%   a:distance between two axes of cam and roller
%   s:stroke
%   d:length of plate follower
%   cw:rotation direction of cam(-counterclockwise,+clockwise
%pattern  = denote the type of motion used(a 3 element-row matrix)
%         1:uniform 2:parabolic 3:simple harmonic 4: cycloidal
%         5:polynomial motion
%         example [4 3]
%range    =the degrees the specific motion starts, eg.[90 180 240]
% Example: draw_plat_cam(36,5,2,2,[90 180 240],[4 3],-1)
figure(1);clf;d2r=pi/180;
th=linspace(0,360,nn);
[y,ff]=dwell(th,range,pattern);
theta=(th+90)*d2r;%The follower is in upright position
if cw==-1,theta=pi-theta;end
rb=[r0*cos(theta);r0*sin(theta)];
%
%rp=[(r0+y*s).*cos(theta)+cw*ff*s.*sin(theta);...
%    (r0+y*s).*sin(theta)-cw*ff*s.*cos(theta)];
%line(rp(1,:),rp(2,:));%Draw working circle
for i=1:nn,
rr=r0+y(i);
xx=rr*cos(theta(i));yy=rr*sin(theta(i));
line([0 xx], [0 yy]);
dx=d*sin(theta(i));dy=d*cos(theta(i));
line([xx+dx xx-dx],[yy-dy yy+dy],'linewidth',2,'color','red');
end
line(rb(1,:),rb(2,:),'color','r');%draw base circle
axis equal;



執行結果:
>> draw_plat_cam(36,5,2,2,[90 180 240],[4 3],1)


圖P8.14 平板從動子之凸輪軌跡


10.5 凸輪運動之進階分析


如何繪製凸輪之外緣曲線,是探討凸輪的主題。下面程式為針對板式從動件所產生之凸輪外緣曲線,並且依所需之運動型式進行設計。


平板從動件之凸輪

camwork程式為一平板式從動件對凸輪運動時之相對軌跡曲線之繪製,其法與前面之drawcam大致上相同。通常係讓凸輪固定,然後由從動件依設定之角度進行繪製。本程式之呼叫法如下:

  function camwork(rb,rise,range,pattern,platdim,direction,ainc)

參數說明:

pattern  = 運動的型式,二元素之列矩陣,其代碼如下:
  1:等速運動uniform 2:抛物線parabolic 3:簡諧simple harmonic
      4:擺線cycloidal 5:多項式polynomial motion
      e.g. [4 3]:升程為擺線運動cycloidal;返程為簡諧運動harmonic motion
range    =升程及返程之範圍,三元素列矩陣 e.g.[90 180 240]升程始於90 度,
      止於180度;返程始於240 度,止於360。
rb:基圓半徑
rise:從動件升程
platdim:從動件平板尺寸,其型式如 [Ll,Lr,t], 其中,L1,Lr分別為從動件中心線前與後之板面     長度,t:從動件之厚度
direction:凸輪轉動方向, +1 為逆時鐘;-1 為順時鐘。
ainc: 迴轉角度分量,度


本程式呼叫 dwell.m, bush.m, camfollow.m及 frame.m等函數,若需要板面傾斜某一角度,則需另呼叫trans4.m程式,此函數在第二章中有關轉動座標之函數中已經介紹過,可以引用。

function camwork(rb,rise,range,pattern,platdim,direction,ainc)
%Draw a plate cam in diferent positions
% Call dwell.m, bush.m, camfollow.m, frame.m
%Inputs:
%   rb:radius of the cam base circle
%   rise:rise of the follower
%range    =the degrees the specific motion starts(array of 3 elements), e.g.
%          [90 180 240] starts to rise at 90 deg. and ends at 180 deg.
%           starts to return at 240 deg. and ends at 360 deg.
%pattern  = denote the types of motion used(a 2 element-row matrix). types
%         are:
%         1:uniform 2:parabolic 3:simple harmonic 4: cycloidal
%         5:polynomial motion
%         e.g. [4 3]:cycloidal motion for rise and harmonic motion for
%         return
%platdim:the plate dimension, in forms of [Ll,Lr,t], in which
%        L1,Lr:length of plage in front of and behind the centerline,
%        t:thickness of the axle of the plate follower.
%   direction:cam direction, +1 for counterclockwise; -1 for clockwise
%   ainc: angular increment, degrees
%Examples: camwork(5,2,[100 180 270],[3 3],[2 3 1],1,60)
platdim(find(platdim<=0.2))=0.2;
d2r=pi/180;
camangle=0:1:360;
th=camangle*d2r;
[s,ss,sss]=dwell(camangle,range,pattern);
s=s*rise;ss=ss*rise;
xcam=(rb+s).*cos(th)-ss.*sin(th);
ycam=(rb+s).*sin(th)+ss.*cos(th);
ycam=ycam*direction;
[coords]=bushing(-rb,0,0);
xb=coords(:,1);yb=coords(:,2);
[coords]=bushing(rb/7,0,0);
xbush=coords(:,1);ybush=coords(:,2);
figure(1);
clf;
axis equal;
thi=[0:ainc:360]';
nx=length(thi);
bush=line('xdata',[],'ydata',[],'linewidth',1.5,'color','r','erasemode','none');
base=line('xdata',[],'ydata',[],'linewidth',1,'color','b','erasemode','none');
cam=line('xdata',[],'ydata',[],'linewidth',2,'color','k','erasemode','none');
frame1=line('xdata',[],'ydata',[],'linewidth',1,'color','r','erasemode','none');
frame2=line('xdata',[],'ydata',[],'linewidth',1,'color','r','erasemode','none');
for k=1:nx-1,
follow(k)=line('xdata',[],'ydata',[],'linewidth',1,'color','k','erasemode','none');
end
line1=line('xdata',[],'ydata',[],'linewidth',1,'color','k','erasemode','none');
bead=line('xdata', [], 'ydata', [],'marker','o','markersize', 6, 'erasemode',...
'xor');
set(bush,'xdata',xbush,'ydata',ybush);
set(base,'xdata',xb,'ydata',yb);
set(cam,'xdata',xcam,'ydata',ycam);
%set(bush,'xdata',xbush,'ydata',ybush);
thr=thi*d2r;
tho=thi;if direction==-1,tho=360-thi;end;
[coordf]=camfollow(platdim(1),platdim(2),platdim(3),rise);
coords=coordf;
linest=[];
[frame0]=frame(platdim(3),rise,1,0);
set(frame1,'xdata',frame0(:,1)+rb,'ydata',frame0(:,2))
[frame0]=frame(platdim(3),rise,-1,0);
set(frame2,'xdata',frame0(:,1)+rb,'ydata',frame0(:,2))

for i=1:length(thr)-1
[s,ss,sss]=dwell(thi(i),range,pattern);
s=s*rise;ss=ss*rise;
xx=(rb+s)*cos(thr(i))-ss*sin(thr(i));
yy=((rb+s)*sin(thr(i))+ss*cos(thr(i)))*direction;
coords=coordf;
coords(:,1)=coordf(:,1)+rb+s;
xf=rb+s;yf=0;
[coords]=trans4(coords,tho(i),5);
[linef]=trans4([0 0;xf yf],tho(i),5);
text(linef(2,1),linef(2,2),num2str(tho(i)));
linest=[linest;0 0;linef];
set(bead,'xdata',xx,'ydata',yy);
set(follow(i),'xdata',coords(:,1),'ydata',coords(:,2));
end
set(line1,'xdata',linest(:,1),'ydata',linest(:,2));
axis equal;

function [coords] = bushing(rr,x0,y0)
% Determine the coordinates of the anchor seat
% rr: radius of the shaft
% x0,y0: center coordinates of the shaft
d2r=pi/180;
theta=[360:-10:0]*d2r;
r=abs(rr);
rx=r*cos(theta);ry=r*sin(theta);
if rr<0,
rx=rx+x0;
ry=ry+y0;
coords=[rx' ry'];
return;
end;
rx1=rx/2;rx2=-rx1;
ry1=ry/2;ry2=-ry1;
r4=r+r/4;r3=r/3;
bx=[ 0   0 0 -r -r -r4 -r4  r4 r4 -r  r r];
by=[r3 -r3 0  0 -r -r  -r4 -r4 -r -r -r 0];
coords(:,1)=[bx rx rx1 rx2]'+x0;
coords(:,2)=[by ry ry1 ry2]'+y0;
hold off;


function [coords]=camfollow(tl,tr,thickness,stroke,theta)
%Detemine the coordinates of the plate follower
%Inputs:
%   tl:length of plate in front of center line
%   tr:length of plate behind the cneter line
%   thickness:thichness of the plate
%   stroke:rise of the follower
%   theta:the slant angle(degrees) of plate
%Outputs:coords:coordinates of the plate
%coordinates for bock and outside form
t=thickness;s=stroke*1.5;tm=t/2;
coords=[0 0;0 tl; tm tl; t tm;t+s tm;t+s -tm;t -tm;tm -tr;0 -tr;0 0];
if nargin==5 % draw a slant follower
coords=trans4(coords,theta,5);
end

function [coords]=frame(thickness,stroke,mode,theta)
% determine the coordinate of follower seat
% Inputs:
%     thickness:the thckness of the follower shaft
%     stroke:rise of the follower
%     theta:slant angle of the follower, degrees
%      mode:+1 for one side, -1 for another side
t=thickness*1.05;s=stroke*1.2;
t0=thickness+stroke;tx=t/2;tm=t/3;
if mode==1
coords=[t0 -tx];
tt=t0+tm;
while 1
coords=[coords;tt -tx;tt-tm -tx-tm;tt -tx];
tt=tt+tm;
if tt-t0>s, break;end
end
end
if mode==-1
coords=[t0 tx];
tt=t0+tm;
while 1
coords=[coords;tt tx;tt-tm tx+tm;tt tx];
tt=tt+tm;
if tt-t0>s, break;end
end
end
if nargin==4,
coords=trans4(coords,theta,5);
end


執行範例:


基圓半徑5公分,升程2公分,分佈範圍為[100 180 270]度,升程與返程均使用簡諧運動型式,從動件為平板,左2公分,右3公分,板軸厚度為1公分,試將圓周以60均分繪出其從動件位置及對應之凸輪曲線。

>>camwork(5,2,[100 180 270],[3 3],[2 3 1],1,60)




10.6 滾輪從動件之凸輪

以滾子從動件運轉之凸輪可以利用camwork2.m進行繪製,其呼叫法如下:

  function camwork2(rb,ro,rise,offset,range,pattern,direction,ainc)

參數說明:

pattern  = 運動的型式,二元素之列矩陣,其代碼如下:
  1:等速運動uniform 2:抛物線parabolic 3:簡諧simple harmonic
      4:擺線cycloidal 5:多項式polynomial motion
      e.g. [4 3]:升程為擺線運動cycloidal;返程為簡諧運動harmonic motion
range    =升程及返程之範圍,三元素列矩陣 e.g.[90 180 240]升程始於90 度,
      止於180度;返程始於240 度,止於360。
rb:基圓半徑
ro:滾子從動件半徑
rise:從動件升程
offset:從動件之中心線偏置量
direction:凸輪轉動方向, +1 為逆時鐘;-1 為順時鐘。
ainc: 迴轉角度分量,度


camwork2程式呼叫 dwell.m, bush.m, camfollow2.m及 frame.m等函數。同camwork,若滾子軸需要板面傾斜某一角度,則需另呼叫trans4.m程式,此函數在第二章中有關轉動座標之函數中已經介紹過,可以引用。


function camwork2(rb,ro,rise,offset,range,pattern,direction,ainc)
%
%function camwork2(rb,ro,rise,offset,range,pattern,direction,ainc)
%find roller cam curve using envelop technique
% Call dwell.m, bush.m, camfollow.m, frame.m
%Inputs:
%   rb:radius of the cam base circle
%   ro:radius of the roller follower
%   rise:rise of the follower
%   offset:the offset of centerline of follower
%   range =the degrees the specific motion starts(array of 3 elements), e.g.
%          [90 180 240] starts to rise at 90 deg. and ends at 180 deg.
%           starts to return at 240 deg. and ends at 360 deg.
%   pattern= denote the types of motion used(a 2 element-row matrix). types
%         are:
%         1:uniform 2:parabolic 3:simple harmonic 4: cycloidal
%         5:polynomial motion
%         e.g. [4 3]:cycloidal motion for rise and harmonic motion for
%         return
%   direction:cam direction, +1 for counterclockwise; -1 for clockwise
%   ainc: angular increment, degrees
%Examples: camwork2(5,2,1.5,1,[100 180 270],[3 3],1,60)
%Designed by D S Fon, BIME, NYU. Dated June 10, 2002
d2r=pi/180;
camangle=0:1:360;
th=camangle*d2r;
[s,ss,sss]=dwell(camangle,range,pattern);
s=s*rise;ss=ss*rise;
rho=rb+ro+s;
alpha=atan((rho./(offset*offset+rho.*rho)-offset).*ss);
phi=alpha-atan(offset./rho)/d2r;
offset0=abs(offset);
dd=sqrt((rb+ro)^2-offset*offset);%distance from center of roller to x-axis
ct=cos(th);st=sin(th);
UU=(dd+s).*st-(offset+ss).*ct;
VV=(dd+s).*ct+(offset+ss).*st;
xcam=offset*st+(dd+s).*ct-sign(ct)*ro./sqrt(1+(UU./VV).^2);
ycam=(xcam.*UU+(dd+s).*ss)./VV;
ycam=ycam*direction;
xf=offset*st+(dd+s).*ct;
yf=(-offset*ct+(dd+s).*st)*direction;
arg=ycam.^2+xcam.^2-(yf.^2+xf.^2);
ycam(arg>0)=[];
xcam(arg>0)=[];
[coords]=bushing(-rb,0,0);
xb=coords(:,1);yb=coords(:,2);
[coords]=bushing(-abs(offset),0,0);
xoff=coords(:,1);yoff=coords(:,2);
figure(1);
clf;
thi=[0:ainc:360]';
nx=length(thi);
base=line('xdata',[],'ydata',[],'linewidth',1,'color','b','erasemode','none');
offcircle=line('xdata',[],'ydata',[],'linewidth',1,'color','r','erasemode','none');
pitch=line('xdata',[],'ydata',[],'linewidth',1,'color','r','erasemode','none');
cam=line('xdata',[],'ydata',[],'linewidth',2,'color','k','erasemode','none');
frame1=line('xdata',[],'ydata',[],'linewidth',1,'color','r','erasemode','none');
frame2=line('xdata',[],'ydata',[],'linewidth',1,'color','r','erasemode','none');
for k=1:nx-1,
follow(k)=line('xdata',[],'ydata',[],'linewidth',1,'color','k',...
'erasemode','none');
linex(k)=line('xdata',[],'ydata',[],'linewidth',1,'color','k',...
'erasemode','none');
end
set(base,'xdata',xb,'ydata',yb);
set(cam,'xdata',xcam,'ydata',ycam);
set(offcircle,'xdata',xoff,'ydata',yoff);
set(pitch,'xdata',xf,'ydata',yf);
thr=thi*d2r;
tho=thi;if direction==-1,tho=360-thi;end;
[coordf]=camfollow2(ro,ro/2,rise);
coordf(:,2)=coordf(:,2);
coords=coordf;
maxline=rb+ro*2+rise;
offset0=-offset*direction;
[frame0]=frame(ro/2,rise,1,0);
set(frame1,'xdata',frame0(:,1)+rb+ro,'ydata',frame0(:,2)+offset0);
[frame0]=frame(ro/2,rise,-1,0);
set(frame2,'xdata',frame0(:,1)+rb+ro,'ydata',frame0(:,2)+offset0);
for i=1:length(thr)-1
[s,ss,sss]=dwell(thi(i),range,pattern);
s=s*rise;ss=ss*rise;
ct=cos(thr(i));st=sin(thr(i));
xf=offset*st+(dd+s)*ct;
yf=(-offset*ct+(dd+s)*st)*direction;
[coords]=trans4(coordf,tho(i),5);
coords=trans4(coords,[xf yf],1);
linef=[maxline 0;0 0;0 offset0];
[linef]=trans4(linef,tho(i),5);
linef=[linef;xf yf];
text(xf,yf,num2str(tho(i)));
set(linex(i),'xdata',linef(:,1),'ydata',linef(:,2));
set(follow(i),'xdata',coords(:,1),'ydata',coords(:,2));
end
axis equal;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [coords] = bushing(rr,x0,y0)
% Determine the coordinates of the anchor seat
% rr: radius of the shaft
% x0,y0: center coordinates of the shaft
d2r=pi/180;
theta=[360:-10:0]*d2r;
r=abs(rr);
rx=r*cos(theta);ry=r*sin(theta);
if rr<0,
rx=rx+x0;
ry=ry+y0;
coords=[rx' ry'];
return;
end;
rx1=rx/2;rx2=-rx1;
ry1=ry/2;ry2=-ry1;
r4=r+r/4;r3=r/3;
bx=[ 0   0 0 -r -r -r4 -r4  r4 r4 -r  r r];
by=[r3 -r3 0  0 -r -r  -r4 -r4 -r -r -r 0];
coords(:,1)=[bx rx rx1 rx2]'+x0;
coords(:,2)=[by ry ry1 ry2]'+y0;
hold off;


function [coords]=camfollow2(r,thickness,stroke,theta,npts)
%[coords]=camfollow2(r,thickness,stroke,theta,npts)
%This program gives coordinates for different type of cam followers
% Inputs:
%    r        : radius of roller if any
%    thickness: thickness of rod
%    stroke   : the maximum stroke movement
%    theta    : angle that foller inclines
%    npts     : No. of points to draw the roller, default=30, npts=3 for point follower
%    if thickness >2r, the orign will be transfered to the edge of circle or the point,
%       otherwise, it is located at the center of the circle.
%Designed by D.S.Fon, BIME, NTU, dated June 6, 2002
t=thickness;tm=t/2;
s=stroke;
if stroke>0,s=stroke*1.5;end
th1=0;th2=2*pi;
loc=0;
if t<2*r,
th1=asin(abs(tm)/r);
th2=th2-th1;
else
t=2*r,th1=pi/2;th2=th2-th1;
loc=1;
end
nn=30;if nargin==5,nn=npts;end;
th=linspace(th1,th2,nn);
rx=r*cos(th);ry=r*sin(th);
coords=[rx' ry';s+r -tm;s+r tm;rx(1) ry(1)];
if loc,coords=trans4(coords,[r 0],1);end
if nargin==4 % draw a slant follower
coords=trans4(coords,theta,5);
end


function [coords]=frame(thickness,stroke,mode,theta)
% determine the coordinate of follower seat
% Inputs:
%     thickness:the thckness of the follower shaft
%     stroke:rise of the follower
%     theta:slant angle of the follower, degrees
%      mode:+1 for one side, -1 for another side
t=thickness*1.05;s=stroke*1.2;
t0=thickness+stroke;tx=t/2;tm=t/3;
if mode==1
coords=[t0 -tx];
tt=t0+tm;
while 1
coords=[coords;tt -tx;tt-tm -tx-tm;tt -tx];
tt=tt+tm;
if tt-t0>s, break;end
end
end
if mode==-1
coords=[t0 tx];
tt=t0+tm;
while 1
coords=[coords;tt tx;tt-tm tx+tm;tt tx];
tt=tt+tm;
if tt-t0>s, break;end
end
end
if nargin==4,
coords=trans4(coords,theta,5);
end



執行範例:

基圓半徑5公分之凸輪,其從動件為滾子,直徑為2公分。設此組凸輪之升程1.5公分,從動件之偏置量為1公分。分佈範圍為[100 180 270]度,升程與返程均使用簡諧運動型式,從動件為平板,左2公分,右3公分,板軸厚度為1公分,試將圓周以60均分繪出其從動件位置及對應之凸輪曲線。

將上述資訊化為指令參數,執行結果如下:
>> camwork2(5,2,1.5,1,[100 180 270],[3 3],1,60)






其他凸輪動畫


Interactive Cam Mechanism Design