特点

  • 步进电机线速度控制
    控制加速、减速、最大速度和运行步数
  • 由一个定时器中断驱动
  • 全步/半步驱动模式
  • 支持所有带16位定时器的AVR设备
  • 演示程序使用的是处理器ATmega48(8位AVR处理器),运行频率为3.68MHZ,串口通信格式为19200/8/N/1

1. 介绍

这篇应用笔记描述了如何去实现精确的步进电机线速度控制,步进电机是一种电磁装置,它将数字脉冲转换为机械轴转动,使用这种电机实现了许多优点,如更高的简单性,因为没有电刷与触点的存在,低成本,高可靠性,在低速高扭矩,和高精度的运动,许多带有步进电机的系统在改变速度时需要控制加/减速,这个应用笔记介绍了一个带有演示应用程序的驱动程序,能够控制加速度以及位置和速度

这种线性速度控制是基于2005年1月“嵌入式系统编程”提出的一种算法,D. Austin的一篇“实时生成步进电机速度曲线”文章,该算法允许参数化和实时计算,只使用简单的定点算术运算没有数据表

2. 原理

2.1. 步进电机

本应用笔记涵盖了线性变速控制步进电机的理论以及控制器本身的实现,它假定读者熟悉步进电机的基本操作,但是将给出最相关主题的总结

2.1.1. 双极与单级步进电机

两种常见的步进电机是双极电机和单极电机,双极电机和单极电机类似,不同的是单极电机的每个绕组上都有一个中心抽头,如下图所示


双极电机需要电流通过绕组向两个方向驱动,需要全桥驱动器,单极电机的中心抽头使驱动电路更简单,将电流限制在一个方向,单极电机的主要缺点是在任何时候激活所有绕组的能力有限,导致与双极电机相比,扭矩更低,通过断开中心抽头,单极步进电机可以用作双极电机

2.1.2. 全步/半步

在全步进模式下使用的步进电机一次给一个绕组供电,这样,四种不同的设置(位置)是可能的,如表“Full-stepping”行所示,通过同时供电两个绕组,步进电机被困在全步进时获得的位置之间,也称为半步进,这给出了8个位置,“Half-stepping”行所示,当驱动两个绕组时,扭矩大约是仅驱动一个绕组时的1.4倍,但代价是功耗的两倍,表中的循环为一个电气周期,一个机械周期(转)通常由几个电气周期组成

2.1.3 速度特性

步进电机的一个缺点是在高速下有限的扭矩能力,因为步进电机的扭矩将随着速度的增加而减少。如图所示,在共振速度下,转矩也会下降,谐振速度取决于步进电机的驱动方案和负载


最大扭矩是在低速时实现的,这在许多应用中是一个优势

2.2. 步进电机的基本方程

要在步进电机中产生旋转运动,通过绕组的电流必须按照正确的顺序改变,这是使用一个驱动器,当收到脉冲和方向信号时,给出正确的输出序列获得的,为了使步进电机以恒定的速度旋转,脉冲必须以稳定的速率产生


计数器产生这些脉冲,频率为f [HZ]
计数器c产生延时:


步进电机的角度、位置、速度由以下公式计算:


spr是一圈的步数,n是步数,1弧度/秒=9.55转

2.3. 线性变速

要实现步进电机的平稳启动和停止,需要对步进电机的加减速进行控制,加速度、速度与位置的关系如图2-5所示,使用恒定的加速/减速可以得到线性速度曲线


步进电机脉冲之间的时间延迟控制速度,为了使步进电机的速度尽可能接近速度曲线,必须计算这些时间延迟
离散步进控制步进电机的运动,这些步进之间的时间延迟的分辨率由定时器的频率给出

2.3.1. 精确计算步内延迟

第一个计数器延迟C0以及后续的计数器延迟Cn(详见附录):


微控制器的计算能力有限,计算两个平方根是耗费时间的,因此考虑减小计算复杂度
计数器值为n时,采用泰勒级数粗略计算步间延迟(详见附录):


这种计算要比平方根快的多,但在n=1时引入了0.44的误差,一种补偿这个误差的方法是把C0乘0.676

2.3.2. 加速度变化

如附录所示,加速度由C0和n给出,如果加速度(或减速度)发生变化,必须计算一个新的n


合并这些方程:


这表明,到达给定速度所需的步数与加速度成反比:


这意味着通过改变n来改变加速度


移动给定数量的步数,减速必须以正确的步数开始,以零速度结束,下面的公式是用来计算n1

3. 实施

在这个应用说明中包含了一个用C编写的工作实现,通过打开源代码所包含的’readme.html’文件,可以找到源代码和编译信息的完整文档,应用程序演示了步进电机的线性速度控制,用户可以通过串口发出不同的命令来控制步进电机的速度曲线,AVR将相应地驱动所连接的步进电机,演示应用程序分为三个主要模块,如图3-1中的框图所示,每个块都有一个文件,主例程使用的UART例程也有一个文件


main.c:有一个菜单和一个命令接口,用户通过串行终端来控制步进电机
speed_cntr.c:计算需要的数据并产生步进脉冲使步进电机按照预期的速度运动
sm_driver.c:对步进电机进行计数并输出正确的信号来控制步进电机

为了控制步进电机,需要四个参数来描述这个过程,速度从零开始,并加速到给定的速度,保持速度不变,直到减速开始,最后电机在给定的步骤内减速到零,如图3-2所示


描述速度曲线参数:

  • step:移动的步数
  • accel:加速使用
  • decal:减速使用
  • speed:最大速度

3.1. 菜单和命令接口

要使用演示应用程序,用户必须将终端连接到AVR的串口,UART设置为19200波特,8位数据位,无校验和1位停止位。用户可以通过输入不同的命令来控制步进电机,并从演示应用程序中获取信息。UART RX中断程序(uart .c)将接收到的字符存储在接收缓冲区中并处理退格。当接收到 (ascii码13)时,主例程读取缓冲区并执行给定的命令。

开始时发送“?”命令,将提供帮助信息:


在显示菜单或执行命令之后,显示信息行:


演示应用程序给出当前步进电机的位置、加速、减速和速度,以及移动的步数

有三种不同的方法可以使步进电机移动:

  • 按<enter>
    步进电机按照应用程序给定的设置运行
  • m[data]
    步进电机按照给定的设置来移动[data]步
  • move [steps][accel][decel][speed]
    步进电机按照[accel][decel][speed]参数移动[steps]步

当步进电机开始运行时将显示Running…,只要电机还在运行,新的指令就会被屏蔽。在它停止之后,显示“oK”后接受新的命令

3.2. 速度控制器

速度控制器计算并生成速度曲线,速度控制器如图3-3所示,要运行步进电机,速度控制器通过调用函数Move()被设置


函数move()首先计算所需的所有参数然后存储在结构体中,使能定时器中断,定时器按照所需的速度曲线产生中断,每个中断调用函数step_counter()移动步进电机

3.2.1. 计算设置

在演示应用程序中,计算每个命令的速度曲线参数,并引入了从调用到步进电机开始移动的小延迟。在实际应用中,如果只需要对速度曲线进行有限的更改,则可能不需要这样做。在这种情况下,可以预先计算参数,跳过设置计算。

避免使用浮点运算,使代码运行更速,因此缩放变量是重要的,以保持准确性。预先计算的编译器常量也被用来简化算法,可以在smdriver.h头文件中找到:


计算速度曲线有两种不同的场景:

  • 持续加速,直到达到所需的速度
  • 在达到预期速度之前开始减速

该场景取决于描述速度曲线的所有四个变量

3.2.1.1. 加速到期望的速度

减速开始前达到期望的速度


max_s_lim:是需要加速到期望速度的步数


accel_lim:减速开始前的步数(不考虑期望的速度)


如果max s lim < accel lim,加速度受到达到所需速度的限制,减速依赖于此,在这种情况下,decal_val可以通过:

3.2.1.2. 期望的速度到达前减速

期望的速度到达之前必须开始减速


如果max_s_lim>accel_lim,加速被减速开始所限制,decel_val计算:

3.2.2. 定时器中断

计时器中断产生“步进脉冲”(调用函数StepCounter()),只有当步进电机移动时才运行。计时器中断将根据速度曲线在四种不同的状态下运行,如图3-6所示


这个行为是通过定时器中断中的状态机实现的,如图3-7所示


当应用程序启动或步进电机停止时,状态机保持在STOP状态。当配置计算完成后,将设置一个新的状态,并启用计时器中断,当移动超过1步时,状态机转到ACCEL,如果只移动1步,则状态更改为DECEL

当状态更改为ACCEL时,应用程序加速步进电机,直到达到所需的速度并将状态更改为RUN或减速必须启动,将状态改为DECEL

当设置状态为RUN时,步进电机保持恒速,直到减速必须启动时,状态变为DECEL

它将停留在DECEL和减速直到达到速度为零时所需的步数,然后状态被更改为STOP

3.2.2.1. 计算和计数

在加减速过程中,每一步都必须计算一个新的时间延迟,这个计算包括一个给出余数的除法,为了提高精度,这个余数被保留并包含在下一次计算中


为了跟踪位置和改变状态,需要一些计数变量。在图3-8中说明了它们的使用

  • step_count:当ACCEL开始时从0开始,并且在DECEL结束后具有与命令步数相同的值
  • accel_count:用于控制加/减速度。在ACCEL中,它从0开始,每一步都增加,直到ACCEL结束。当DECEL启动时,它被设置为decel_val,这是负的,并且每一步递增,当它达到0时,移动结束,状态设置为STOP
  • decel_start:告诉减速何时开始,当step_count等于decel_start时,状态设置为DECEL

3.3. 步进电机驱动

步进电机驱动器产生正确的信号序列以使步进电机在需求的方向上移动,步进电机驱动器的框图如图3-9所示


每次调用Step_Counter()函数时,步数计数器都会递增或递减。当使用全步进时,计数器的值从0到3,使用半步进时,取值从0到7。这个值等于步进电机在一个电周期内的不同位置,步数计数器的值作为步进表的索引,并给步进电机驱动器正确的信号

3.4. 代码速度

当调用Move()时,设置计算在定时器中断启动之前完成。从调用到步进电机启动,大约1.5毫秒的延迟。定时器中断在加速和减速期间执行计算,一个定时器中断大约使用200us,匀速运行时需要的时间更少,大约35us就足够了,最大输出速度由加/减速度计算限制,对于每圈400步的步进电机最大输出速度为:


在其他应用程序中实现此代码时,必须考虑其他中断。如果步进电机的定时器中断被另一个ISR阻塞,这将使步进电机的速度变化(不是恒定的加速度)。在给定的应用程序中,这可能不是关键的,但使代码尽可能健壮和确定总是一件好事

4. 附录

4.1. 计算延迟

4.2. 步内延迟

官方代码+文档:http://download.csdn.net/detail/u010650845/9923879

AVR446:步进电机的线速度控制相关推荐

  1. 二相混合式步进电机开环细分控制simulink仿真模型

    二相混合式步进电机开环细分控制simulink仿真模型 二相混合式步进电机闭环矢量SVPWM控制simulink仿真模型 ID:6915666764175444

  2. 电机调速程序c语言,步进电机调速控制系统设计C语言程序及说明.doc

    步进电机调速控制系统设计C语言程序及说明.doc 步进电机调速控制系统设计C语言程序及说明使用元器件单片机8051.步进电机17H185H-04A.128细分/3.0A步进电机驱动器.LED显示器.实 ...

  3. 二相混合式步进电机开环细分控制simulink建模仿真含模型文件

    目录 细分原理 二相混合式步进电机电磁转矩方程 对Te方程简单的理解 细分控制的推导 细分系统总体图 正弦电流的仿真simulink实现 关于PWM电流控制(或SVPWM控制) 关于模型中如何控制细分 ...

  4. 两相步进电机FOC矢量控制Simulink仿真模型 采用针对两相步进电机的SVPWM控制算法,实现FOC矢量控制,DQ轴解耦控制

    两相步进电机FOC矢量控制Simulink仿真模型 1.采用针对两相步进电机的SVPWM控制算法,实现FOC矢量控制,DQ轴解耦控制- 2.转速电流双闭环控制,电流环采用PI控制,转速环分别采用PI和 ...

  5. 两相步进电机FOC矢量控制Simulink仿真模型

    两相步进电机FOC矢量控制Simulink仿真模型 1.采用针对两相步进电机的SVPWM控制算法,实现FOC矢量控制,DQ轴解耦控制- 2.转速电流双闭环控制,电流环采用PI控制,转速环分别采用PI和 ...

  6. 二相混合式步进电机闭环矢量控制simulink仿真(含仿真文件)

    目录 在位置跟踪伺服系统中二相混合式步进电机闭环矢量控制simulink仿真 闭环矢量控制系统simulink图​ 闭环矢量控制系统系统结构框图 二相混合式步进电机的数学模型 矩角特性 电压方程 机械 ...

  7. python控制步进电机代码tx2_步进电机C语言控制,高手请进来指点一下!

    /*----------------------------------------------- 名称:步进电机 内容:本程序用于测试4相步进电机常规驱动 6个按键分别控制加速.减速.开启.停止 正 ...

  8. 比较几种步进电机加减速控制方案

    加减速算法是运动控制中的关键技术之一,也是实现高速.高效率的关键因素之一.在工业控制中,一方面要求加工的过程平滑.稳定,柔性冲击小:另一方面需要响应时间快,反应迅速.在保证控制精度的前提下来提高加工效 ...

  9. 利用stm32控制步进电机 速度加速度控制

    因为想申请 CSDN 博客认证需要一定的粉丝量,而我写了五年博客才 700 多粉丝,本文开启关注才可阅读全文,很抱歉影响您的阅读体验 利用stm32控制步进电机 尝试用42系步进电机做倒立摆,总结步进 ...

最新文章

  1. mysql采用 级触发_Mysql高级之触发器(trigger)
  2. mybatis入门(一)之基础安装
  3. 二叉树垂直遍历 java_【004】二叉树垂直遍历
  4. 解决Scrapy抓取中文网页保存为json文件时中文不显示而是显示unicode的问题
  5. Win8 Metro(C#)数字图像处理--2.39二值图像投影
  6. C++PrimerP104
  7. 2020-05-22
  8. 正确激活报表插件的方法
  9. java生成背景透明的png图片_关于Java生成背景透明的png图片
  10. python 角度变弧度_弧度制和角度值怎么转换?
  11. 已知IP地址和子网掩码计算网络号
  12. 中国最火最流行的40个博客网站
  13. 操作系统笔记 第二章
  14. 逆向小程序破解js神器-(工具篇)
  15. 生僻字怎么用计算机的,最实用生僻字输入方案大全
  16. Openwrt无线管理工具/命令
  17. Kahan求和公式原理
  18. 模拟器 android 升级,android – 如何在模拟器和真实设备上升级SystemUI.apk
  19. OD使用教程8(下)- 调试篇08|解密系列
  20. 一个带浮动按钮的布局

热门文章

  1. CSDN 签到在哪里
  2. PostgreSql+PostGis创建空间数据库
  3. Xtrabackup在线搭建备库与并行复制延迟
  4. 一台标准的计算机从外观上看,从外观上看.计算机有哪些组成部分?
  5. 2021-10-21 Laplace分布和指数分布,相同参数的两个指数分布之差是Laplace分布
  6. 找工作脸皮要厚,不能太玻璃心
  7. ChatGPT来了,软件测试工程师距离失业还远吗?
  8. 大学生ppt汇报中出现的一些问题及解决
  9. pycharm如何查看python文件的工作目录
  10. linux内核延时:短延迟