欢迎来到课桌文档! | 帮助中心 课桌文档-建筑工程资料库
课桌文档
全部分类
  • 党建之窗>
  • 感悟体会>
  • 百家争鸣>
  • 教育整顿>
  • 文笔提升>
  • 热门分类>
  • 计划总结>
  • 致辞演讲>
  • 在线阅读>
  • ImageVerifierCode 换一换
    首页 课桌文档 > 资源分类 > PPT文档下载  

    第11章 步进电机驱动的设计.ppt

    • 资源ID:680290       资源大小:324KB        全文页数:26页
    • 资源格式: PPT        下载积分:10金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第11章 步进电机驱动的设计.ppt

    第11章 步进电机驱动的设计,本章重点,Linux设备驱动程序的结构。步进电机驱动的设计。步进电机驱动程序的调试。,本章内容,11.1 步进电机概述11.2 嵌入式Linux步进电机的驱动11.3 步进电机驱动的设计,11.1 步进电机概述,在步进电机的设计中硬件设计和软件编程2大部分。在硬件设计方面,需要根据其功能设计驱动电路原理图、进行PCB的制作、电路板制作,购买元器件和焊接。硬件环境的搭建是软件调试的基础,是本设计的重要组成部分之一。基于操作系统的驱动程序的设计,首先就要搭建软件平台环境,需要有交叉编译器的安装、Bootloader的配置和移植、内核的移植、根文件系统的制作几个步骤,然后进行驱动程序的设计和编译调试。通常将硬件驱动程序编写成一种可加载的内核模块并进行开发和配置,这样用户就可以将硬件驱动程序作为一种独立的系统进行升级而不必对内核进行改动。,11.1 步进电机概述,步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点。使得在速度、位置等控制领域用步进电机来控制变的非常的简单。虽然步进电机已被广泛地应用,但步进电机并不能像普通的直流电机,交流电机在常规下使用。它必须由双环形脉冲信号、功率驱动电路等组成控制系统方可使用。因此用好步进电机却非易事,它涉及到机械、电机、电子及计算机等许多专业知识。,11.1 步进电机概述,EELIOD 系统的步进电机使用的是四相步进电机,采用的电机控制芯片是 Allegro 公司的UCN4202A,它包含低功率 CMOS 逻辑控制部分和达林顿管输出驱动极,最大输出电流为 1.5A,使用单相或双相,半步激励方式,内设续流二极管和过热保护电路。UCN4202A 的控制功能包括 PWM 波输入,电机转动方向,输出使能和复位功能。OE 端使用GPIO53控制,为高时,电机没有输出;为低时UCN4202A 开始工作。DIC端为方向端,为低时为正向,为高时为反向。UCN4202A 的逻辑控制有 ABCD 四个相位,在正向时,单相激励的顺序是A-B-C-D,两相激励的顺序是AB-BC-CD-DA,而半步激励的顺序是A-AB-B-BC-C-CD-D-DA。当为反向时,同理就是从D相开始。以下是步进电机的电路连接图,11.2 嵌入式Linux步进电机的驱动,11.2.1 步进电机设备驱动程序设计流程基于操作系统的驱动程序调用过程如图11.2所示。,11.2 嵌入式Linux步进电机的驱动,编写模块程序的时候,必须提供两个函数,一个是int init_module(void),供insmod在加载此模块的时候自动调用,负责进行设备驱动程序的初始化工作。init_module函数返回0以表示初始化成功,返回负数表示失败。另一个函数是void cleanup_module(void),在模块被卸载时调用,负责进行设备驱动程序的清除工作。在成功的向系统注册了设备驱动程序后(调用register_chrdev成功后),就可以用mknod命令来把设备映射为一个特别文件,其它程序使用这个设备的时候,只要对此特别文件进行操作就行了。在内核升级到2.4版本后,系统提供了两个新的函数devfs_register和devfs_unregister,用于设备的注册与卸载。,11.2 嵌入式Linux步进电机的驱动,当设备驱动程序以模块形式加载时,模块在调用insmod命令时被加载,此时的入口地址是init_module函数,在该函数中完成设备的注册。接着根据用户的实际需要,对相应设备进行读、写等操作,同样在执行命令rmmod时调用函数cleanup_module,完成设备的卸载。字符设备驱动程序设计的主要过程如下:1结构体设计2步进电机驱动读、写函数的设计3步进电机驱动程序的注册4步进电机驱动程序的卸载5步进电机驱动程序设计,11.2 嵌入式Linux步进电机的驱动,11.2.2 步进电机驱动程序需求分析步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。在非超负载的情况下电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数而不受负载变化的影响。所以在驱动程序中只需要考虑这两个方面的影响。本系统的步进电机的四相由硬件地址0 x28000006的bit0-bit3控制,bit0对应MOTOR_A,bit1对应MOTOR_B,bit2对应MOTOR_C,bit3对应MOTOR_D。本节所描述的驱动是针对整MOTOR整步模式下的步进电机,整步模式下的步距角180。在整步模式下的脉冲分配信号如表11.1所示。,11.2 嵌入式Linux步进电机的驱动,所以在程序中需要通过编制脉冲分配表控制步进电机。并且通过修改脉冲分配表可以实现步进电机方向的控制。系统的步进电机仅仅是一个输出的通道只能顺序的进行控制的操作因此作为一个字符设备来进行驱动。对于字符设备的操作而言驱动程序需要提供相关的几个操作分别为open、read、write、ioctl等相关的函数入口点。在驱动程序的实现过程中需要定义这些文件相关的操作,填充进入file_operations结构中。与普通文件相比,设备文件的操作要复杂得多。不可能简单的通过read、write等操作来实现。并且由于对于步进电机驱动程序没有相关的输入与输出更关注的是对硬件的控制因此在驱动程序对于write操作和read操作仅需返回0.而对于硬件的控制只需要在驱动程序中实现ioctl函数,并在其中添加相应的case即可。通过cmd区分操作,通过arg传递参数和结果。,11.3 步进电机驱动的设计,1、编写驱动程序和应用程序操作步骤:(1)在/home新建目录motorrootlocalhost home#mkdir motor(2)进入刚建的motor目录然后新建driver目录和app目录。rootlocalhost home#cd motorrootlocalhost motor#mkdir driverrootlocalhost motor#mkdir app(3)进入刚建的driver目录然后编写驱动源代码。rootlocalhost motor#cd driverrootlocalhost driver#vi electromotor.c程序代码如下:#include#include,11.3 步进电机驱动的设计,#include#include#include#include#include#include#include#include#include#include#define ELECTROMOTOR_MAJOR 140#define ELECTROMOTOR_6(ELECTROMOTOR_1+6)#define ELECTROMOTOR_7(ELECTROMOTOR_1+7)#define electromotor_sle(*(volatile unsigned long*)ELECTROMOTOR_GPACON)#define electromotor_sle_data(*(volatile unsigned long*)ELECTROMOTOR_GPADATA)devfs_handle_t devfs_electromotor;,11.3 步进电机驱动的设计,unsigned long ELECTROMOTOR_1;unsigned long ELECTROMOTOR_GPACON;unsigned long ELECTROMOTOR_GPADATA;/unsigned long electromotor_write_addr;intelectromotor_open(struct inode*,struct file*);intelectromotor_release(struct inode*,struct file*);int electromotor_ioctl(struct inode*,struct file*,unsigned int,unsigned long);ssize_t electromotor_read(struct file*,char*,size_t);ssize_t electromotor_write(struct file*,char*,size_t);static struct file_operations electromotor_fops=open:electromotor_open,read:electromotor_read,write:electromotor_write,/ioctl:electromotor_ioctl,release:electromotor_release,;,11.3 步进电机驱动的设计,int electromotor_open(struct inode*inode,struct file*filp)/*select NGCS2*/electromotor_sle|=0 x2000;electromotor_sle_data,11.3 步进电机驱动的设计,ssize_t electromotor_write(struct file*fp,char*buf,size_t size)char key;if(get_user(key,buf)return-EFAULT;(*(volatile unsigned char*)ELECTROMOTOR_6)=key;return 1;int electromotor_release(struct inode*inode,struct file*filp)electromotor_sle,11.3 步进电机驱动的设计,int _init electromotor_init(void)printk(*electromotor_init*n);ELECTROMOTOR_GPACON=ioremap(0 x56000000,4);ELECTROMOTOR_GPADATA=ioremap(0 x56000004,4);ELECTROMOTOR_1=ioremap(0 x10000000,8);devfs_electromotor=devfs_register(NULL,electromotor,DEVFS_FL_DEFAULT,ELECTROMOTOR_MAJOR,0,S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP,11.3 步进电机驱动的设计,static void _exit electromotor_exit(void)devfs_unregister(devfs_electromotor);module_init(electromotor_init);module_exit(electromotor_exit);步进电机应用程序设计(1)进入刚建的app目录然后编写驱动源代码。rootlocalhost driver#cd/home/motor/app(2)编写驱动源代码。rootlocalhost app#vi electromotor_test.c程序代码如下:#include,11.3 步进电机驱动的设计,#include#include#include#include#include#include#include#include#include#include#include#include int main()int electromotor_fd,count;char ret;,11.3 步进电机驱动的设计,electromotor_fd=open(/dev/electromotor,O_RDWR);if(electromotor_fd=0)printf(open electromotor device errorn);return 0;while(1)ret=0 x7;count=write(electromotor_fd,11.3 步进电机驱动的设计,usleep(10000);ret=0 xb;count=write(electromotor_fd,11.3 步进电机驱动的设计,ret=0 xe;count=write(electromotor_fd,2、编译与移植驱动和应用程序1)编辑、移植驱动程序一、宿主机:(1)进入driver目录rootlocalhost app#cd/home/motor/driver(2)编写Makefile 文件rootlocalhost driver#vi Makefile程序代码如下:CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc LD=/opt/host/armv4l/bin/armv4l-unknown-linux-ld,11.3 步进电机驱动的设计,CFLAGS=-D_KERNEL_-I/RJARM9-EDU/kernel/include/linux-I/RJARM9-EDU/kernel/include-Wall-Wstrict-prototypes-Wno-trigraphs-Os-mapcs-fno-strict-aliasing-fno-common-fno-common-pipe-mapcs-32-march=armv4-mtune=arm9tdmi-mshort-load-bytes-msoft-float-DKBUILD_BASENAME=s3c2410_testirq-I/opt/host/armv4l/src/linux/include DMODULEelectromotor.o:electromotor.c$(CC)$(CFLAGS)-c$-o$#cp electromotor.o/-f.PHONY:cleanclean:-rm-f*.o distclean:make cleanrm-f tags*(3)编译Makefile 文件rootlocalhost driver#make,11.3 步进电机驱动的设计,二、目标板:(1)执行挂载命令#mount 192.168.2.80:/home/mnt(2)进入/mnt目录#/cd/mnt/motor/driver(3)插入electromotor.o驱动模块/mnt/gpio/driver#insmod electromotor.o 2)编译、移植应用程序 一、宿主机:(1)进入app目录rootlocalhost app#cd/home/motor/app(2)编写Makefile 文件rootlocalhost app#vi Makefile,11.3 步进电机驱动的设计,程序代码如下:CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc LD=/opt/host/armv4l/bin/armv4l-unknown-linux-ldCFLAGS=-D_KERNEL_-I/RJARM9-EDU/kernel/include/linux-I/RJARM9-EDU/kernel/include-Wall-Wstrict-prototypes-Wno-trigraphs-Os-mapcs-fno-strict-aliasing-fno-common-fno-common-pipe-mapcs-32-march=armv4-mtune=arm9tdmi-mshort-load-bytes-msoft-float-DKBUILD_BASENAME=s3c2410_testirq-I/opt/host/armv4l/src/linux/include-DMODULEmotor_test:electromotor_test.c$(CC)$-o$#cp-f motor_test/.PHONY:cleanclean:-rm-f*.o-rm-f motor_test,11.3 步进电机驱动的设计,distclean:make cleanrm-f tags*注意:使用TAB键(3)执行 make命令rootlocalhost driver#make 二、目标板:(1)执行挂载命令#mount 192.168.2.80:/home/mnt(2)进入/mnt目录#cd/mnt/motor/app(3)插入motor_test驱动模块/mnt/motor/app#./motor_test结果分析,通过实验运行情况,结果判断步进电机的旋转情况与设计是否一致。,

    注意事项

    本文(第11章 步进电机驱动的设计.ppt)为本站会员(夺命阿水)主动上传,课桌文档仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知课桌文档(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-1

    经营许可证:宁B2-20210002

    宁公网安备 64010402000986号

    课桌文档
    收起
    展开