在嵌入式Linux开发过程中需要为指定设备编写和编译驱动程序,这与以往在PC机上的Linux驱动开发明显不同,本文设计了基于S3C2440嵌入式Linux下激光雕刻系统的步进电机驱动程序。

1 硬件系统的设计

步进电机开环控制系统主要由中央控制器、步进电机驱动器、传感器以及步进电机四大部分组成。本系统采用基于ARM920t内核的S3C244 0A微处理器作为控制系统的中央控制器,该芯片主频400MHz,最高可达到533MHz,内含多种设备接口,存储器使用64MB的Nand Flash和64MB的SDRAM。图1所示为控制系统框图。

2 系统的工作原理

本系统主要控制两个两相混合式步进电机,分别代表X轴和Y轴带动传能光纤进行激光雕刻。系统采用8路I/O口进行脉冲输出,每4路接一个步进电机驱动器,通过功率放大后,进入步进电机的各项绕组。电机有半步、整步两种工作模式,整步模式的步距角为1.8°,半步模式的步距角为0.9°,整步一周共200步。如:半步模式的两步进电机正转脉冲为{0x11,0x33,0x22,0x66,0x44,Oxcc,0x88,0x99};整步模式为{0x11,0x22,0x44,0x88,0x11,0x22,0x44,0x88},一个步进电机运作时,只对脉冲时序的高或低4位操作,另外4位为0。而改变脉冲的顺序,即可改变转动方向。在整个控制系统中,数据处理在Linux应用程序中完成,步进量传递给Linux驱动程序后,由驱动程序完成脉冲输出。通过软件来完成脉冲分配,可根据应用系统的需要,随时改变对步进电机的控制。

3 嵌入式Linux步进电机驱动程序的设计

Linux操作系统将所有的设备(而不仅是存储器里的文件)都看成文件,以操作文件的方式访问设备。应用程序不能直接操作硬件,而是使用统一的接口函数调用硬件驱动程序。设备驱动程序是操作系统内核和硬件之间的接口。Linux设备驱动与内核接口可分为三大方面:a.与系统启动代码的接口对设备进行初始化;b.与内核接口通过数据结构file.operrations来完成;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中操作端口要用虚拟地址而非实际的物理地址,因此要修改内核代码。修改文件内核源代码中间的smdk.c,该文件在linux/arch/arm/mach-s3c2440中,在结构体static struct map_descsmdk_io_desc[]中添加一行数组元素{0xd3000000,0x28000000,Ox01000000,DOMAIN_IO,0,1,0,0},则步进电机的物理地址0x28000006对应的虚拟地址为0xd3000006,在驱动程序中应对这个地址进行操作。

根据上面提到的步进电机的脉冲分配信号,定义它半步模式正转脉冲为:

unsigned char pulse_table[]=

{0x11,0x33,0x22,0x66,0x44,Oxcc,0x88,0x99};

利用应用程序传递给stepper ioct1的参数arg来判断转动方向。编写ioctl函数用来接收应用程序对于步进电机的控制。以下是部分驱动程序代码:

设备卸载与前面提到的设备注册是相反的过程。当从系统中卸载一个模块时,主设备号要得到释放。这一操作可以调用以下函数进行模块清除:

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_module.o

最后,回到内核源代码根目录位置,执行make modules,就可生成系统所需要的内核模块文件stepper module.ko了。至此,完成了步进电机模块驱动的编译。之后,便可使用insmod、rmmod命令分别对模块进行加载、卸载了。

4 结论

本文归纳了驱动程序开发的一般流程,并结合步进电机的驱动阐述了驱动程序的编写。与原有通过操作PC机来控制步进电机相比,本文是在Linux操作系统支持MMU的情况下完成了对步进电机的控制。

linux步进电机驱动程序,基于S3C2440嵌入式Linux的步进电机驱动程序相关推荐

  1. 基于2440的Linux开发原理,基于S3C2440和Linux的嵌入式网络驱动程序开发

    摘要: 嵌入式与互联网已经成为最热门的技术.使嵌入式系统具备网络功能,并将它们与Internet或企业局域网连接起来,增强了嵌入式系统多方面的实用性. 本文采用S3C2440微处理器为硬件开发平台,根 ...

  2. linux搭建web服务器论文答辩开场白,基于ARM9嵌入式Linux系统Web Server服务器计算机设计与科学专业毕业答辩.ppt...

    基于ARM9嵌入式Linux系统Web Server服务器计算机设计与科学专业毕业答辩 2009-5-31 计算机科学与技术专业 2009届本科生毕业论文答辩 基于ARM9的嵌入式Linux系统的We ...

  3. linux根文件系统的移植 课程设计,定稿基基于ARM9嵌入式Linux引导程序研究与移植嵌入式综合实验报告完整版...

    <基<基于ARM9嵌入式Linux引导程序研究与移植>嵌入式综合实验报告.doc>由会员分享,可免费在线阅读全文,更多与<(定稿)基基于ARM9嵌入式Linux引导程序研 ...

  4. 尚观linux视频配套教程,尚观最新嵌入式Linux基础视频教程 98集嵌入式Linux巨制视频教程 新手必备...

    尚观最新嵌入式Linux基础视频教程 98集嵌入式Linux巨制视频教程 新手必备 5.jpg (67.09 KB, 下载次数: 0) 2018-4-16 09:34 上传 1.jpg (44.17 ...

  5. 基于块的linux驱动程序,基于块的Linux驱动程序 块设备驱动 centos内核编译过程 操作系统课程设计...

    操作系统的课程设计,本人也是一头雾水地做完了课程设计,在这里贴下操作过程,放下当时参考的一篇CSDN文章链接:https://blog.csdn.net/cxy_chen/article/detail ...

  6. linux系统reales,基于uCLinux系统的IEEE1394设备驱动程序的编程研究与实现

    本文分析了IEEE1394协议驱动层框架,介绍了uCLinux下IEEE1394设备驱动程序架构和编写IEEE1394视频设备驱动程序的步骤和方法.(1)IEEE1394网络架构IEEE1394的网络 ...

  7. 《嵌入式 Linux应用程序开发标准教程(第2版)》——第1章 Linux快速入门 1.1 嵌入式Linux基础...

    本节书摘来自异步社区<嵌入式 Linux应用程序开发标准教程(第2版)>一书中的第1章,第1.1节,作者 华清远见嵌入式培训中心,更多章节内容可以访问云栖社区"异步社区" ...

  8. pc安装linux内核,PC/104平台嵌入式Linux系统核心定制方法

    摘 要:基于PC/104平台的嵌入式Linux技术在海洋自动观测系统中具有广泛的应用前景,Linux核心定制方法的研究是嵌入式Linux系统研制的关键工作.本文结合PC/104平台嵌入式Linux系统 ...

  9. linux 网络对讲,基于ARM与Linux的全数字化可视对讲系统的设计与实现

    摘要: 在信息化飞速发展的今天智能家居系统已越来越多的被人们所接受,从楼宇可视对讲到紧急情况报警,再到远程家电控制,智能家居系统在人们的日常生活中扮演着重要的角色.传统的可视对讲系统都是基于模拟音视频 ...

  10. arm linux 工控,基于ARM和Linux通用工控平台设计 - ARM - 电子发烧友网

    交叉编译 交叉编译就是在一个平台上生成另一个平台上的可执行代码.所谓平台,实际上包含两个概念:体系结构及操作系统.根据上述建立的开发环境,目标平台是基于ARM体系结构的运行嵌入式Linux操作系统,而 ...

最新文章

  1. 继续上次WDS部署安装未在真机上面实现问题解答
  2. No IP specified. Please specify IP with ‘objects’
  3. CentOS6.5上源码安装MongoDB3.2.1
  4. golang 获取本地ip
  5. php异步方案,php 伪异步执行实现方法
  6. matlab输入excel高版本,『matlab读取excel指定列』excel中大量数据如何导入matlab当中?超过1000个数据无法一个一个输入...
  7. spring cloud微服务之间调用Feign
  8. FFmpeg之wav转mp3(二十四)
  9. hdu-2112 HDU Today(最短路)
  10. 分析CSS布局中BFC
  11. iPad入手必备手册——iPad Mini 使用手册(适用于iOS 6软件 )
  12. jstl获取表格单元格值_表格单元格和位置绝对值
  13. CSS( Cascading Style Sheets )简书
  14. gitea/gogs忘记密码后重置密码
  15. 蓝绿发布、灰度发布(金丝雀发布) 和滚动发布
  16. 数据科学家的一天,是怎样度过的?
  17. R语言实战应用精讲50篇(三十)-R语言ggplot2绘制精美高级地图
  18. css中的min-height、max-height、min-width、max-width
  19. 空气炸锅能从“网红”到“长红”吗?
  20. 【SPSS】两独立样本T检验分析详细操作教程(附案例实战)

热门文章

  1. 一文讲透项目管理的价值和意义到底是什么?
  2. 鲸会务,多场景覆盖数字化会议管家
  3. 【作图】origin制作图中图
  4. 【Rainmeter】简简单单的 一言 小皮肤
  5. 计算机网络怎么算默认网关,ip地址子网掩码计算器_默认网关怎么计算_ip 掩码 网关的关系(2)...
  6. 三对角矩阵与追赶法介绍
  7. Web前端干货!30道Web前端面试题精选,你会几个?
  8. css集合——好看的按钮样式+阴影+渐变
  9. 时间序列分析的模型应用 – 股价预测
  10. 银行行号和银行代码是一样的吗?区别是什么?