嵌入式linux直流电机驱动程序的设计Word文档下载推荐.docx
- 文档编号:20698580
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:11
- 大小:22.15KB
嵌入式linux直流电机驱动程序的设计Word文档下载推荐.docx
《嵌入式linux直流电机驱动程序的设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《嵌入式linux直流电机驱动程序的设计Word文档下载推荐.docx(11页珍藏版)》请在冰豆网上搜索。
2.总体设计方框图
3.设计原理分析
软件设计:
1.系统软件功能说明
2.程序设计
要求:
1、根据题目和所用的接口电路芯片设计出完整的接口电路,并用计算机绘制出电路原理图以及程序流程图。
2、认真独立完成所规定的设计内容(4000字左右),严禁相互抄袭;
3、撰写、打印设计说明书一份。
指导教师评语及成绩
总成绩:
指导教师签字:
年月日
第1章嵌入式linux
Linux操作系统核心最早是由芬兰的LinusTorvalds于1991年9月在芬兰赫辛基大学上学时发布的(Linux0。
01版,第一个正式向外公布的Linux内核版本),后来经众多世界项尖的软件工程师不断修改和完善,Linux得以在全球普及开来,在服务器域及个人桌面领域得到越来越多的应用。
Linux是在GNU公共许可权限下免费获的,是一款符合POSIX标准的多用户、多任务、支持多线程和多CPU的类Unix操作系统。
Linux以其高效性和活跃性著称。
Linux模块化的设计结构,使得它既能够在格昂贵的工作站上运行又能够在廉价的PC机上实现全部的Unix特性。
Linux当前有很多发行版本,流行的有:
RedHatLinux、DebianLinux、ReflagsLinux、Ubuntu等。
由于集成电路技术的飞速发展,嵌入式系统的开发从单片机时代进入到了一个“系统’’开发的阶段,嵌入式操作系统也逐渐走上了历史舞台。
从国内和国外来看,嵌入式操作系统主要有WindowsCE、VxWorks、pSOS、PalmOS等。
Linux是一个成熟、稳定的操作系统,由于其在嵌入式开发方面具有其它操作系统无可比拟的优势,经过这几年的发展,已迅速跻身主流嵌入式开发平台。
Linux作为嵌入式操作系统的优势在于:
1.Linux是开放源代码的免费软件。
只要遵守GPL的规定,就可以免费获得Linux内核和其它自由软件的源代码,采用Linux操作系统构建嵌入式系统,可以大大降低开发成本和周期。
2.Linux具有完善的文档和广泛的技术支持。
Linux是互联网充分发展的产物,在网上能够找到许多关于Linux的文档以及强大的技术支持。
3.Linux内核功能强大,性能高效、稳定。
Linux的内核非常稳定,它的高效和稳定性已经在各个领域,尤其是在网络服务器领域得到了事实的验证。
4.Linux能够支持多种体系结构,是支持微处理器种类最多的操作系统。
目前,Linux已经被移植到数十种硬件平台上,几乎所有主流的硬件平台,如X86、ARM、PPC、MIPS、ALPHA、SPARC等,Linux都支持。
5.Linux拥有强大的网络功能。
随着嵌入式系统的发展,嵌入式系统与Intemet结合得越来越紧密。
与其它操作系统相比,Linux在网络方面有较大的优势,基本上所有的网络协议和网络接口都可以在Linux上找到。
6.Linux大小和功能可定制。
Linux继承了Unix的优秀设计思想,内核与用户界面完全独立,各部分的可定制性很强,可以按照需求进行定制和配置,这对于硬件资源有限的嵌入式系统是一个理想的选择。
第2章设备驱动程序简介
2.1设备驱动程序的概念
设备驱动程序是有内核中的相关例程和数据组成的I/O设备软件接口,每当内核意识到要对某个设备今次那个特殊的操作是,它就调用相应的驱动例程,当驱动例程完成后,就返回至用户进程。
设备驱动程序是操作系统内核、硬件之间的接口。
设备驱动程序为应用程序忽略了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作。
设备驱动程序是内核的一部分,它文成以下功能:
(1)对设备初始化和释放。
(2)把数据从内核传送到硬件和从硬件读取数据。
(3)读取应用程序传送给设备文件的数据和回送应用程序请求的数据。
(4)检测和处理设备出现的错误。
每个设备驱动程序都有以下几个特性:
(1)具有一整套的和硬件设备通讯的例程,并且提供给操作系统一套标准的软件接口。
(2)有一个可以被操作系统动态调用和移除的自包含组件。
(3)可以控制和管理用户程序和物理设备之间的数据流。
2.2设备驱动程序的基本结构
对用户程序而言,设备驱动程序隐藏了设备的具体细节,对各种不同设备提供了一致的接口。
一般设备驱动程序可以分为三个主要组成部分:
(1)自动配置和初始化子程序:
自动配置和初始化子程序常在相应的driver中实现,负责检测所要驱动的硬件设备是否存在和是否能正常工作。
如果该设备正常,则对这个设备及其相关的设备驱动程序需要的状态进行初始化。
这部分驱动程序仅在初始化的时候调用一次。
(2)服务于I/O请求的子程序:
它又称为驱动程序的上半部分,调用这部分是由于系统调用的结果。
这部分程序在执行的时候,系统仍认为是和进行调用的进程属于同一个进程,只是由用户态变成了核心态,具有进行此系统调用的用户程序的运行环境。
因此可以在其中调用sleepO等与进程运行环境有关的函数。
(3)中断服务子程序:
在Lintm系统中,并不是直接从中断向量表中调用设备驱动程序的中断服务子程序,而是由系统来接收硬件中断,再由系统调用中断服务子程序。
中断可以产生在任何一个进程运行的时候,因此,在中断服务程序被调用的时候,不能依赖于任何进程的状态,也就不能调用任何与进程运行环境有关的函数。
因为设备驱动程序一般支持同一类型的若干设备,所以一般在系统调用中断服务子程序的时候,都带有一个或多个参数,以唯一标识请求服务的从设备。
第3章搭建交叉编译环境
3.1安装Redhat9.0Linux操作系统
在PC机上安装虚拟机,并在虚拟机上安装Redhat9.0Linux操作系统。
3.2安装交叉编译器
似乎启动虚拟机并以root用户名登录,在主机的根目录/下,创建linuette目录,如:
mkdir/linuette。
在mnt/cdrom目录下找到光盘,将光盘中RPMS文件夹拷贝到/linuette目录下,打开系统工具下地终端,此时,系统将弹出终端框,在里面改变目/linuette/RPMS下,输入如下命令:
#rpm–Uvh*.rpm
3.3配置NFS网络文件系统
根据在Linux主机终端上执行setup,选中Firewallconfiguration,回车,进入系统服务选项菜单,选择NOFIREWALL关闭防火墙。
之后选中Systemsetvices回车,选中[*]nfs.保存退出。
利用编辑器打开/etc/exports文件,修改为:
/(rw)保存退出。
改变目录到/etc/rc.d/init.d/下,执行如下命令:
./nfsstart
3.4链接挂载
用交叉网线主机和实验系统链接起来,打开minicom,配置波特率为115200,无奇偶校验位。
给系统上电,利用ifconfigeth0192.168.0.12改变系统IP地址。
在主机终端上配主机Linux系统IP地址为192.168.0.11.利用ping命令看主机与实验系统是否链接上。
利用chmod–R777/home/nfs改变/home/nfs文件夹属性,在minicom上输入命令mount192.168.0.11/home/nfs/mnt/yaffs回车,挂载主机上的/home/nfs到实验系统的/mnt/yaffs目录下。
至此,Linux实验环境搭建成功。
第4章直流电机驱动程序的编写
4.1驱动程序的编写
首先是设备初始化,定义直流电机驱动程序的初始化函数ZLDJinit(),在函数中实现向系统注册设备号、设备名称和初始化寄存器。
向系统注册设备,这里定义电机的主设备号宏符号名为ZLDJ-MAJOR,设备名称为zldj-drv,设备的结构体为&
ZLDJ-ops,则设备的注册函数为:
Devfs-register-chrdev(ZLDJ-MAJOR,”zldj-dev”,ZLDJ-ops);
设备初始化函数:
Staticint—intZLDJ-init(void)
{
Intret=-ENODEV;
ret=Devfs-register-chrdev(ZLDJ-MAJOR,”ZLDJ-drv”,&
ZLDJ-ops);
showversion();
printk(ZLDJ-Moduleregistersuccess[--kernel--]\n”);
if(ret<
0)//当返回值小于0时,设备注册失败
{
Printk(”CouldnotregisterZLDJ-driver”);
}
return0;
}
驱动程序的file-operation数据结构,由于直流电机驱动程序只能控制电机旋转和停止,因此只需要接口函数ioctl()就够了。
staticstructfile-operationsZLDJ-ops={
Ioctl:
ZLDJ-ioctl,
}
控制直流电机转动和停止的借口函数,控制直流电机转动和停止的借口函数ioctl()后,主要是设备寄存器GPRS与寄存器GPCR的值。
GPSR为置位寄存器,当取值为1时,电机开始转动。
GPSR2|=(0x1<
<
20;
//电机正转
18;
//电机反转
GRCR为复位寄存器,当取值为1时,电机停止转动。
GPCR2|=(0x1<
//电机正转停止
//电机反转停止
为了能让电机旋转一段时间后,自动停止转动,要使用函数udelay()设置一段时间延迟。
由于函数udelay()是微妙级,且该值不能取得太大,否则会产生溢出,因此设置一个循环来加大延迟的时间。
for(i=0;
i<
300;
i++)
udelay(8000);
//延时
直流电机驱动源程序:
#include<
linux/config.h>
linux/kernel.h>
linux/sched.h>
linux/timer.h>
linux/init.h>
linux/module.h>
linux/delay.h>
linux/interrupt.h>
linux/devfs-fs-kernel.h>
linux/fs.h>
linux/slab.h>
asm/io.h>
linux/asm/irq.h>
#include<
linux/hardware.h>
#defineZLDJ-MAJOR111
#defineVERS”ZLDJ-dev”
voidshowversion(void)
printk(”******************\n”);
printk(“%s\n”,VERS);
printk(“*******************\n\n”);
/*接口函数ioctl*/
ssize-tZLDJ-ioctl(structinode*inode,structfile*file,unsignedintcmd,unsignedlongarg)
inti;
GPSR2|=(0x1<
//电机正转
for(i=0;
GPCR2|=(0x1<
i++)
//电机反转
for(i=0;
udelay(arg);
return0;
staticstructfile-operationsZLDJ-ops={ioctlZLDJ-ioctl,
};
staticint—initset-ZLDJ-init(void)
intret=-ENODEV;
ret=devfs-register-chrdev(ZLDJ-MAJOR,”ZLDJ-drv”,&
showversion();
printk(“ZLDJ-Moduleregistersuccess[--kernel--]\n”);
if(ret<
{
printk(“CouldnotregisterZLDJ-driver”);
staticvoid—exitcleanup-ZLDJ-ctl(void)
#ifdefOURS-HELLO-DEBUG
printk(“cleanup-Module[--kernel--]\n”);
#endif
decfs-unregister-chrdev(ZLDJ-MAJOR,”ZLDJ-drv”)
MODULE-LICENSE(“GPL”)
module-init(set-ZLDJ-init);
module-exit(cleanup-ZLDJ-ctl);
4.2直流电机用户应用程序
直流电机用户应用程序设计分析,直流电机应用程序的功能是在用户空间调用设备驱动程序,其主要设计步骤如下。
第一步,获取直流电机驱动程序的文件描述符。
fd=open("
/dev/zldj_drv"
O_RDWR);
第二步,调用设备驱动程序中的函数ioctl(),向电机发出控制指令。
ioctl(fd,0x1,1000);
直流电机用户应用程序源程序:
stdio.h>
sys/ioctl.h>
fcntl.h>
unistd.h>
intmain()
{intfd,intret;
fd=open("
if(fd<
0)
{printf("
\n\nOpendevicezldjerror\n"
);
printf("
\npleaseinputNumber(0--9):
"
scanf("
%x"
&
ret);
ioctl(fd,0x1,1000);
close(fd);
EndofTest\n"
4.3驱动程序的编译文件Makefile
KERNELDIR=/Linux
INCLUDEDIR=$(KERNELDIR)/include
CROSS_COMPILE=arm-Linux-
CC==$(CROSS_COMPILE)gcc
CFLAGS+=-I..
CFLAGS+=-Wall-O-D__KERNEL__-DMODULE-I$(INCLUDEDIR)
TARGET=zldj_drv.o
all:
$(TARGET)
zldj_drv.o:
zlidj_drv.c
$(CC)-c$(CFLAGS)$^-o$@
install:
install-d$(INSTALLDIR)
install-c$(TARGET).o$(INSTALLDIR)
clean:
rm-f*.o*~core.depend
4.4用户程序的Makefile文件
CC=arm-Linux-gcc
STD=_GUN_SOURCE
WARN=-Wall
TARGTS=testZLDJ
.c.o:
$(CC)-c$(CFLAGS)-D$(STD)$(WARN)$<
$(STARGTS)
TestZLDJ:
testZLDJ.o
$(CC)testZLDJ.o-otestZLDJ
clean:
rm-f*.ocorea.out$(TARGTS)
clobber:
clean
rm-f$(TARGTS)
第5章运行程序
5.1建立设备进入点
由于直流电机驱动程序中已经定义其主设备号为111,此设备号没有定义,故取默认值为0.直流电机的设备进入点为zldj_drv。
创建直流电机驱动程序的设备进入点如下:
[root@Linuxdcmo_drv]#mknod/dev/zldj_drvc1110
5.2加载驱动程序
使用命令insmod命令加载驱动程序。
加载zldj_drv.o的运行结果如下:
[root@Linuxaldj]#insmodzldj_drv.o
Usingzldj_drv.o
ZLDJ_Moduleregistersuccess[--kernel--]
5.3运行用户应用程序
运行用户应用程序testZLDJ,当按下任意数字键时,电机开始旋转。
[root@Linuxzldj]#./testZLDJ
PleaseinputNumber(0~9):
1
EndofTest
第6章课程设计总结
本设计通过单片机AT89C51和脉冲分配PMM8713来控制步进电机的正反转,加减速,以实现步进电机的控制。
本设计实现了占用CPU时间少,效率高;
易于控制步进电机的转向转速;
提高了步进电机的步进精度等。
再有,本设计过程考虑比较周全,系统中不仅采用光电隔离电路有效地抑制电磁干扰以提高系统的可靠性,而且还可以方便灵活地控制步进电机的运行状态,以满足不同用户的要求,因此常把单片机步进电机控制电路称之为可编程步进电机控制驱动器。
步进电机控制(包括控制脉冲的产生和分配)使用软件方法,即用单片机实现,这样既简化了电路,也减低了成本。
基于单片机的步进电机控制系统性能优于传统的步进控制器,具有相应快,控制方便可靠等一系列优点,在机电一体化、数模转换装置、计算机外围设备、自动记录仪、钟表、印刷设备等中亦得到广泛地应用,发展前景广阔。
参考文献
[1]梅丽凤.单片机原理及接口技术,北京:
清华大学出版社,2004:
19-48,81-93
[2]何立民.单片机应用系统设计,北京:
航空航天大学出版社,1990:
45—56
[3]张毅刚.单片机原理及应用,北京:
高等教育出版社,2003:
126—135
[4]顾兴源.计算机控制系统,北京:
冶金工业出版社,1981:
25—40
[5]张毅刚.单片机原理及接口技术.北京:
人民邮电出版社,2008:
53-70
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 linux 直流电机 驱动程序 设计