历史上的今天
返回首页

历史上的今天

今天是:2026年01月06日(星期二)

正在发生

2023年01月06日 | 基于S3C2440A微处理器和Linux操作系统实现对步进电机的控制

2023-01-06 来源:elecfans

随着嵌入式技术的不断成熟,基于嵌入式系统编写特制电路下的设备驱动程序也越来越受到人们的青睐。在各种嵌入式操作系统中,嵌入式Linux是免费的源代码开放软件,可根据需要任意进行剪裁。在嵌入式Linux开发过程中需要为指定设备编写和编译驱动程序,这与以往在PC机上的Linux驱动开发明显不同,本文设计了基于S3C2440嵌入式Linux下激光雕刻系统的步进电机驱动程序。


1 硬件系统的设计

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

基于S3C2440A微处理器和Linux操作系统实现对步进电机的控制

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函数用来接收应用程序对于步进电机的控制。以下是部分驱动程序代码:

基于S3C2440A微处理器和Linux操作系统实现对步进电机的控制

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

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 结论

在嵌入式Linux系统下,设备驱动程序是内核和硬件之间的接口,本文采用字符设备的思想去实现步进电机驱动程序的开发,介绍了嵌入式Linux驱动程序的原理,归纳了驱动程序开发的一般流程,并结合步进电机的驱动阐述了驱动程序的编写。与原有通过操作PC机来控制步进电机相比,本文是在Linux操作系统支持MMU的情况下完成了对步进电机的控制。


推荐阅读

史海拾趣

Hosiden Corporation公司的发展小趣事

在追求经济效益的同时,Hosiden也始终关注可持续发展和社会责任。公司致力于通过技术创新和绿色生产等方式,降低对环境的影响并促进资源的循环利用。此外,Hosiden还积极参与社会公益事业和慈善活动,为社会的发展和进步贡献了自己的力量。这些举措不仅提升了公司的社会形象和品牌价值,也为其在电子行业的长远发展奠定了坚实基础。

Control Sciences Inc公司的发展小趣事

随着技术的不断进步,Control Sciences Inc开始寻求更广阔的市场空间。公司积极参与国内外各大电子展会,展示其先进的产品和技术。同时,公司还加大了市场推广力度,与多个知名企业建立了战略合作关系。通过这些努力,Control Sciences Inc的产品逐渐走进了更多的企业和家庭,其品牌影响力也日益增强。

Alliance Fiber Optics Products Inc公司的发展小趣事

近年来,AFOP的发展取得了显著成就,其产品在光网通信领域处于领先地位。202X年,世界500强康宁公司看中了AFOP的技术实力和市场潜力,决定对其进行收购。这一收购使得AFOP获得了更多的资源和支持,加速了公司的技术创新和市场拓展步伐。同时,康宁公司也通过收购AFOP进一步巩固了其在光纤通信领域的领先地位。

American Micro Products Inc公司的发展小趣事

AMP自创立之初,就专注于微电子产品的研发与生产。在一次技术攻关中,公司的研发团队成功开发出一款具有高性能、低功耗特点的微型芯片,这一创新产品迅速在市场上获得了广泛认可。随着技术的不断迭代,AMP持续推出了一系列具有竞争力的电子产品,逐渐在行业中建立了自己的地位。

FTCAP Fischer & Tausche Capacitor Group公司的发展小趣事

AMP自创立之初,就专注于微电子产品的研发与生产。在一次技术攻关中,公司的研发团队成功开发出一款具有高性能、低功耗特点的微型芯片,这一创新产品迅速在市场上获得了广泛认可。随着技术的不断迭代,AMP持续推出了一系列具有竞争力的电子产品,逐渐在行业中建立了自己的地位。

岑科(CENKER)公司的发展小趣事

为了实现更长远的发展,岑科在2004年决定进军生产制造领域。公司在深圳和广西设立了工厂,开始了自主生产制造之路。在这一过程中,岑科严格控制生产流程,灵活配置资源,并建立了严格的质量管理体系,以确保产品的高水平交付。通过自主研发和创新,岑科逐渐在生产制造领域取得了显著的成果,产品线不断扩展,市场份额也逐渐增加。

问答坊 | AI 解惑

FPGA初步之altera PLL的几种反馈模式

本文摘自《Altera FPGA/CPLD设计-高级篇》 一般我们在例化Altera器件的锁相环时可以看到这么几种相应于PLL的输出的PLL内部反馈模式,如下图所示: 下面我们对照锁相环反馈模型,对这几种反馈模式一一加以说明。 锁相环反馈模型如下图所示: ...…

查看全部问答>

视频监控应景而生 高清技术将何从以对?

视频监控系统是安全防范系统的组成部分,它是一种防范能力较强的综合系统。视频监控以其直观、方便、信息内容丰富而广泛应用于许多场合。近年来,随着计算机、网络以及图像处理、传输技术的飞速发展,视频监控制技术也有长足的发展。   &nbs ...…

查看全部问答>

如何在ucos下执行音乐程序

在ucos移植时想让音乐程序和数码管,还有流水灯轮换工作。其中音乐程序需要使用定时器。但此定时器不提供时钟脉冲。该如何分配和控制三者的关系呢?谢谢! …

查看全部问答>

关于WINCE50的EBOOT 系列问题3

EBOOT在运行到bl      OALXScaleSetFrequencies后死掉了 搜索OALXScaleSetFrequencies的原代码发现在我的BSP下 C:\\WINCE500\\PLATFORM\\SMDKPXA270\\SRC\\COMMON\\Freq\\freq.s中 可是又发现在 C:\\WINCE500\\PLATFORM\\M ...…

查看全部问答>

.net 2005 开发wince 怎样使用sdk中的库

初学wince,希望能利用微软提供的Text-To-Speech库来实现发声,在定制系统时已将Speech SAPI 勾选,并导出了相应的sdk,但不知道怎么利用,望各位大虾帮忙指点…

查看全部问答>

USB MODEM电路中的变压器如何选择?

本人正在做USB MODEM ,电路的原理图 PCB都已搞定,唯独不知其中的变压器如何确定,请各位指教!…

查看全部问答>

驱动程序如何控制IO口?

在USB中,都是通过端点缓冲传输数据,这和IO口怎么联系起来啊?谢谢…

查看全部问答>

解密单反之玄机 尼康D7000非暴力拆解

本文转自互联网        不知道是不是在每个摄影爱好者或是器材发烧友心中都有一个“邪恶”的念头,想把相机拆开看看,到底有什么秘密隐藏其中。只不过现实的无奈,想必大家手里的 机器都不便宜,尤其是单反,别说 ...…

查看全部问答>

电机驱动,pcb布线请指教

这个板子接到stm32上来驱动一个有感无刷电机或是两个有刷直流电机,霍尔的线路另外接,板子只负责功率开关。板子比较小,电流3A以内,不知道有没有什么地方可以改进的。…

查看全部问答>