本文面向初学者,请多各位高手包涵。我在此特别致谢勤为本先生为我提供的帮助。
步进电机就是一种受脉冲控制的电机,步进电机接收到一系列某种调制顺序的脉冲,做出相应的反应,转到相应的角度或者相应的圈数。
我选择应用广泛价格最便宜的步进电机,型号为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系统的单片机上进行嵌入式驱动和程序的开发,因为运行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,然后重新启动系统即可生效。
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
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源码,我要做的就是编写一个能让步进电机运转起来的驱动,然后将驱动编译到内核中,最后通过应用程序调用驱动,从而做到操控步进电机的正转,反转。
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都是基于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可执行文件。
在开发板上,新建文件夹/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
连接显示屏
显示屏显示效果