嵌入式课程设计报告_第1页
嵌入式课程设计报告_第2页
嵌入式课程设计报告_第3页
嵌入式课程设计报告_第4页
嵌入式课程设计报告_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、嵌入式课程设计报告 题 目: 学 部: 班 级: 学 号: 学生姓名: 指导老师: 时 间: 目 录一、课程设计的目的与要求····················2二、实验介绍··················

2、83;·············2三、实验原理························3四、ARM启动代码设计 ·········&

3、#183;·······5五、实验体会及总结 ···················9六、参考文献 ····················

4、····9一、课程设计的目的与要求1、熟悉ARM 本身自带的PWM,掌握相应寄存器的配置。2、Linux 下编程实现ARM 系统的PWM 输出,从而控制直流电机。3、了解直流电机的工作原理,学会用软件的方法实现步进电机的脉冲分配。4、掌握带有PWM 的CPU 编程实现其相应功能的主要方法。2、 实验介绍学习直流电机的工作原理,了解实现电机转动对于系统的软件和硬件要求。学习ARM PWM的生成方法。使用Redhat Linux 9.0 操作系统环境及ARM 编译器,编译直流电机的驱动模块和应用程序。运行程序,实现直流电机的调速转动。3、 实验原理1、直流电

5、动机的PWM 电路原理晶体管的导通时间也被称为导通角,若改变调制晶体管的开与关的时间,也就是说通过改变导通角 的大小,如图2.9.1 所示,来改变加在负载上的平均电压的大小,以实现对电动机的变速控制,称为脉宽调制 (PWM)变速控制。在PWM 变速控制中,系统采用直流电源,放大器的频率是固定,变速控制通过调节脉宽来实现。构成PWM 的功率转换电路或者采用"H"桥式驱动,或者采用 "T"式驱动。由于"T"式电路要求双电源供电,而且功率晶体管承受的反向电压为电源电压的两倍。因此只适用于小功率低电压的电动机系统。而"H"

6、桥式驱动电路只需一个电源,功率晶体管的耐压相对要求也低些,所以应用得较广泛,尤其用在耐高压的电动机系统中。脉宽调制 (PWM)变速2、直流电动机的PWM 等效电路如图2.9.2 a 所示:是一个直流电动机的PWM 控制电路的等效电路。在这个等效电路中,传送到负载 (电动机)上的功率值决定于开关频率、导通角度及负载电感的大小。开关频率的大小主要和所用功率器件的种类有关,对于双极结型晶体管(GTR),一般为lkHz至5kHz,小功率时(100W,5A 以下)可以取高些,这决定于晶体管的特性。对于绝缘栅双极晶体管(IGBT),一般为5kHz 至l2kHz;对于场效应晶体管(MOSFET),频率可高达

7、2OkHz。另外,开关频率还和电动机电感有关,电感小的应该取得高些。等效电路 PWM 电路中电流和电压波讨论当接通电源时,电动机两端加上电压UP,电动机储能,电流增加,当电源中断时,电枢电感所储的能量通过续流二极管VD 继续流动,而储藏的能量呈下降的趋势。除功率值以外,电枢电流的脉动量也与电动机的转速无关,仅与开关周期、正向导通时间及电机的电磁时间常数有关。四、ARM启动代码设计 首先是设备初始化,定义直流电机驱动程序的初始化函数ZLDJinit(),在函数中实现向系统注册设备号、设备名称和初始化寄存器。向系统注册设备,这里定义电机的主设备号宏符号名为ZLDJ-MAJOR,设备名称为zldj-

8、drv,设备的结构体为&ZLDJ-ops,则设备的注册函数为:Devfs-register-chrdev(ZLDJ-MAJOR,”zldj-dev”,ZLDJ-ops);设备初始化函数:Static intintZLDJ-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时,设备注册失败Prin

9、tk(”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&l

10、t;<18;/电机反转GRCR为复位寄存器,当取值为1时,电机停止转动。GPCR2 |=(0x1<<20;/电机正转停止GPCR2 |=(0x1<<18;/电机反转停止为了能让电机旋转一段时间后,自动停止转动,要使用函数udelay()设置一段时间延迟。由于函数udelay()是微妙级,且该值不能取得太大,否则会产生溢出,因此设置一个循环来加大延迟的时间。for(i=0;i<300;i+)udelay(8000);/延时直流电机驱动源程序:/*直流电机模块驱动程序*zldj-dev.c*/1.#include<linux/config.h>2.#

11、include<linux/kernel.h>3.#include<linux/sched.h>4.#include<linux/timer.h>5.#include<linux/init.h>6.#include<linux/module.h>7.#include<linux/delay.h>8.#include<linux/interrupt.h>9.#include<linux/devfs-fs-kernel.h>10.#include<linux/fs.h>11.#include

12、<linux/slab.h>12.#include<asm/io.h>13.#include<linux/asm/irq.h>14. #include<linux/hardware.h>15.#define ZLDJ-MAJOR 11116.#define VERS”ZLDJ-dev”17.void showversion(void)18.19.printk(”*n”);20.printk(“%sn”,VERS);21.printk(“*nn”);22.23./*接口函数ioctl*/24.ssize-tZLDJ-ioctl(struct ino

13、de*inode,struct file*file,unsigned int cmd,unsigned long arg) 25.26.int i;27. GPSR2 |=(0x1<<20;/电机正转28. for(i=0;i<300;i+)29.udelay(8000); /延时30. GPCR2 |=(0x1<<20;/电机正转停止31. for(i=0;i<300;i+)32. udelay(8000); /延时33.GPSR2 |=(0x1<<18;/电机反转34. for(i=0;i<300;i+)35. udelay(8000)

14、; /延时36. GPCR2 |=(0x1<<18;/电机反转停止37.udelay(arg);38.return 0;39. 40.static struct file-operations ZLDJ-ops=41.ioctlZLDJ-ioctl,42.;43. static intinit set-ZLDJ-init(void)44.45.int ret=-ENODEV;46.ret=devfs-register-chrdev(ZLDJ-MAJOR,”ZLDJ-drv”,&ZLDJ-ops);47.showversion();48.printk(“ZLDJ-Module

15、 register success!-kernel-n”);49.if(ret<0)/当返回值小于0时,设备注册失败50.51.printk(“Could not register ZLDJ-driver”);52.53.return 0;54.55.static voidexit cleanup-ZLDJ-ctl(void)56.57.#ifdef OURS-HELLO-DEBUG58.printk(“cleanup-Module-kernel-n”);59.#endif60.decfs-unregister-chrdev(ZLDJ-MAJOR,”ZLDJ-drv”)61.62.MOD

16、ULE-LICENSE(“GPL”)63.module-init(set-ZLDJ-init);64.module-exit(cleanup-ZLDJ-ctl); 直流电机用户应用程序直流电机用户应用程序设计分析,直流电机应用程序的功能是在用户空间调用设备驱动程序,其主要设计步骤如下。第一步,获取直流电机驱动程序的文件描述符。 fd=open("/dev/zldj_drv",O_RDWR);第二步,调用设备驱动程序中的函数ioctl(),向电机发出控制指令。 ioctl(fd,0x1,1000); 直流电机用户应用程序源程序:/* 键盘用户应用程序:testZLDJ.c *

17、/ 1.#include<stdio.h>2.#include<sys/ioctl.h>3.#include<fcntl.h>4.#include<unistd.h>5.int main()6.7. int fd;8. int ret;9. fd=open("/dev/zldj_drv",O_RDWR);10. if(fd<0)11. 12. printf("nnOpen device zldj errorn");13. 14. printf("n please input Number (

18、0-9):");15. scanf("%x",&ret);16. ioctl(fd,0x1,1000);17. close(fd);18. printf("End of Testn");19. return 0;20.驱动程序的编译文件MakefileKERNELDIR=/LinuxINCLUDEDIR=$(KERNELDIR)/includeCROSS_COMPILE=arm-Linux-CC =$(CROSS_COMPILE)gccCFLAGS+=-I.CFLAGS+=-Wall-O-D_KERNEL_-DMODULE-I $ (I

19、NCLUDEDIR)TARGET=zldj_drv.oall:$(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 .depend2.4用户程序的Makefile文件CC=arm-Linux-gccSTD= _GUN_SOURCEWARN= -WallTARGTS=testZLDJ.c.o: $(CC) -c $ (CFLAGS)-D $ (STD

20、) $ (WARN) $ <all: $(STARGTS)TestZLDJ:testZLDJ.o $(CC)testZLDJ.o -o testZLDJclean: rm-f *.o core a.out $ (TARGTS)clobber:clean rm-f $ (TARGTS)建立设备进入点 由于直流电机驱动程序中已经定义其主设备号为111,此设备号没有定义,故取默认值为0.直流电机的设备进入点为zldj_drv。创建直流电机驱动程序的设备进入点如下: rootLinux dcmo_drv# mknod/dev/zldj_drv c 111 0加载驱动程序 使用命令insmod命令

21、加载驱动程序。加载zldj_drv.o的运行结果如下:rootLinux aldj# insmod zldj_drv.o Using zldj_drv.o ZLDJ_Module register success!-kernel-运行用户应用程序 运行用户应用程序testZLDJ,当按下任意数字键时,电机开始旋转。rootLinux zldj# ./testZLDJ Please input Number (09):1End of TestLinux 下的直流电机程序包括模块驱动程序和应用程序两部分。Module 驱动程序实现了以下方法:static struct file_operation

22、s s3c2410_dcm_fops = owner: THIS_MODULE,open: s3c2410_dcm_open,ioctl: s3c2410_dcm_ioctl,release: s3c2410_dcm_release,;开启设备时,配置IO 口为定时器工作方式:( GPBCON &= 0xf; GPBCON |= 0xa; )配置定时器的各控制寄存器:( TCFG0 &= (0x00ff0000); TCFG0 |= (DCM_TCFG0); TCFG1 &= (0xf); TCNTB0 = DCM_TCNTB0; /* less than 10ms *

23、/ TCMPB0 = DCM_TCNTB0/2; TCON &=(0xf); TCON |= (0x2); TCON &=(0xf); TCON |= (0x19); )在s3c2410_dcm_ioctl 中提供调速功能接口:case DCM_IOCTRL_SETPWM:return dcm_setpwm(int)arg);应用程序dcm_main.c 中调用:ioctl(dcm_fd, DCM_IOCTRL_SETPWM, (setpwm * factor);实现直流电机速度的调整。运行程序 建立设备进入点 由于直流电机驱动程序中已经定义其主设备号为111,此设备号没有定义,故取默认值为0.直流电机的设备进入点为zldj_drv。创建直流电机驱动

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论