以下為主要修改的部份
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'; };
以下為主要修改的部份
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;
步進馬達的種類依照結構來分可以分成三種:
永久磁鐵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-Δ接法”。
*曲線圖
直流馬達與其他馬達最大的差異在於其“轉速-轉矩”與“電流-轉矩”特性均為線性關係,因此在一般需要做到轉速、轉矩控制的場合中,若控
制精度不需很高的情況下,同常以直流馬達作為致動器是較為經濟的選擇。
| 步進馬達 | 直流馬達 | |
|---|---|---|
| 定位問題 | 定位不良的問題,尤其於垂直解析度愈高時須以較長的掃瞄時間來解決。 | 連續性之運轉馬動,無定位問題,不須等待時間,因而縮短掃瞄的時間。 |
| 垂直解析度 | 步進馬達的運轉與垂直解析度無關。 | 可調整直流馬達之平均轉速,或連結於直流馬達之傳動裝置進而調整速度,以滿足垂直解析度。 |
| 掃瞄時間 | 受限於高垂直解析度要求時所衍生的問題,須耗費過長等待時間,因而掃瞄速度明顥緩慢。 | 可調整直流馬之平均轉速或相對速度,可滿足所需之垂直解析度,而縮短掃瞄時間。 |
| 生產成本 | 步進馬達的單價較高。 | 直流馬達之單價平均約為步進馬達的二分之一到三分之一,將大幅度降生產成本。 |
「脈衝寬度調變(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為傳輸單位。
很快的來到了學期的第四個實驗…
因為比較晚開工助教又回家了,我們向同學借了馬達跟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。
總之一切都很順利我們感謝很多人的幫忙!