arm嵌入式linux系统。
设计与开发。项。目。
设。计。
院系 :信息工程学院
班级 :2009级(一)班。
学号 : 2009051107
姓名 : 谷耀民
授课教师 : 杜俊
在嵌入式linux开发过程中需要为指定设备编写和编译驱动程序,这与以往在pc机上的linux驱动开发明显不同,本文设计了基于s3c2440嵌入式linux下激光雕刻系统的步进电机驱动程序。
1 硬件系统的设计。
步进电机开环控制系统主要由**控制器、步进电机驱动器、传感器以及步进电机四大部分组成。本系统采用基于arm920t内核的s3c244 0a微处理器作为控制系统的**控制器,该芯片主频400mhz,最高可达到533mhz,内含多种设备接口,存储器使用64mb的nand flash和64mb的sdram。图1所示为控制系统框图。
图1 环形脉冲流程图。
2 系统的工作原理。
本系统主要控制两个两相混合式步进电机,分别代表x轴和y轴带动传能光纤进行激光雕刻。系统采用8路i/o口进行脉冲输出,每4路接一个步进电机驱动器,通过功率放大后,进入步进电机的各项绕组。电机有半步、整步两种工作模式,整步模式的步距角为1.
8°,半步模式的步距角为0.9°,整步一周共200步。如:
半步模式的两步进电机正转脉冲为;整步模式为,一个步进电机运作时,只对脉冲时序的高或低4位操作,另外4位为0。而改变脉冲的顺序,即可改变转动方向。在整个控制系统中,数据处理在linux应用程序中完成,步进量传递给linux驱动程序后,由驱动程序完成脉冲输出。
通过软件来完成脉冲分配,可根据应用系统的需要,随时改变对步进电机的控制。
3 嵌入式linux步进电机驱动程序的设计。
linux操作系统将所有的设备(而不仅是存储器里的文件)都看成文件,以操作文件的方式访问设备。应用程序不能直接操作硬件,而是使用统一的接口函数调用硬件驱动程序。设备驱动程序是操作系统内核和硬件之间的接口。
linux设备驱动与内核接口可分为三大方面:a.与系统启动**的接口对设备进行初始化;b.
与内核接口通过数据结构来完成;c.与设备的接口对设备进行读写操作。
步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。而脉冲信号的频率和脉冲数是控制电机的两个重要方面。本系统步进电机4路脉冲输出由硬件地址0x28000006的bit0~bit3控制,bit0对应motor a+,bit1对应motor b+,bit2对应motor_a-,bit3对应motor_b-。
这里针对整步模式下的步进电机进行脉冲分配信号,半步模式的步进电机正转导电状态时的控制顺序为a+_a+b+_b+_b+a-_a-_一a-b-_b-,整步模式的步进电机正转导电状态时的控制顺序为a+_b+_a-_b-。
因此在程序中需要通过编制脉冲分配信号来控制步进电机,并通过修改脉冲分配信号来实现对步进电机方向的控制。图2是用软件形成环形脉冲的流程图。
系统中的步进电机只响应应用程序传送给驱动的步进量和部分参数,只能顺序地进行控制操作,因此它可作为字符设备来进行驱动。在驱动程序中,需要提供几个操作函数的入口点,分别为open、read、write、ioet1等。而ioct1函数尤为重要,系统通过调用这个函数可以控制步进电机的转动。
在初始化函数中,会将驱动程序的file operations结构连同其主设备号一起向内核进行注册。对于字符设备使用以下函数进行注册:int register_chrdev(unsigned int major,const char*name,struct file_operations*fops);其中,unsigned int major为定义的主设备号,const char*name为定义的设备名称,这里把设备名宏定义为stepper。
file_operations*fops为定义的指针变量。申请控制步进电机的端口用以下函数进行调用:request_region(0x28000006, 1, const char*name);因为步进电机用到了i/o端口,而在s3c2440中操作端口要用虚拟地址而非实际的物理地址,因此要修改内核**。
修改文件内核源**中间的该文件在linux/arch/arm/mach-s3c2440中,在结构体static struct map_descsmdk_io_desc中添加一行数组元素,则步进电机的物理地址0x28000006对应的虚拟地址为0xd3000006,在驱动程序中应对这个地址进行操作。
根据上面提到的步进电机的脉冲分配信号,定义它半步模式正转脉冲为:
unsigned char pulse_table=
利用应用程序传递给stepper ioct1的参数arg来判断转动方向。
编写ioctl函数用来接收应用程序对于步进电机的控制。
以下是部分驱动程序**:
static int stepper ioctl (struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg)
int i;
if(cmd<0||cmd>256)
return –einval }
for (i=0;i<8;i++)
if ((cmd &(1<
elses3c2440_gpio_setpin (gpd_in_table[i],1);}
return 0;
设备卸载与前面提到的设备注册是相反的过程。当从系统中卸载一个模块时,主设备号要得到释放。这一操作可以调用以下函数进行模块清除:
int unregister_chrdev(unsigned int major,const char*name);
首先,编译步进电机模块,打开内核中drivers/char/konfig文件,添加如下语句:
config stepper_module、tristate"stepper module"、depends on arch_s3c2440、help、stepper driver module。
在终端中运行命令make menuconfig,进入内核配置主菜单,在devicedriver→character device菜单中看到刚才所添加的选项了,之后编译为模块方式。
其次,打开内核中drivers/char/makefile文件,添加如下语句:
obj-$(config_stepper_modell)+=stepper_
最后,回到内核源**根目录位置,执行make modules,就可生成系统所需要的内核模块文件stepper 了。至此,完成了步进电机模块驱动的编译。之后,便可使用insmod、rmmod命令分别对模块进行加载、卸载了。
嵌入式作业
电力设备测控系统中的总线通讯协议实现。程俊 200910302013 一 程序实现的功能 嵌入式系统作为测控系统主机,依次每隔30秒获取设备数据,发送给各个传感器。1 程序实现是通个定义的一个数组,然后数组中分别放入 起始标记aa 设备类型 设备编号 数据发送请求55 校验位这里采用求和校验,而将第...
嵌入式作业
专业 电子信息工程班级 电信10 1 任课教师 姓名 学号成绩。题目 查阅相关资料,你认为选用哪一种硬件 芯片 和软件比较适合本专业的要求?为什么?答 个人觉得选用三星的6410芯片更适合本专业的要求,6410对比与2440不会更容易被淘汰,而且现在6410有很多开发板可以供我们自学,比如飞凌的ok...
嵌入式作业
include 基本系统数据类型。include 提供socket函数及数据结构。include 标准输入输出。include 标准库。include 提供错误号errno的定义,用于错误处理。include 字符串函数定义。include read函数 write函数和getpid函数等头文件。i...