在嵌入式Linux開發過程中需要為(wei) 指定設備編寫(xie) 和編譯驅動程序,這與(yu) 以往在PC機上的Linux驅動開發明顯不同,本文設計了基於(yu) S3C2440嵌入式Linux下激光雕刻係統的步進電機驅動程序。
1 硬件係統的設計
步進電機開環控製係統主要由中央控製器、步進電機驅動器、傳(chuan) 感器以及步進電機四大部分組成。本係統采用基於(yu) ARM920t內(nei) 核的S3C244 0A微處理器作為(wei) 控製係統的中央控製器,該芯片主頻400MHz,最高可達到533MHz,內(nei) 含多種設備接口,存儲(chu) 器使用64MB的Nand Flash和64MB的SDRAM。圖1所示為(wei) 控製係統框圖。

2 係統的工作原理
本係統主要控製兩(liang) 個(ge) 兩(liang) 相混合式步進電機,分別代表X軸和Y軸帶動傳(chuan) 能光纖進行激光雕刻。係統采用8路I/O口進行脈衝(chong) 輸出,每4路接一個(ge) 步進電機驅動器,通過功率放大後,進入步進電機的各項繞組。電機有半步、整步兩(liang) 種工作模式,整步模式的步距角為(wei) 1.8°,半步模式的步距角為(wei) 0.9°,整步一周共200步。如:半步模式的兩(liang) 步進電機正轉脈衝(chong) 為(wei) {0x11,0x33,0x22,0x66,0x44,Oxcc,0x88,0x99};整步模式為(wei) {0x11,0x22,0x44,0x88,0x11,0x22,0x44,0x88},一個(ge) 步進電機運作時,隻對脈衝(chong) 時序的高或低4位操作,另外4位為(wei) 0。而改變脈衝(chong) 的順序,即可改變轉動方向。在整個(ge) 控製係統中,數據處理在Linux應用程序中完成,步進量傳(chuan) 遞給Linux驅動程序後,由驅動程序完成脈衝(chong) 輸出。通過軟件來完成脈衝(chong) 分配,可根據應用係統的需要,隨時改變對步進電機的控製。
3 嵌入式Linux步進電機驅動程序的設計
Linux操作係統將所有的設備(而不僅(jin) 是存儲(chu) 器裏的文件)都看成文件,以操作文件的方式訪問設備。應用程序不能直接操作硬件,而是使用統一的接口函數調用硬件驅動程序。設備驅動程序是操作係統內(nei) 核和硬件之間的接口。Linux設備驅動與(yu) 內(nei) 核接口可分為(wei) 三大方麵:a.與(yu) 係統啟動代碼的接口對設備進行初始化;b.與(yu) 內(nei) 核接口通過數據結構file.operrations來完成;c.與(yu) 設備的接口對設備進行讀寫(xie) 操作。
步進電機是將電脈衝(chong) 信號轉變為(wei) 角位移或線位移的開環控製元件。而脈衝(chong) 信號的頻率和脈衝(chong) 數是控製電機的兩(liang) 個(ge) 重要方麵。本係統步進電機4路脈衝(chong) 輸出由硬件地址0x28000006的bit0~bit3控製,bit0對應MOTOR A+,bit1對應MOTOR B+,bit2對應MOTOR_A-,bit3對應MOTOR_B-。這裏針對整步模式下的步進電機進行脈衝(chong) 分配信號,半步模式的步進電機正轉導電狀態時的控製順序為(wei) A+_A+B+_B+_B+A-_A-_一A-B-_B-,整步模式的步進電機正轉導電狀態時的控製順序為(wei) A+_B+_A-_B-。
因此在程序中需要通過編製脈衝(chong) 分配信號來控製步進電機,並通過修改脈衝(chong) 分配信號來實現對步進電機方向的控製。圖2是用軟件形成環形脈衝(chong) 的流程圖。
係統中的步進電機隻響應應用程序傳(chuan) 送給驅動的步進量和部分參數,隻能順序地進行控製操作,因此它可作為(wei) 字符設備來進行驅動。在驅動程序中,需要提供幾個(ge) 操作函數的入口點,分別為(wei) open、read、write、ioet1等。而ioct1函數尤為(wei) 重要,係統通過調用這個(ge) 函數可以控製步進電機的轉動。
在初始化函數中,會(hui) 將驅動程序的file operations結構連同其主設備號一起向內(nei) 核進行注冊(ce) 。對於(yu) 字符設備使用以下函數進行注冊(ce) :int register_chrdev(unsigned int major,const char*name,struct file_operations*fops);其中,unsigned int major為(wei) 定義(yi) 的主設備號,const char*name為(wei) 定義(yi) 的設備名稱,這裏把設備名宏定義(yi) 為(wei) stepper。file_operations*fops為(wei) 定義(yi) 的指針變量。申請控製步進電機的端口用以下函數進行調用:request_region(0x28000006, 1, const char*name);因為(wei) 步進電機用到了I/O端口,而在S3C2440中操作端口要用虛擬地址而非實際的物理地址,因此要修改內(nei) 核代碼。修改文件內(nei) 核源代碼中間的smdk.c,該文件在linux/arch/arm/mach-s3c2440中,在結構體(ti) static struct map_descsmdk_io_desc[]中添加一行數組元素{0xd3000000,0x28000000,Ox01000000,DOMAIN_IO,0,1,0,0},則步進電機的物理地址0x28000006對應的虛擬地址為(wei) 0xd3000006,在驅動程序中應對這個(ge) 地址進行操作。
根據上麵提到的步進電機的脈衝(chong) 分配信號,定義(yi) 它半步模式正轉脈衝(chong) 為(wei) :
unsigned char pulse_table[]=
{0x11,0x33,0x22,0x66,0x44,Oxcc,0x88,0x99};
利用應用程序傳(chuan) 遞給stepper ioct1的參數arg來判斷轉動方向。編寫(xie) ioctl函數用來接收應用程序對於(yu) 步進電機的控製。以下是部分驅動程序代碼:

設備卸載與(yu) 前麵提到的設備注冊(ce) 是相反的過程。當從(cong) 係統中卸載一個(ge) 模塊時,主設備號要得到釋放。這一操作可以調用以下函數進行模塊清除:
int unregister_chrdev(unsigned int major,const char*name);
首先,編譯步進電機模塊,打開內(nei) 核中drivers/char/Konfig文件,添加如下語句:
Config STEPPER_MODULE、tristate"stepper module"、depends on ARCH_S3C2440、help、stepper driver module。
在終端中運行命令make menuconfig,進入內(nei) 核配置主菜單,在DeviceDriver→Character device菜單中看到剛才所添加的選項了,之後編譯為(wei) 模塊方式。
其次,打開內(nei) 核中drivers/char/Makefile文件,添加如下語句:
obj-$(CONFIG_STEPPER_MODELL)+=stepper_module.o
最後,回到內(nei) 核源代碼根目錄位置,執行make modules,就可生成係統所需要的內(nei) 核模塊文件stepper module.ko了。至此,完成了步進電機模塊驅動的編譯。之後,便可使用insmod、rmmod命令分別對模塊進行加載、卸載了。
4 結論
本文歸納了驅動程序開發的一般流程,並結合步進電機的驅動闡述了驅動程序的編寫(xie) 。與(yu) 原有通過操作PC機來控製步進電機相比,本文是在Linux操作係統支持MMU的情況下完成了對步進電機的控製。
轉載請注明出處。







相關文章
熱門資訊
精彩導讀



















關注我們

