2007年6月1日 星期五

HW11

B94611023生機二許惠善

我本週(5/24)有來上課。

1.某凸輪開始時先在0-100∘區間滯留,然後提升後在200至260∘區間滯留,其高度(衝程)為5公分,其餘l由260∘至360∘則為返程。升程採用等加速度運動,返程之運動型式自定。設刻度區間為10∘,試繪出其高度、速度及加速度與凸輪迴轉角度間之關係。

本題利用老師網路上的程式即可作答。唯dwell函數有部分錯誤,dwell內的parabolicm函數需做修改,方可使用,其錯誤不大,所以僅附在本次作業之後,不再說明。

我所設定的突輪返程運動形式仍選擇用等加速度運動。
函數呼叫為 plot_dwell(0:10:360,5,[2 2],[100 200 260])

[說明]
第一項表示角度:選擇0-360度之區間做圖,故input0:10:360
第二項表示從動件衝程:題目設定為5cm,故input 5
第三項表示形式:因為皆為等加速度運動,所以應選擇2:parabolic 曲
第四項表示運動始末的角度:升程由100度開始運動且200度終止,故前兩項各為100、200,返程始於260度,故第三項為360




由圖可見,其函數圖形在紫色框框範圍內時,雖然速度值仍為斜直線,即加速度值應為水平線,然而加速度值卻掉下來了。原因是因為我們取間隔10度做變化,於是連線變為斜直線。

故我先對plot_dwell稍做更改,將原程式h1=plot(ctheta,y*s,'b-',ctheta,yy*s,'k-',ctheta,yyy*s,'r-')部分,
改為h1=plot(ctheta,y*s,'bo',ctheta,yy*s,'ko',ctheta,yyy*s,'ro'),再重新存成plot_dwell_point,目的是將這十個數據標示成點。

重新呼叫一次:
plot_dwell(0:1:360,5,[2 2],[100 200 260]) %線段部分改為一度一數據
hold on;
plot_dwell_point(0:10:360,5,[2 2],[100 200 260])
%將十個點以o表現出來

如此一來圖形清楚且正確多了



2.設凸輪之半徑為15公分,以順時針方向旋轉,其從動件為梢型,垂直接觸,長為10公分,從動件之運動係依照第二項之運動型式。試繪出此凸輪之工作曲線。

此題仍然依老師程式pincam呼叫即可得到

[x y]=pincam([0:10:360],15,5,0,10,[100 200 260],[2 2],-1);

[說明]
第一項表示角度:選擇0-360度之區間做圖,故input0:10:360
第二項表示突輪基圓半徑:題目要求為15cm,故input為15
第三項表示從動件衝程:題目設定為5cm,故input 5
第四項表示偏置量:設為0
第五項表示從動件長度:題目設定為10cm,故input 10
第六項表示運動始末的角度:升程由100度開始運動且200度終止,故前兩項各為100、200,返程始於260度,故第三項為360
第七項表示形式:因為皆為等加速度運動,所以應選擇2:parabolic 曲線
第八項表示凸輪轉動方向順時針為-1,逆時針為+1,題目所求為順時針,故input -1


圖形表示突輪與從動件的關係

3.你能讓此凸輪迴轉嗎?

本題由老師題目程式pincam做更改即可,原程式碼是將所有突輪上的點與從動件的關係依突輪固定表示之。

簡單的來思考這個問題,這支程式碼原先是先繪出所有線段,最後再迴圈外把突輪畫出來。所以我們可以先將從動件底端與圓心的線(這條是跑動畫不需要的線段)刪除。再者,我們無論圖形如何轉動,都應該有所有突輪的數據(也就是輪廓),最後我們去思考在轉動時,一次只能有一條從動件的關係在圖上。

所以應該不難想出,大致上的想法是利用兩組迴圈組成此程式,第一次迴圈中先將整個突輪的形狀相對關係求出,第二次在去做繪圖及旋轉

程式碼如下:

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

figure(4);
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出圖形,在此刪除,否則所有的線會同時留在圖上
%line(X(1,1:2),X(2,1:2));
%line(X(1,2:3),X(2,2:3),'linewidth',3,'color','red')



end

%本angle是為了旋轉圖形90度之用
angle=[cosd(90) -sind(90);sind(90) cosd(90)];

%第二次迴圈才是真正要畫出圖形以及執行動畫
for i=1:length(cth)
clf ;
t=th(i)*cw;
[ym,yy,yyy]=dwell(cth(i),range,pattern);

%因為圖形在迴轉,所以應該和桿接觸點會固定在某一軸上
%所以我們先旋轉突輪
%因為xy(突輪外觀)是在上一個迴圈裡出現,所以我們每次更改數值時並不會影響xy的值


%原程式設計為圖形基準為x方向,但旋轉到了突輪各角度的方向,所以我一開始先將圖形轉回至正x方向(水平)
o=x*cos(-t)+y*sin(-t)
p=x*sin(-t)-y*cos(-t)


%然而題目所求為y方向(垂直),故我應將圖形旋轉至y方向上
m=o*cosd(90)+p*sind(90)
n=o*sind(90)-p*cosd(90)

%先畫出整個突輪的外型
plot([0 m],[0 n],'ro',m,n,'k-')
axis([-50 50 -50 50])
grid on;

%運算從動件位置
x0=s0+ym*s;
Sx=[0 x0 x0+L;e e e];

%本處老師程式原設計為旋轉某角度到突輪的各點使從動桿連接,然而現在我們不需要,只需要由水平轉回垂直向即可。
X=angle*Sx;

%為使圖形清楚,我仍然把從動桿底端到突輪中心線刪除
%line(X(1,1:2),X(2,1:2));

%畫線成為動畫
line(X(1,2:3),X(2,2:3),'linewidth',3,'color','red')
pause(0.5)

end
hold on;
grid on


呼叫為:
[x y]=pincam_rotate([0:10:360],15,5,0,10,[100 200 260],[2 2],-1);
(各項說明同上題)

動畫如下: