GROUP 6

code、流程圖(bdf)或設計圖(flowchart)的jpg檔

作法

  • RS232部分
  1. 要改的部份只有後半段的吃input部分,舊有的send_buf陣列保留,多兩個int變數tmp、read。tmp是要存從stdin讀到的數字,也就是角度;read是要存後來經過修正要傳給版子的度數。因為要將角度轉換成servo的pulse width,所以read = (8)*(tmp)/9 +70,這樣一來,傳給版子的pulse width就可以直接給data輸出讓servo轉到指定角度。
  2. 要寫一個if判斷式來判斷輸入的角度合不合法,若角度大於180或小於0都會出現”degree Rejected!”。
  3. 之後把read轉型成char存到send_buf陣列,Writefile和Readfile透過相同的port來寫和讀這個char。如果這個char正確地被讀到,就會出現”Received degree:XX”。

以下為主要修改的部份

char send_buf[8] = {0};
	int tmp;
	int read=0; 
	while( send_buf[0] != 'q' ){
 
		cout << "Enter the degree 0~180:";
		cin >> tmp;
 
		if(tmp>180||tmp<0)
		{
			cout <<"degree Rejected!"<<endl<<endl;
			continue;
		}
 
		read = (8)*(tmp)/9 +70;
 
		send_buf[0]=(char)read;
 
 
		bWriteRC = WriteFile(m_hCom, send_buf , 1, &iBytesWritten, NULL);
 
		Sleep(30); // Wait for data transfer
 
		bReadRC = ReadFile(m_hCom, &sBuffer, 1, &iBytesRead, NULL);
		if( !iBytesRead )
			cout <<"Received nothing." << endl << endl;
		else
			cout << "Received degree:" << tmp << endl << "--END OF RECEIVED DATA--" << endl << endl;
		sBuffer[0] = '\0';
	};
  • ECHO_DE2:其中又包含三個component:br_gen、uart_receiver、uart_transmitter,本次實驗對於此三部分皆未做修改。
    • br_gen:為鮑率產生器,因為在非同步傳輸為了能讓資料可以正確的傳送和接收,需制定固定的資料傳輸速率,即為此處所使用的鮑率(每秒所傳送的位元數),
      且之所以divisor=81的原因在於系統所提供的clock為50M Hz,而所需要的計數器頻率為50000000/(9600*8*8)=81.~Hz,因此需對原先的clock做除頻的動作
      以求得所需的頻率。

    • uart_receiver:其以取樣頻率bclkx8(鮑率的八倍,因為取樣資料時必須在資料穩定的時刻,因此在每個位元的一半時間取樣)來計數。在RS-232的介面規格中
      ,若接受到一個低電位訊號,若沒有維持到4個bclkx8的週期,就不將其視為起始位元,若維持了四個bclkx8周期,即可在後來的每8個bclkx8週期取樣一次。當資料
      位元都接收到時,需判斷下一個BYTE是否為停止BYTE,若為高電位,就將並列資料輸出,若是低電位,則該資料無效。

    • uart_transmitter:主要功能將並列資料轉換成為串列的資料傳送出去,且需依鮑率的頻率來做同步傳送的動作。在RS-232的傳輸介面規格中,沒有傳送資料
      時皆維持高電位,有資料要傳送時要先傳送一個byte的低電位起始byte,再將並列資料的位元傳送出去。

    • ECHO_DE2:其包含三個input以及兩個output,input分別為接到系統提供的50MHz clock、並未用到所以將其接至VCC的reset,用以接收的pin腳RX。而
      output為用以傳輸的pin腳TX以及傳輸給lab4_code的陣列。ECHO_DE2主要的功能在於將由RS-232所讀到的binary數字傳給馬達。

  • lab4_code:其主要功能包含將馬達轉至所輸入的角度,以及按順逆按鈕產生順時鐘以及逆時鐘的轉動。
    其使用五個input分別為順逆的兩個按鈕、系統的clock輸入、控制順逆速度的除頻為200Hz(檔名400Hz為檔名錯誤)的clock,以及由ECHO_DE2 component所傳輸而來的binary數字陣列。
    而output為pwn,是Pulse Width Modulation的縮寫,用以調整脈波的寬度,檔案中使用一個計數器和比較器來產生pwn訊號。servo每一次脈波的周期大於20ms,在信號為高準位'1'的時間來決定所要轉的角度,如高準位的時間為0.7ms時轉至0度,其後每相差0.02ms,角度相差2.25度,所以可採用pwn的方式來控制servo轉動的角度。首先以10000Hz頻率產生0.01ms的震盪周期,計數2000次做為脈波訊號的周期20ms,所以要產生0度的控制訊號只需設定pwn的比較值為70即可產生0.7ms的脈波訊號。
    而所修正的部分在於將由ECHO_DE2傳送而來的binary陣列經由conv_integer(input)使其轉換為integer後傳輸給所需要與pwn比較的data值。而為了防止servo執行順時針或逆時針轉動後不停的回至原先使用者所輸入的角度,用一個if條件判斷式來判斷當目前使用者所輸入的角度與先前不同時再轉動(以data_keep存上一輪使用者assign的值,與目前使用者輸入的值做比較)。在順時針逆時針方面,當順時針按紐按下時,若此時的角度並非最大的180度(對servo來說是值:230)則可以執行順時針,逆時針的按鈕按下時,若此時的角度並非最小的0度(對servo來說是值:70)則可以執行逆時針。此外,順逆時針所使用的頻率為200Hz,為f_divider400Hz除頻後所得的頻率,用此頻率是為了避免順逆時針轉動過快。

以下為主要修改的部份

 process(clk1,but_shame,but_ni,clk2)
   begin   
     if (clk2'event and clk2='1') then 
 
        if(but_ni='1' and but_shame='1') then
 
             if(data_keep/=conv_integer(input)) then
               data_keep<= conv_integer(input);
               data <=conv_integer(input); 
             end if;
        end if;    
 
     end if;
 
     if (clk2'event and clk2='1') then 
       if(but_shame='0') then
           if(data < 230) then
			 data<=data+1;
 
		   end if;
		end if;
 
        if(but_ni='0') then
           if(data > 70) then
             data<=data-1; 
 
           end if;
        end if;
      end if;
 
   end process;
  • f_divider400Hz:為一般的除頻器,用以產生較小的頻率給順逆時針按鈕所使用。

回答問題

什麼是步進馬達?什麼是直流馬達?


  • 步進馬達

步進馬達的種類依照結構來分可以分成三種:
永久磁鐵PM式(permanent magnet type)、可變磁阻VR式(variable reluctance type)、以及複合式(hybrid type)。
電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩造成電動機轉子的轉動;
步進馬達的驅動原理也是如此,不過若以驅動訊號的觀點來看,一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流訊號與交流訊號,而步進馬達則是使用不連續的脈波訊號,三種電壓訊號的電壓時間圖如圖


步進馬達係由微電腦控制器所控制,當控制訊號自微電腦輸出後,隨即藉由驅動器將訊號放大,達到控制馬達運轉的目的。


另外與一般馬達特性曲線最大的不同點是步進馬達有兩條特性曲線,同時步進馬達可以正常操作的範圍僅限於引入轉矩之間。下圖中所示之各個動態特性將分別敘述如下:


q引入轉矩(pull-in torque)輸入訊號同步起動、停止時的最大力矩,因此在引入轉矩以下的區域中馬達可以隨著輸入訊號做同步起動、停止、以及正反轉
q最大自起動轉矩(maximum starting torque)當起動脈波率低於10pps時,步進馬達能夠與輸入訊號同步起動、停止的最大力矩。
q最大自起動頻率(maximum starting pulse rate)指馬達在無負載(輸出轉矩為零)時最大的輸入脈波率,此時馬達可以瞬間停止、起動。
q脫出轉矩(pull-out torque)能夠與輸入訊號同步運轉,但無法瞬間起動、停止時的最大力矩,因此超過脫出轉矩則馬達無法運轉
q最大響應頻率(maximum slewing pulse rate)最大響應頻率是指馬達在無負載(輸出轉矩為零)時最大的輸入脈波率,此時馬達無法瞬間停止、起動。
q保持轉矩(holding torque) 保持轉矩是指當線圈激磁的情況下,轉子保持不動時,外界負載改變轉子位置時所需施加的最大轉矩。


步進馬達轉矩與轉速之關係為指數式反比,也就是當轉速越大時轉矩越小,相反的轉速越小則轉矩越大,這種現象是因為激磁線圈可以 視為電感與電阻的串聯電路,當激磁時線圈的電流與電阻、電感的關係如下式所示:
其中時間常數 。由式(1)可知線圈之激磁電流是隨時間而變,而輸出轉矩則與電流大小成正比,因此當轉速慢時線圈電流有足夠的時間達到
最大值,因此輸出轉矩較大;相同的,當轉速提高時激磁訊號變換快速,使得線圈電流減弱造成輸出轉矩下降。

步進馬達之應用
由於步進馬達所使用的驅動訊號為脈波訊號,因此以普通直流電源加在馬達繞組時,馬達是不會連續轉動的。此外,步進馬達的電源線最少有五條,
其中一條為共接點,其餘四條分別為A相、A+相、B相、B+四相的輸入點,有些步進馬達的電源線共有六條,其中兩條為共接點,將A相、A+相,與B相、
B+四相的輸入點分成兩組。要分辨何者為共接點,何者為輸入點以及正、反轉的激磁順序,可以先用三用電表之歐姆檔量測線圈之電阻值,理論上各相的
電阻值應相等,找出共接點後再以低於額定電壓電流之直流電源一一測試,便可找出步進馬達正、反轉的激磁順序。


  • 直流馬達


馬達之基本構造示意圖,一般的電動機在構造上可以分成五個部份:

直流馬達之基本構造

電樞(armature)或轉子(rotor)為馬達旋轉的部份,材質為永久磁鐵、線圈(外接電源)、導線(無外接電源)或特殊形狀之導磁材料。
場繞組(field)或定子(stator)材質為永久磁鐵或是線圈(外接電源)。
滑環(slip ring)或換向器(commutator,如直流馬達之碳刷)連接轉子繞線至外部換向器用於改變電樞繞線之電流方向,使用永久磁鐵為轉子材質的馬達則無需滑環或換向器。
軸承(bearing)可使用滾珠、滾針、滾柱、含油自潤軸承,主要提供轉子穩固的支撐。
馬達控制器(motor controller)包含控制馬達的輸出扭矩、速度或轉角,以及大型馬達起動、停止之順序控制。


雖然電動機的種類相當多,不過各種電動機的基本操作原理都相同,都是利用電流流過定子產生磁場,當轉子也通上電流時由於切割定子所產生
的磁力線而生成旋轉扭矩造成電動機轉子的轉動。如下圖所示,假設轉子之繞組只有一組線圈時,當轉子線圈通上電流時由於切割定子所產生的磁
力線而生成旋轉扭矩,致使轉子轉動,以下圖而言,定子的磁力線由左至右,而轉子的電流方向為由右方流入左方流出,因此生成的旋轉扭矩使得
轉子順時針旋轉。

電動機基本原理示意

直流馬達之基本構造均與上圖類似,其他種類電動機的基本構造則只是在定子部份有所差異,例如交流感應電動機由於交流電源有相角差之緣故,
因此定子的磁場由固定磁場變成旋轉磁場,此外場繞組(定子)的接線方法也有所謂“Y接法”、“Δ接法”、或是“Y-Δ接法”。
*曲線圖 直流馬達與其他馬達最大的差異在於其“轉速-轉矩”與“電流-轉矩”特性均為線性關係,因此在一般需要做到轉速、轉矩控制的場合中,若控
制精度不需很高的情況下,同常以直流馬達作為致動器是較為經濟的選擇。

  • 兩種馬達之比較



步進馬達 直流馬達
定位問題 定位不良的問題,尤其於垂直解析度愈高時須以較長的掃瞄時間來解決。連續性之運轉馬動,無定位問題,不須等待時間,因而縮短掃瞄的時間。
垂直解析度 步進馬達的運轉與垂直解析度無關。可調整直流馬達之平均轉速,或連結於直流馬達之傳動裝置進而調整速度,以滿足垂直解析度。
掃瞄時間受限於高垂直解析度要求時所衍生的問題,須耗費過長等待時間,因而掃瞄速度明顥緩慢。可調整直流馬之平均轉速或相對速度,可滿足所需之垂直解析度,而縮短掃瞄時間。
生產成本步進馬達的單價較高。直流馬達之單價平均約為步進馬達的二分之一到三分之一,將大幅度降生產成本。

PWM訊號主要能有哪些應用?

「脈衝寬度調變(Pulse Width Modulation;PWM)」允許處理器的數位輸出 訊號可以控制或驅動類比電路,可應用於測量、通訊、功率控制、訊號轉換等。

數位控制

以數位訊號來控制類比電路,可以使系統成本和功率損耗大幅地減少。而 由於多數的微控制器和DSP 已經內建了PWM 控制器,因此很容易實現。 簡言之,PWM 能將類比訊號準位編成數位碼的技術。透過高解析度的計 數器,將一個方波的工作週期調變,藉此,將特定的類比訊號準位編碼。PWM 訊號仍然是數位的,因為在任何時候,直流供電不是開啟的就是關閉的。藉由連 續的開啟和關閉脈衝,將電壓或電流供應給類比負載。在負載上有直流供電時稱 為「開啟時間(on-time)」,沒有時稱為「關閉時間(off-time)」。假設頻寬 足夠,任何一個類比值都可以利用PWM 來編碼。

通訊和控制

PWM 應用於其優點:從處理器到控制器的訊號都是數位的;因此不需要 數位類比轉換(DAC)。由於訊號都是數位的,所以雜訊效應可以降低。雜訊 只有在唯一一種情況下才會影響數位訊號:雜訊強度大到足以將邏輯1 改變成邏 輯0,反之亦然。 利用PWM 訊號來控制類比電路的另一個好處是它可以增加 抗雜訊的能力,這也是為何有時可以使用PWM 來通訊的主要原因。從一個類比 訊號切換至PWM 可以大幅增加通訊通道的長度。

硬體控制器

許多種微控制器和處理器都內建有PWM 單元。其內部具有的PWM 單元,用 每一個PWM單元都可以選擇開啟時間和一個週期時間(period)的長度。

SoC 處理器的PWM

一般的SoC 處理器可以內建PWM 控制器,這是利用SoC 內部的標準計 時器來產生PWM 訊號。透過符合暫存器(match register)可以選擇特定的應用 項目。

PWM 應用的一個具體的例子:利用PWM 來控制剎車器(brake)。

簡言之,剎車器就是將車軸僅僅夾住。在許多剎車器中,抓力或制動力的大小是 由一個類比輸入訊號控制。施加在剎車器上的電壓或電流越大,抓力就越大。 PWM 控制器的輸出可以連接至一個開關,此開關位於電源和剎車器之間。為了 產生更多的制動力,軟體只需要增加PWM 輸出的工作週期。

這次實驗所使用的訊息傳輸格式,為何要如此設計?

這次訊息傳輸的格式,是傳一個角度的ASCII,但是是經過變換的。假設讀到的角度是180,那麼先是用integer去讀它,然後在轉換成pulse width,也就是180*(8/9)+70=230,之後將230轉型為ASCII CODE是230的char,存在send_buf送給DE2,此時DE2所接收到的訊息即是pulse width,因此直接根據此訊息servo可以改變角度。

至於為什麼要如次設計,因為我們每次都傳送一個char給servo,剛好LED有八個可以顯示八個bits(0~256),而角度從0~180的pulse width 是70~230,正好在八個bits可以傳輸的範圍,所以我們就以一個byte為傳輸單位。

做實驗曾經卡住的地方、解決方法

  1. 一開始在製作轉接線時,對於每個元件都不太熟悉,像是杜邦連接端子要怎麼包才對、剝線鉗和端子夾的使用等等。認識了元件之後要實際動手做也會發生不小心把蕊線剪太短或者杜邦連接端子沒包好之類的蠢事。
  2. 因為平常沒在寫C++的關係研究了RS-232Echo範例檔一下,對函式使用方式不太熟悉。像是陣列會怎麼讀還有Readfile和Writefile怎麼用。因為助教給的範例檔只要輸入一個字母就好,現在是要輸入一個角度(0~180),在Input的地方也花了一些時間搞定。
  3. 很蠢的8/9*temp。這個白痴bug de了好久,後來才想到要(8/9)*(temp)…呵呵。
  4. 奇怪的RS-232接線,一開始一直”Receive Nothing”,想說是code出什麼大問題咧,結果請教了別組組員才知道是RS-232接觸有問題,後來要用很特別的力道and特別的角度固定它,它才會正常的傳輸,這就要感謝我們RS-232達人曾怡茹小姐。


實驗心得

很快的來到了學期的第四個實驗…

因為比較晚開工助教又回家了,我們向同學借了馬達跟rs232傳輸線。

這次的重點是步進馬達的轉動控制,一開始接線頭的時需要有經驗同學的幫助,因為線太小我們又都粗手粗腳的,接線的部份耗的挺久的…

時間來到了一個小時過後,我們總算開始程式執行的部份,實驗教育最重要的一環,同時也是核心價值”Learning by Doing!” 做中學,毫不猶豫的我們,提起板子一燒第一個code是關於馬達的定角轉動,另外一個是用 C++ 寫成並傳輸到板子的code,我們開始分工進行,平行coding,很快的遇到了第一個問題,如何把char轉成int?

想了很久又去查了 ASCII CODE 後來才發現有現成的函式可用…接下來傳輸的部份根據原來的code 我們也不停的查詢 c++ 的函式集,參考了很多參數的傳法才漸漸理出個頭緒,當一切愒起來是這麼完美的時候,我們的指令似乎馬達還是感應不到,這時只好用力搬動 RS232的接觸部份以輔助實驗,馬達轉了但角度怪怪的,在繼續調整轉換的式子,de 出史上無敵蠢的bug –> 先乘除後加減! 一定得記取教訓啊! 另外要說的一點就是,盡量讓低階的東西(硬體語言)做簡單的事情,複雜的運算給C++,在把簡單的整數傳給硬體才不會出包!

最後,我們的最後一個問題,就是如何在兩個mode之間轉換不要讓rs232的值一直傳,而使另外一個 mode 用 button 調整角度不會讓轉完後馬達一直想轉到rs232的值,我們討論了很久,用一個 keeper 去寄上一個輸入的值跟目前的有沒有一樣?如果一樣就不要管他,部一樣的話就用新的複寫過去並成為下一次的keeper。

總之一切都很順利我們感謝很多人的幫忙!

 
course/lab4.txt · 上一次變更: 2008/11/30 00:12 來自 manga
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki