嵌入式linux直流电机驱动程序的设计.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
辽宁工业大学
单片机及接口技术课程设计(论文)题目:直流电机驱动程序的设计
院(系):电子与信息工程学院
专业班级:计算机101
学号: 100401018
学生姓名:郑杭
指导教师:瞿涛
教师职称:讲师
起止时间:13-12-28至14-01-10
课程设计(论文)任务及评语
院(系):电子与信息工程学院教研室:计算机科学与技术
学号100401018 学生姓名郑杭专业班级计算机101
课程设计
(论文)
题目
直流电机驱动程序的设计
课程设计(论文)任务
直流电机是指能将直流电能转换成机械能(直流电动机)或将机械能转换成直流电能的旋转电机。
主要设计内容:
硬件电路设计:
1. 直流电机原理及控制技术
2. 总体设计方框图
3. 设计原理分析
软件设计:
1.系统软件功能说明
2.程序设计
要求:
1、根据题目和所用的接口电路芯片设计出完整的接口电路,并用计算机绘制出电路原理图以及程序流程图。
2、认真独立完成所规定的设计内容(4000字左右),严禁相互抄袭;
3、撰写、打印设计说明书一份。
指
导
教
师
评
语
及
成
绩
总成绩:指导教师签字:
年月日
目录
第1章嵌入式linux (1)
第2章设备驱动程序简介 (3)
2.1设备驱动程序的概念 (3)
2.2设备驱动程序的基本结构 (3)
第3章搭建交叉编译环境 (5)
3.1 安装Redhat 9.0Linux操作系统 (5)
3.2安装交叉编译器 (5)
3.3配置NFS网络文件系统 (5)
3.4 链接挂载 (5)
第4章直流电机驱动程序的编写 (6)
4.1驱动程序的编写 (6)
4.2 直流电机用户应用程序 (9)
4.3驱动程序的编译文件Makefile (10)
4.4用户程序的Makefile文件 (11)
第5章运行程序 (12)
5.1建立设备进入点 (12)
5.2加载驱动程序 (12)
5.3运行用户应用程序 (12)
第6章课程设计总结 (13)
参考文献 (14)
第1章嵌入式linux
Linux操作系统核心最早是由芬兰的Linus Torvalds于1991年9月在芬兰赫辛基大学上学时发布的(Linux 0。
01版,第一个正式向外公布的Linux内核版本),后来经众多世界项尖的软件工程师不断修改和完善,Linux得以在全球普及开来,在服务器域及个人桌面领域得到越来越多的应用。
Linux是在GNU公共许可权限下免费获的,是一款符合POSIX标准的多用户、多任务、支持多线程和多CPU的类Unix操作系统。
Linux以其高效性和活跃性著称。
Linux模块化的设计结构,使得它既能够在格昂贵的工作站上运行又能够在廉价的PC机上实现全部的Unix特性。
Linux当前有很多发行版本,流行的有:RedHat Linux、Debian Linux、ReflagsLinux、Ubuntu等。
由于集成电路技术的飞速发展,嵌入式系统的开发从单片机时代进入到了一个“系统’’开发的阶段,嵌入式操作系统也逐渐走上了历史舞台。
从国内和国外来看,嵌入式操作系统主要有Windows CE、VxWorks、pSOS、Palm OS等。
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 安装Redhat 9.0Linux操作系统
在PC机上安装虚拟机,并在虚拟机上安装Redhat 9.0Linux操作系统。
3.2安装交叉编译器
似乎启动虚拟机并以root用户名登录,在主机的根目录/下,创建linuette目录,如:mkdir /linuette。
在mnt/cdrom目录下找到光盘,将光盘中RPMS文件夹拷贝到
/linuette目录下,打开系统工具下地终端,此时,系统将弹出终端框,在里面改变目
/linuette/RPMS下,输入如下命令:#rpm –Uvh *.rpm
3.3配置NFS网络文件系统
根据在Linux主机终端上执行setup,选中Firewall configuration,回车,进入系统服务选项菜单,选择NO FIREWALL关闭防火墙。
之后选中System setvices回车,选中[*]nfs.保存退出。
利用编辑器打开/etc/exports文件,修改为:/(rw)保存退出。
改变目录到/etc/rc.d/init.d/下,执行如下命令: ./nfs start
3.4 链接挂载
用交叉网线主机和实验系统链接起来,打开minicom,配置波特率为115200,无奇偶校验位。
给系统上电,利用ifconfig eth0 192.168.0.12改变系统IP地址。
在主机终端上配主机Linux系统IP地址为192.168.0.11.利用ping命令看主机与实验系统是否链接上。
利用chmod –R 777 /home/nfs改变/home/nfs文件夹属性,在minicom上输入命令mount 192.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);设备初始化函数:Static int—intZLDJ-init(void)
{
Int ret=-ENODEV;
ret= Devfs-register-chrdev(ZLDJ-MAJOR,”ZLDJ-drv”,&ZLDJ-ops);
showversion();
printk(ZLDJ-Module register success!!! [--kernel--]\n”);
if(ret<0) //当返回值小于0时,设备注册失败
{
Printk(”Could not register ZLDJ-driver”);
}
return 0;
}
驱动程序的file-operation数据结构,由于直流电机驱动程序只能控制电机旋转和停止,因此只需要接口函数ioctl()就够了。
static struct file-operations ZLDJ-ops={
Ioctl: ZLDJ-ioctl,
}
控制直流电机转动和停止的借口函数,控制直流电机转动和停止的借口函数ioctl ()后,主要是设备寄存器GPRS与寄存器GPCR的值。
GPSR为置位寄存器,当取值为1时,电机开始转动。
GPSR2 |=(0x1<<20; //电机正转
GPSR2 |=(0x1<<18; //电机反转
GRCR为复位寄存器,当取值为1时,电机停止转动。
GPCR2 |=(0x1<<20; //电机正转停止
GPCR2 |=(0x1<<18; //电机反转停止
为了能让电机旋转一段时间后,自动停止转动,要使用函数udelay()设置一段时间延迟。
由于函数udelay()是微妙级,且该值不能取得太大,否则会产生溢出,因此设置一个循环来加大延迟的时间。
for(i=0;i<300;i++)
udelay(8000); //延时
直流电机驱动源程序:
#include<linux/config.h>
#include<linux/kernel.h>
#include<linux/sched.h>
#include<linux/timer.h>
#include<linux/init.h>
#include<linux/module.h>
#include<linux/delay.h>
#include<linux/interrupt.h>
#include<linux/devfs-fs-kernel.h>
#include<linux/fs.h>
#include<linux/slab.h>
#include<asm/io.h>
#include<linux/asm/irq.h>
#include<linux/hardware.h>
#define ZLDJ-MAJOR 111
#define VERS”ZLDJ-dev”
void showversion(void)
{
printk(”******************\n”);
printk(“%s\n”,VERS);
printk(“*******************\n\n”);
}
/*接口函数ioctl*/
ssize-tZLDJ-ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg)
{
int i;
GPSR2 |=(0x1<<20; //电机正转
for(i=0;i<300;i++)
udelay(8000); //延时
GPCR2 |=(0x1<<20; //电机正转停止
for(i=0;i<300;i++)
udelay(8000); //延时
GPSR2 |=(0x1<<18; //电机反转
for(i=0;i<300;i++)
udelay(8000); //延时
GPCR2 |=(0x1<<18; //电机反转停止
udelay(arg);
return 0;
}
static struct file-operations ZLDJ-ops={ioctl ZLDJ-ioctl,
};
static int—init set-ZLDJ-init(void)
{
int ret=-ENODEV;
ret=devfs-register-chrdev(ZLDJ-MAJOR,”ZLDJ-drv”,&ZLDJ-ops);
showversion();
printk(“ZLDJ-Module register success!!![--kernel--]\n”);
if(ret<0) //当返回值小于0时,设备注册失败
{
printk(“Could not register ZLDJ-driver”);
}
return 0;
}
static void—exit cleanup-ZLDJ-ctl(void)
{
#ifdef OURS-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);
直流电机用户应用程序源程序:
#include<stdio.h>
#include<sys/ioctl.h>
#include<fcntl.h>
#include<unistd.h>
int main()
{ int fd,int ret;
fd=open("/dev/zldj_drv",O_RDWR);
if(fd<0)
{ printf("\n\nOpen device zldj error\n");}
printf("\n please input Number (0--9):");
scanf("%x",&ret);
ioctl(fd,0x1,1000);
close(fd);
printf("End of Test\n");
return 0;
}
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) $ < all: $(STARGTS)
TestZLDJ:testZLDJ.o
$(CC)testZLDJ.o -o testZLDJ
clean:
rm-f *.o core a.out $ (TARGTS)
clobber:clean
rm-f $ (TARGTS)
第5章运行程序
5.1建立设备进入点
由于直流电机驱动程序中已经定义其主设备号为111,此设备号没有定义,故取默认值为0.直流电机的设备进入点为zldj_drv。
创建直流电机驱动程序的设备进入点如下:[root@Linux dcmo_drv]# mknod/dev/zldj_drv c 111 0
5.2加载驱动程序
使用命令insmod命令加载驱动程序。
加载zldj_drv.o的运行结果如下:
[root@Linux aldj]# insmod zldj_drv.o
Using zldj_drv.o
ZLDJ_Module register success!!![--kernel--]
5.3运行用户应用程序
运行用户应用程序testZLDJ,当按下任意数字键时,电机开始旋转。
[root@Linux zldj]# ./testZLDJ
Please input Number (0~9):1
End of Test
第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。