本文面向初學者,請多各位高手包涵。我在此特別緻謝勤爲本先生爲我提供的幫助。
步進電機
步進電機就是一種受脈衝控制的電機,步進電機接收到一系列某種調製順序的脈衝,做出相應的反應,轉到相應的角度或者相應的圈數。
步進電機的選擇
我選擇應用廣泛價格最便宜的步進電機,型號爲28BYJ-48。
這款電機的型號名28BYJ-48的意義爲:“帶減速齒輪(J)的永磁(Y)四相八步(48)步進電機”。詳細的電機參數如下表所示:
型號 |
28BYJ-48 |
安裝孔距 |
35mm |
電壓 |
5V |
相數 |
4相 |
減速比 |
1/8 |
步距角 |
5.625° |
驅動方式 |
4相8拍 |
空載牽入頻率 |
600Hz |
空載牽出頻率 |
900Hz |
轉矩 |
1≥34.3mN.m |
淨重 |
40g |
空載牽入頻率:是指步進電機在裸機運行狀態,即沒有任何外加負載的時候,從靜止到轉動的狀態,能夠成功啓動步進電機而且不丟步的最高頻率。
空載牽出頻率:是指步進電機在已經啓動的狀態下,不斷地增加頻率,直到達到步進電機的極限,步進電機開始呈現出抖動且出現丟步運行,此時的頻率。
28BYJ-48的空載牽入頻率600Hz,所以控制脈衝最小週期應爲T=1/600=1.7ms,即設定的脈衝週期應大於1.7ms。
丟步:步進電機是由電機裏旋轉的磁場驅動的,理論上步進電機所走的步數就是磁場的步數。但如果電機旋轉的速度跟不上磁場旋轉的腳步,這種步進電機比磁場少走幾步,即爲丟步現象。丟步時步進電機會發生抖動。
一般來說發生丟步有以下原因:
1.電機所帶的負載過大,超出其能力範圍,因而造成丟步。
2.電壓太低,驅動力不夠造成丟步。
3.步進電機發熱後,磁鐵的磁性會下降,因此會在運轉一段時間後丟步。
4.大部分步進電機並不能高速旋轉,設定速度太快會造成丟步。
28BYJ-48步進角度爲5.625度,我用的這款這個減速比爲1/8,
5.625/8 ≈0.703125,
360/0.703125=512
即512個脈衝步進電機轉一圈。
28BYJ-48接口意義
序號 |
顏色 |
描述 |
1 |
紅 |
+5V輸入 |
2 |
橙 |
A |
3 |
黃 |
B |
4 |
粉 |
C |
5 |
藍 |
D |
28BYJ-48步進示意圖
上電時,Sb接通,Sa、Sc、Sd斷開,B磁極與轉子0號,3號對上,此刻,轉子的1號,4號就與C磁極,D磁極分開,產生錯齒。轉子的2號,5號就與D磁極,A磁極分開,產生錯齒。當接通Sc,Sa、Sb、Sd斷開時,因C磁極磁力與1號,4號磁力的相互作用,電機轉動後,1號,4號與C磁極對齊。此刻0號,3號與A磁極,B磁極分開,產生錯齒,2號,5號就與A磁極,D磁極分開,產生錯齒。如此這般四個磁極輪番順序供電,電機就轉動起來。
28BYJ-48有如圖2.2的三種工作方式。我準備實現雙四拍和八拍工作方式。單四拍的轉的快,但是力矩小。八拍轉的慢,但是力矩大。雙四拍介於兩者之間
28BYJ-48脈衝時序圖
驅動板的選擇
智龍開發板所發出的脈衝信號特別的小,僅僅依靠這脈衝信號,是不足以驅動步進電機的。因此我需要一個驅動板,由驅動板接受智龍開發板發出的脈衝信號,然後將之放大,並傳到步進電機,從而驅動部件電機工作。這裏我選擇廣泛適用於智能車的L298N。四個輸出口恰好能驅動一個28BYJ-48。
驅動板L298N
L298N是意法半導體制造的電機驅動芯片,其特點是適應性好,成本低,能經受較大電流,較高電壓,抗干擾能力強。L298N的供電範圍爲電流2A,電壓5V到35V。額定功率25W。此外還具有過壓過流保護功能。所以說用L298N這個芯片來完全能帶動28BYJ-48。
驅動方式及接線
由智龍開發板的PWM口產生所需要的脈衝,然後通過智龍開發板的GPIO接口傳輸到驅動板L298N的四個輸入接口上,然後經L298N放大後,由四個輸出口傳輸到步進電機的四個信號輸入口上,從而驅動步進電機。
步進電機驅動方式示意圖
28BYJ-48除了的+ 5V(紅色)不接,其他的依次接到驅動板L298N的OUT1到OUT4上,驅動板的輸入口IN1到IN4依次接到智龍開發板的PWM0到PWM3所對應的GPIO口上,L298N的GND接智龍開發板的GND,+5V接VCC。
具體的接線管腳如下表所示:
管腳接法
智龍開發版 |
L298N輸入 |
L298N輸出 |
28BYJ-48 |
GPIO 06 |
IN 1 |
OUT 1 |
A(黃) |
GPIO 92 |
IN 2 |
OUT 2 |
B(藍) |
GPIO 46 |
IN 3 |
OUT 3 |
C(粉) |
GPIO 47 |
IN 4 |
OUT 4 |
D(橙) |
VCC |
+ 5V |
|
|
GND |
GND |
|
|
軟件及系統部分的設計
Linux系統的配置與MIPS交叉編譯環境的搭建
在Linux系統的單片機上進行嵌入式驅動和程序的開發,因爲運行Linux系統的開發板的CPU主頻很低,處理能力很弱,只適合進行程序的運行,不適合做程序的開發和調試。因此,我需要在電腦上安裝一個Linux系統作爲宿主機,然後在宿主機的Linux上配置好MIPS芯片交叉編譯環境。然後驅動和軟件的編寫,編譯在宿主電腦上進行,將編譯好的智龍開發板用的Linux系統內核和用戶程序通過串口軟件,和網線的鏈接傳到開發板上進行調試。根據軟件實際運行的狀況,在宿主機上對源代碼進行修改,重複調試,最終得到想要的效果。
Linux系統的選擇與虛擬機選擇及安裝
因爲智龍開發板上運行的是32位Linux系統,所以宿主機上必須安裝32位的Linux系統,這樣編譯出的程序才能正常運行。爲了便於使用,我選擇在虛擬機中安裝。我用的是32位版的Ubuntu12.04。Ubuntu是一個主流的,開源的,免費的,操作方便的,界面友好的Linux系統的發行版。至於虛擬機,我用的是VMware公司的VMware Workstation 10.0,爲了穩定考慮,我沒有選擇最新版。VMware 可以從網上下載到,具體的VMware安裝的具體過程和教程網上都可以找到詳細的教程,我在這裏就不再贅述。
Linux系統的安裝
1.Ubuntu12.04可以從網上找到下載的資源,選擇32位版本,將ISO文件下載到硬盤上。打開之前安裝好的的VMware,點擊菜單欄,點擊文件下拉菜單,點擊新建,創建新的虛擬機。
2.在彈出框中,出現典型(推薦)和自定義(高級)。選擇自定義(高級)。
3.虛擬機的硬件兼容性:找到並點擊VMware Workstation 10.0。
4.安裝來源:點擊稍後安裝。
5.選擇客戶機操作系統:找到並點擊Ubuntu。
6.命名虛擬機:將虛擬機命名“我的Ubuntu”,並選擇空白的硬盤存放這個虛擬機。
7.處理器配置:處理器數量1,每個處理器核心數4(這樣就可以在編譯時開啓4線程編譯,編譯速度會提高很多),這個不要超過電腦CPU的物理核心數。我的電腦爲4核,因此我選取4核。
8.此虛擬機的內存:4096MB,同樣不要超過電腦的物理內存的大小。
9.網絡類型:使用網絡地址轉換(NAT)
10.選擇I/O控制器類型:LSI Logic(L)
11.選擇磁盤類型:SCSI(s)
12.選擇磁盤:創建新虛擬磁盤(V)
13.指定磁盤容量:20GB(根據硬盤實際大小來決定)。
14.指定磁盤文件:選擇剛纔的目錄迎來存放虛擬機文件。
15.已準備好創建虛擬機:點擊完成
16.進入虛擬機設置選項,找到並點擊使用ISO映像文件,然後找到剛纔下載的Ubuntu12.04的IOS鏡像文件地址。
17.點擊開啓虛擬機,開始安裝系統的引導。語言選擇中文(簡體)
18.選擇安裝中下載更新,勾選安裝第三方軟件。
19.安裝類型:選擇清除整個磁盤(不會影響到虛擬機外的文件)。
20.選擇時區:上海。
21.鍵盤佈局:英語(美國)。
22.設置用戶名,計算機名,密碼,之後系統開始安裝。
23.系統安裝完畢以後點擊重啓計算機,等電腦開機後,輸入密碼即可進入安裝好的Ubuntu 12.04。
Linux的一些常用的操作
終端的操作:Linux系統的全部操作都在終端裏實現,所以熟悉命令模式終端的常用操作是非常必要的。很多情況下,使用終端進行管理要比使用圖形界面鼠標操作要更加的快速,有很多功能圖形界面無法完成,只能依靠終端的命令操作。
1.啓動終端:使用快捷鍵Ctrl+Alt+T或者用鼠標點開終端在快捷欄上的圖標。
2.查看當前所在的文件夾裏面有那些文件:ls
3.進入目錄:cd XXX(XXX爲目錄名)
4.返回上一層目錄:cd ..
5.刪除文件或目錄:rm -r XXX
6.安裝軟件:sudo apt-get install XXX
7.卸載軟件:sudo apt-get remove XXX
8.解壓縮tar格式的壓縮包:tar zxvf XXX.tar.gz
9.運行當前目錄下的文件:./XXX
10.更改權限:sudo chmod u+x XXX
11.重啓:reboot
Vi是類似於記事本的文本代碼編輯器,命令模式操作更加強大,完全依靠鍵盤操作,需要記住很多的按鍵和命令組合,被稱爲高手的專用編輯器。由於非常複雜,這裏我僅列舉一些能用到的常用操作,更加複雜的操作可以到網上找到。
Vi/Vim的常用命令:
1,開啓:vim XXX
2.vim有三種模式,Vim的左下角會顯示當前模式,使用“i”進入插入模式或使用“:”進入命令模式或使用“ESC”來切換編輯模式。
3.命令模式下:“:”“q!” 強制退出
4.“:”“wq”保存並退出
5.“:”“set number”顯示行號
6.“i”在光標處插入字符
7.“x”刪去光標所在處字符
安裝 VMware Tools
VMware官方提供了一種強化套件那就是VMware Tools。在安裝後可以實現直接將文件從虛擬機中拖出,將文件直接拖入虛擬機中,自動捕獲和釋放鼠標光標,虛擬機分辨率隨着窗口自動變化等便利的功能。
1.在Vmware菜單欄中點擊虛擬機,選擇安裝VMware Tools(T)
2.打開終端輸入以下命令:將VMware Tools拷貝到虛擬機中解壓。
3.cp /media/VMware\ Tools/VMwareTools-9.6.2-1688356.tar.gz
4. tar zxvf VMwareTools-9.6.2-1688356.tar.gz
5.進入解壓的目錄:cd vmware-tools-distrib
6.用超級管理權限運行安裝腳本:sudo ./vmware-install.pl
執行上述命令以後,會進入安裝腳本,在安裝的開始,會詢問很多軟件是否安裝配置應該如何選擇之類的問題,要求回答yes或者no。這裏我們什麼都都不要輸入,只需要一直按回車鍵,意思是使用默認設置,直到結束安裝。安裝完後會顯示enjoy,然後重新啓動系統即可生效。
Ubuntu12.04交叉編譯環境的搭建
1.下載龍芯可用的32位mips的gcc壓縮包gcc-4.3-ls232.tar.gz,新建一個文件夾opt,將壓縮包複製到opt文件夾中。
2.將文件解壓縮到opt文件夾中:sudo tar zxvf gcc-4.7.3-mips32.tar.gz
得到一個文件夾gcc-4.7.3-mips32。
3.修改系統的環境變量,需要在普通賬戶,和root賬戶中均添加環境變量。這個很重要,否則在編譯的時候會找不到gcc-4.7.3-mips32。
(1)取得root權限:sudo su
(2)用vim打開bash:vim .bashrc
(3)在打開的文檔中最後一行加入以下內容指出gcc-4.7.3-mips32的位置
export PATH=/home/用戶名/gcc/gcc-4.3-ls232/bin:$PATH
(4)進入/root文件夾,將(3)中的命令同樣添加到/root/.bashrc
Windows下的軟件SecureCRT與TFTP的安裝與使用
SecureCRT是一款串口終端程序,運行時看起來類似於Linux下的終端的程序,配置完連上對應的串口後就能像在本地的終端一樣用命令操作智龍開發板上的PMON命令與Linux系統的命令。Tftp是數據傳輸協議,在電腦端打開TFTP軟件主機與智龍開發板就能通過網線進行數據的傳輸。智龍開發板的軟件包裏提供了編譯好的內核與一個LED測試程序,可以用來檢測一下軟件的安裝配置與硬件上的引腳連接是否正確。
Tftp32與SecureCRT的配置
1.打開Tftp32,Current Directory項點擊Browse選擇內核(vmlinuz)和文件LEDtest所在的目錄。Server interfaces選擇本機的IP地址。
2.將智龍開發板通過USB轉串口線與電腦相連,智龍開發板通過網線與電腦連在同一個路由器組成的局域網下,智龍開發板通過USB線供電。
3.打開設備管理器,找到“端口”點開,查看裏面USB-SERIAL(COM XX)XX是幾號COM口比如COM7
4.打開SecureCRT點擊,新建會話,協議選Serial,下一步,端口:COM7,波特率115200,反選右邊的RTS/CTS如圖:
SecureCRT配置
用LED走馬燈程序測試配置是否正確
1.軟件配置好以後,先擦除開發板裏原先的數據:mtd_erase /dev/mtd1
2.然後給開發板配置網口IP,查PMON命令可知:
set ifconfig syn0:192.168.1.11(假設主機的ip地址是192.168.1.10,那麼智龍的IP地址必須與主機在同一網關下即同在192.168.1.XX下)有了IP才能傳輸數據。
3.從主機下載內核:devcp tftp://192.168.1.10/vmlinuz /dev/mtd0
4.設置啓動參數,從mtd0啓動引導:set al /dev/mtd0
5.燒寫文件系統(事先確保文件夾裏有nfsyaffs-uart2-null.img):
devcp tftp://192.168.1.10/nfsyaffs-uart2-null.img /dev/mtd1 yaf nw
6.設定根目錄位置:set append " root=/dev/mtdblock1"
7.設定板子COM口通信波特率:set append " $append console=ttyS2,115200"
8.不使用ramdisk內核啓動起來後進入系統中運行的第一個腳本,掛載之後文件系統只讀:
set append " $append noinitrd init=/linuxrc rw rootfstype=yaffs2"
9.重啓進入開發板上的Linux系統:reboot
10.在智龍開發板的Linux系統啓動開發板網口:ifconfig eth0 up
11.在智龍開發板的Linux系統設置板子的IP:ifconfig eth0 192.168.1.11
12.下載編譯好的LEDtest文件:tftp -r LEDtest -g 192.168.1.10
13.給予LEDtest文件運行權限:chmod u+x LEDtest
14.運行LED走馬燈程序:./LEDtest
如智龍開發板上的5顆LED燈的輪流亮起,則硬件連接與軟件配置均正確。
智龍開發板的驅動編寫與Linux內核編譯
智龍開發板源碼在編譯前的配置準備
從網上可以下載到智龍開發板用的龍芯匹配的Linux源碼,我要做的就是編寫一個能讓步進電機運轉起來的驅動,然後將驅動編譯到內核中,最後通過應用程序調用驅動,從而做到操控步進電機的正轉,反轉。
1.新建一個文件夾如re,將源碼的壓縮包1b-linux-3.0.tar.gz複製到re文件夾內,用終端將壓縮包解壓: tar zxvf 1b-linux-3.0.tar.gz
2.進入得到的文件夾:cd 1b-linux-3.0
3.將智龍開發板的默認配置ls1c_defconfig,拷貝到linux源代碼根目錄,並改名爲.config:
cd arch/mips/configs/
cp ls1c_defconfig ../../../.config
4.安裝圖形化配置工具Ncurses:sudo apt-get install libncurses5-dev
5.用編輯器修改1b-linux-3.0/arch/mips/loongson/ls1x/ls1c中makefile:
(1)退回到mips文件夾:cd ..
(2)進入目標文件夾:cd arch/mips/loongson/ls1x/ls1c
(3)用vim編輯:vim Makefile
(4)將內容改成如下圖 :
6.將網卡改成自動檢測(用vim或者圖形文本編輯器均可):
(1)用vim打開1b-linux-3.0/arch/mips/loongson/ls1x/ls1c中的
Platform.c文件:vim platform.c
(2)將static struct plat_stmmacphy_data phy0_private_data ={}
中的 .phy_addr =0, 改爲圖 所示:
讓智龍開發板的PWM產生可控制的脈衝的驅動設計
在前面的步進電機的控制方式我提到,步進電機是由一定規律的脈衝控制驅動的,所以我的目標便是生成能讓步進電機動起來的脈衝波形。
定製脈衝的寬度Pulse Width Modulation,從而得到想要的週期與佔空比,從而控制步進電機。28BYJ-48的信號輸入口有4個接口,每個接口接受一路脈衝信號,PWM脈衝產生的速度決定了28BYJ-48的速度。龍芯1C的硬件PWM可以同時產生4路脈衝,剛好與28BYJ-48的4路輸入匹配。而且使用純粹的硬件PWM產生無疑CPU的使用頻率會很低。
龍芯1C的PWM口複用所存在問題:PWM2,3並不能使用,如果要同時使用4路PWM,就要PWM2,3口與其他GPIO口複用,要在驅動中聲明覆用。其中PWM2可與GPIO46複用,也可與GPIO52複用,雖然GPIO52上帶有LED燈但是因爲GPIO46有可能被用作LCD顯示屏接口,所以這裏選擇與GPIO52複用。PWM3口的情況與此類似,同樣我選擇與GPIO53複用。
代碼中的PWNn所在gpio
關於PWM口的寄存器的調用,就要參考Loongson1C300用戶手冊1.4中給出的寄存器的內容了:四路PWM控制器的基地址如下:
四路控制器描述
名稱 |
基地址(Base) |
PWM0 |
0xbfe5_c000 |
PWM1 |
0xbfe5_c010 |
PWM2 |
0xbfe5_c020 |
PWM3 |
0xbfe5_c030 |
每路各有4個控制寄存器,如下表所示:
控制寄存器描述
名稱 |
地址 |
寬度 |
訪問 |
說明 |
CNTR |
Base + 0x0 |
24 |
R/W |
主計數器 |
HRC |
Base + 0x4 |
24 |
R/W |
高脈衝定時參考寄存器 |
LRC |
Base + 0x8 |
24 |
R/W |
低脈衝定時參考寄存器 |
CTRL |
Base + 0xC |
8 |
R/W |
控制寄存器 |
驅動中的寄存器偏移
由此我們可知,這4路硬件PWM 只有基地址不一樣。而我們想控制的高電平的長短,取決於寄存器中的主計數器CNTR和低脈衝計數器LRC還有高脈衝計數器HRC。開始工作時,給CNTR寄存器寫入初值,CNTR寄存器在系統時鐘驅動下自加,當達到LRC寄存器的值後清0。然後重新開始自加,重複這個過程,就能產生連續不斷的一定寬度的週期脈衝輸出。
主計數器設置
CNTR |
位域 |
訪問 |
復位值 |
說明 |
CNTR |
23:0 |
R/W |
0x0 |
計數器開始工作(CTRL[0]爲 1)後,計數到 Lvalue時,計數器清零。 如果 CTRL[4]爲 0,則計數器 從頭開始計數;如果 CTRL[4] 爲 1,則計數器停止 |
當 CNTR 寄存器的值等於 HRC 的值的時候,控制器產生高脈衝電平。
高脈衝計數閾值設置
Hvalue |
位域 |
訪問 |
復位值 |
說明 |
Hvalue |
23:0 |
R/W |
0x0 |
高脈衝計數閾值,當計數器計到該閾值時,輸出高 電平(需將 CTRL[3] 配置成 0) |
當CNTR寄存器的值等於LRC的值的時候,控制器產生低脈衝電平。
低脈衝計數閾值設置
Lvalue |
位域 |
訪問 |
復位值 |
說明 |
Lvalue |
23:0 |
R/W |
0x0 |
低脈衝計數閾值,當計數器 計到該閾值時,輸出低電平 |
因此,如果我要產生系統週期30倍的高脈衝60倍的低脈衝,那麼我就需要把HRC初始值配置爲(60-1)=59,把LRC初始值配置爲(30+60-1)=89。
所以在寫寄存器HRC時如圖:
在寫寄存器LRC時:
控制寄存器是用來控制使能,中斷的,這裏我想使用產生波形的功能,所以用不到中斷控制。下面的表來自芯片手冊,根據這個表在調用控制寄存器控制時,寫入相應的值。
控制寄存器設置
CTRL |
位域 |
訪問 |
復位值 |
描述 |
INT_LRC_EN |
11 |
R/W |
0 |
低脈衝計數器中斷使能 置 1 時:當 INTEN 爲 1 時,CNTR 計數到 LRC 後產生中斷 置 0 時:不產生中斷 |
INT_HRC_EN |
10 |
R/W |
0 |
高脈衝計數器中斷使能 置 1 時:當 INTEN 爲 1 時,CNTR 計數到 HRC 後產生中斷, 置 0 時:不產生中斷 |
CNTR_RST |
7 |
R/W |
0 |
使得 CNTR 計數器清零 置 1 時:CNTR 計數器清零 置 0 時:CNTR 計數器正常工作
|
INT_SR |
6 |
R/W |
0 |
中斷狀態位 讀操作:1 表示有中斷產生,0 表示沒 有中斷寫入 1:清中斷 |
INTEN |
5 |
R/W |
0 |
中斷使能位 置 1 時:中斷使能,當此位爲 1且滿足高脈衝或低脈衝中斷條件時會產生中斷。置 0 時:不產生中斷 |
SINGLE |
4 |
R/W |
0 |
單脈衝控制位 置 1 時:脈衝僅產生一次 置 0 時:脈衝持續產生 |
OE |
3 |
R/W |
0 |
脈衝輸出使能控制位,低有效 置 0 時:脈衝輸出使能 置 1 時:脈衝輸出屏蔽 |
CNT_EN |
0 |
R/W |
0 |
主計數器使能位 置 1 時:CNTR 用來計數 置 0 時:CNTR 停止計數 |
在驅動中定義PWM控制寄存器
實驗驗證
編寫驅動使得PWM口產生脈衝波形
在學習了龍芯1C300的用戶手冊以後,就可以根據這些手冊上給出的寄存器的操作方法編寫驅動了。這裏我借鑑了勤爲本先生的PWM驅動,他已經實現了用PWM口產生脈衝的驅動。因此我先學習勤爲本先生的驅動讓4個PWM口產生脈衝,用示波器觀察看能否順利產生脈衝,如果能觀測到4個GPIO口均能產生一致的脈衝,則驅動編寫正確。
1.把寫好的驅動保存在內核1b-linux-3.0/drivers\misc\ls1c_pwm_pulse.c
2.把寫好的應用程序保存在1b-linux-3.0目錄下的test.c
3.修改1b-linux-3.0目錄下的Makefile添加圖的內容:
Makefile添加的內容
4.在1b-linux-3.0\drivers\misc\Makefile中加入圖中的內容:
5.在1b-linux-3.0\arch\mips\loongson\ls1x\ls1c\platform.c中加入:
在變量static struct platform_device *ls1b_platform_devices[] __initdata中加入圖中的內容:
6.在1b-linux-3.0\drivers\misc\Kconfig中的if MISC_DEVICES這句後面加入圖中的代碼:
7.圖形化配置內核:打開終端,進入1b-linux-3.0:
make menuconfig,勾選新創建的驅動ls1c pwm pulse:
選擇Device Drivers--->[*] Misc devices---><*>ls1c pwm pulse
按照智龍開發手冊上的第68頁,2.3.9 配置 USB 鼠標和鍵盤驅動。
8.編譯整個內核和應用程序:make
運行程序效果圖
測試時發現,PWM0,PWM2,PWM3的GPIO6,GPIO52,GPIO53的波形輸出正常的脈衝,唯獨PWM1的GPIO92口輸出的波形異常。經檢查後發現,在板子設計時,PWM1的引腳GPIO92上有一個按鍵,爲了消除按鍵抖動,在GPIO92上面接了一個編號C83的電容。因此我將這個電容用烙鐵把電容C83給焊下來之後波形正常。
焊掉電容C83
控制脈衝使步進電機八拍運轉
上面我們已經做到了讓4個PWM口輸出脈衝,接下來我們就要對脈衝調用函數進行修改,讓4個PWM口生成我想要的波形。
控制脈衝寬度,將高電平時間設爲3000us,低電平時間設爲1500us:
八拍脈衝設置
將脈衝的週期設爲24ms(3000*8),八拍模式每分鐘大約能轉7圈:
八拍正反轉代碼
因爲28BYJ-48的空載牽入頻率爲600Hz,所以脈衝的最長週期爲1.7ms。但是在電壓5v時把週期控制在1.7ms左右的時候並不能成功的啓動步進電機,我一度懷疑是程序出現了問題,但是示波器顯示能測到正確的波形。我又懷疑是步進電機壞了,但是我換了一個步進電機以後仍然不能啓動,通過分析後得出結論,5V的電壓供電的L298N驅動板的驅動能力不足,達不到驅動步進電機所需要的輸出功率。如果想要讓步進電機動起來有兩種方法,增加給L298N驅動板的供電電壓或者如果想繼續保持5V供電的話,就必須要增加輸出脈衝的週期。關於在5V電壓下多長週期的脈衝能夠使得28BYJ-48成功啓動,經過數十次的編譯不同週期的內核和一系列的測試,我得出了一組數據如下表所示:
脈衝週期 |
電機狀態 |
電壓 |
1.6ms |
電機無響應 |
5V |
16ms |
電機振動,不能旋轉 |
5V |
18ms |
電機振動,不能旋轉 |
5V |
20ms |
電機振動,不能旋轉 |
5V |
24ms |
電機成功啓動旋轉 |
5V |
32ms |
電機成功啓動旋轉 |
5V |
實驗表明最少在5V供電的情況下,8拍能啓動的最短週期要24ms。但是24ms已經顯得很慢了,要週期如果繼續加長,旋轉速度會變得非常緩慢,所以我就不繼續延長週期了。在八拍模式512個脈衝使得步進電機旋轉1圈。
八拍24ms週期脈衝波形圖
控制脈衝使步進電機雙四拍運轉
相較於八拍運行,雙四拍需要更強的驅動力,所以我使用了穩流電源增強供電,因此能夠使得28BYJ-48的運轉速度更加快。將高電平時間設爲1500us,低電平的時間設爲1500us。
雙四拍脈衝設置
脈衝週期設爲6ms(1500*4),雙四拍模式每分鐘大約能轉16圈:
雙四拍6ms週期脈衝波形圖
經過實測,雙四拍果然旋轉的比八拍要快的多。隨着電機旋轉速度的加快,電機的功率也隨之增加,因此就造成電機的發熱急劇增加,經過我的實驗表明,要在雙四拍模式下以6ms週期的脈衝驅動步進電機至少需要12V的電壓才能保證步進電機有足夠的驅動力,電壓低於12V會因爲驅動力不足而丟步。此時通過驅動板的電流接已經接近0.9A驅動板和步進電機的發熱量均很大。數分鐘過後28BYJ-48步進電機會因爲過熱而導致丟步。因爲散熱的限制這種高旋轉速度並不能持續很長時間。以下是我多次試驗測得的雙四拍模式步進電機不同脈衝週期狀態,數據均來自於我所用的電機,不同電機可能數據略有不同:
雙四拍脈衝週期與電機狀態
脈衝週期 |
電機狀態 |
電壓 |
16ms |
電機振動,不能旋轉 |
5V |
16ms |
電機旋轉,扭力不足有丟步 |
5.5V |
16ms |
電機旋轉,扭力很大 |
6V |
6ms |
電機振動,不能旋轉 |
6.5V |
6ms |
電機旋轉,扭力不足有丟步 |
7V |
6ms |
電機旋轉,扭力很大 |
7.5V |
將正反轉集成到一個Linux內核中
在之前的程序中,我們通過一個write函數將設定的脈衝數量這個數據傳到內核中,從而做到控制脈衝生成數量。爲了要將正反轉等信息傳到內核中,我們需要定義一個新的結構體,新的結構體中將包括脈衝數和正反轉等信息,當然也可以包含更多信息。用write函數將結構體內容整體傳到內核中,內核則在需要的時候,分別讀取結構體中的相應信息。
構造結構體
write函數
在調用脈衝生成的地方,我們添加一個switch語句構成的選擇函數,在這裏,判斷應用程序給出的正反轉信息,選擇相應的旋轉方向。
選擇結構舉例
編譯正轉反轉兩個應用程序後寫入智龍開發板,內核讀取方向後,自動選擇調用哪個脈衝生成函數,這樣就能用一個內核實現28BYJ-48的正反轉。同理,再在內核中加入控制脈衝生成順序的選擇,也可以達到控制步進電機的正反轉。
利用QT編寫控制軟件模塊及控制模塊展示
基於龍芯平臺的QT的編譯
QT的官網提供的下載的QT都是基於X86編譯的,用這樣的QT編譯出的程序是無法在龍芯平臺上運行的,所以我們要做的是是用QT源代碼編譯一個龍芯專用的QT,然後配合QTcreator和龍芯gcc最終編寫出控制軟件。
下載源碼並配置編譯
編譯QT4需要兩個源碼包tslib-1.4.tar.gz和從QT的源碼倉庫下載的源碼包,版本比較多我選擇qt-everywhere-opensource-src-4.7.1.tar.gz。
1.準備工作,進入root賬戶權限模式安裝自動化編譯工具:
sudo su
apt-get install autoconf automake libtool
2.解壓並安裝tslib,安裝到根目錄下的TSLIB文件夾中:
tar zxvf tslib-1.4.tar.gz
cd tslib
./autogen.sh
./configure --host=mipsel-linux ac_cv_func_malloc_0_nonnull=yes
--prefix=/TSLIB
make
make install
3.編譯完成後,TSLIB 目錄包含:bin,etc,include,lib,分別爲 TSLIB
的校準及測試程序、環境配置文件、頭文件、動態庫。將TSLIB文件夾複製
到智龍開發板上的根目錄下。
4.交叉編譯 QT4:
tar zxvf qt-everywhere-opensource-src-4.7.1.tar.gz
cd qt-embedded-free-4.7.1
export QTDIR=$PWD
export QTEDIR=$PWD
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
export PATH=$QTDIR/bin:$PATH
5.進入mqt-embedded-free-4.7.1/kspecs/qws/linux-mips-g++文件夾將其
中的qmake.conf中的mips全部修改爲mipsel,並在其中添上兩行:
QMAKE_LIBDIR=/TSLIB/lib
QMAKE_INCDIR=/TSLIB/include 保存退出。
6.進行QT4的編譯:
./configure -release -shared -no-largefile -qt-sql-sqlite
-no-qt3support -no-xmlpatterns -no-mmx -no-3dnow -no-sse -no-sse2
-no-svg -no-webkit -qt-zlib -qt-gif -qt-libtiff -qt-libpng
-qt-libmng -qt-libjpeg -make libs -nomake tools -nomake examples
-nomake docs -nomake demo -no-nis -no-cups -no-iconv -no-dbus
-no-openssl -xplatform qws/linux-mips-g++ -embedded mips
-qt-freetype -depths 8,16,24,32 -qt-gfx-linuxfb
-no-gfx-transformed -no-gfx-multiscreen -no-gfx-vnc -no-gfx-qvfb
-no-glib -qt-mouse-tslib -L/TSLIB/include -L/TSLIB/lib
-prefix /usr/local/Trolltech/QtEmbedded-4.7.1-mips/
make
make install
7.安裝QTcreator,在選項裏的工具鏈中添加gcc指向gcc-4.3-ls232/bin。
這樣就能用QTcreator編寫龍芯能用的QT程序了。如果提示缺少qmlviewer,qmlpuppet,qmlprofiler,qmlplugindump,將這四個文件從別的文件夾複製過來補齊即可:
cd /usr/bin
cp qmlplugindump /usr/local/Trolltech/QtEmbedded-4.7.1-mips/bin
cp qmlprofiler /usr/local/Trolltech/QtEmbedded-4.7.1-mips/bin
cp qmlpuppet /usr/local/Trolltech/QtEmbedded-4.7.1-mips/bin
cp qmlviewer /usr/local/Trolltech/QtEmbedded-4.7.1-mips/bin
8.如果在編譯的時候出現libts-0.0.so.0 need by libQtGui.so: not found (try using -rpath or -rpath-link),那麼在以root用戶身份進入根目錄,找到usr/local/Trolltech/QtEmbedded-4.7.1-mips/mkspecs/common/linux.conf文件打開文件編輯器找到“QMAKE_LIBS_THREAD = -lpthread”這個代碼,將其內容改爲:“QMAKE_LIBS_THREAD = -lpthread -lts”即可解決。
用QT編寫控制程序
經過簡單的QT編程學習,我初步掌握了使用QT編程的方法,雖然不能稱得上精通,但是編寫本設計所需要的用戶界面是足夠的。我設計了以下的用戶界面:
用戶界面
該界面由四個按鍵組成,分別負責控制步進電機快速正轉,快速反轉,慢速正轉,慢速反轉。分別右鍵按鍵,選擇轉到槽,點進clicked在相應的按鍵裏面添加相應的代碼,編譯通過即可。
對編寫好的QT程序進行交叉編譯
首先,在剛纔編譯通過的工程文件夾下新建一個qte4-path.sh文件,打開文件並在其中輸入:
export QTDIR=/usr/local/Trolltech/QtEmbedded-4.7.1-mips/
export QTEDIR=$QTDIR
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/TSLIB/lib:$LD_LIBRARY_PATH
export PATH=/home/cpu/gcc-4.3-ls232/bin:$PATH
保存文件退出。然後在終端中進入工程文件夾,輸入以下命令:
1.chmod a+x qte4-path.sh
2.source qte4-path.sh
3.$QTDIR/bin/qmake -project
4.$QTDIR/bin/qmake
5.make
這樣就能順利得到交叉編譯出來的智龍開發板能運行的QT可執行文件。
配置智龍開發板的QT環境,運行程序
在開發板上,新建文件夾/usr/local/Trolltech/QtEmbedded-4.7.1-mips,把虛擬機對應文件夾裏的lib,plugins兩個文件夾以及裏面所有的文件,複製到智龍板子這個文件夾下。
在開發板,建立環境變量配置文件:
vi qt-env.sh
export QTDIR=/usr/local/Trolltech/QtEmbedded-4.7.1-mips
export LC_ALL=zh_CN.UTF-8 export LANG_ALL=zh_CN.UTF-8 export LANG=zh_CN.UTF-8
export TSLIB_ROOT=/TSLIB
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0 export TSLIB_TSDEVICE=/dev/event0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/TSLIB/etc/ts.conf
export TSLIB_PLUGINDIR=/TSLIB/lib/ts
export TSLIB_TSEVENTTYPE=INPUT
export QWS_MOUSE_PROTO=Tslib:/dev/event0
export LD_LIBRARY_PATH=$QTDIR/lib:$TSLIB_ROOT/lib:/usr/local/lib:
$LD_LIBRARY_PATH
export QWS_DISPLAY="LinuxFb:mmWidth100:mmHeight130:0"
export QT_QWS_FONTDIR=$QTDIR/lib/fonts
export QT_PLUGIN_PATH=$QTDIR/plugins/
保存退出,執行命令:
source qt-env.sh
運行程序時需要在後面加上 -qws如:
./RX-0 -qws
連接顯示屏
顯示屏顯示效果