您现在的位置是:主页 > 电路技术 > 电机控制 >


结合STM32和FPGS的步进电机运动控制系统设计

2020-02-19 21:59电机控制 人已围观

简介步进电机是一种简单、 稳定性良好的机电元件,可以将电脉冲信号转换为角位移输出,电机位移输出的大小与脉冲严格同步,具有瞬间启动,精确定位操作等特点. 步进电机转动的位移...

  步进电机是一种简单、 稳定性良好的机电元件,可以将电脉冲信号转换为角位移输出,电机位移输出的大小与脉冲严格同步,具有瞬间启动,精确定位操作等特点. 步进电机转动的位移由驱动脉冲的数量决定,而转动的速度快慢通过脉冲频率的高低来表示,因其只存在周期性的误差,没有累积误差而深受欢迎. 使用单片机、 DSP 等处理器对步进电机实现自动化控制,能够更好地应用和服务于生活的各领域,如数控系统、 医疗器械、 机械臂等,但此类系统的资源消耗大且存在实时性差的问题. 现场可编程门阵列( field-programmable gate array,FPGA) 是完全基于硬件的可编程,相比于单片机 FPGA 具有多线程、 运行速度快等优点,使其在电机控制系统的应用越来越广泛 .
  
  本研究主要以光学及精密机械检测系统中的光学位移台为例,结合单片机与 FPGA 技术设计一种步进电机运动控制系统,光学位移台主要用于光学元件的位移,使得在光学测试系统中达到调光、 调焦的目的. 通过对上位机和运动程序的设计,使得光学位移台能够实现速度、 位移的控制,达到精准定位,运行平稳及低噪声等控制要求. 采用 FPGA 可以同步或异步控制多个步进电机运动,因此通过上位机界面可以控制多个光学位移台的运行. 光学位移台可以与其他种类的台子组成多维电动调整台. 步进电机控制系统借助增量式编码器完成电机位置的反馈,实现了闭环控制,其中微处理器 STM32 作为控制系统数据收发的转换模块,FPGA 作为步进电机运动控制的核心模块. STM32 和 FPGA 能各行其是,完成系统对电机运动状态的控制及反馈. 经过仿真和测试,该控制系统的稳定性良好,达到所设定的要求. 本研究对系统的软硬件分模块进行说明,实现对单路步进电机的控制,为多路步进电机控制系统的开发提供了一定的参考.
  

  1 控制系统的整体框架与介绍

  
  本系统使用的 FPGA 为 Cyclone IV 系列,基于 VS( visual studio) 软件设计了上位机人机交互界面ꎻ利用串口通信,STM32F103 把从上位机接收到的命令,通过自带的 FSMC( flexible static memory control ̄ ler) 接口,将命令转化成 FPGA 能接收的方式. 控制系统结构框图如图 1 所示.
  图 1 控制系统结构框图
  图 1 控制系统结构框图
  
  在人机交互界面进行步进电机运行参数的设置,发送命令实现步进电机的启停、 速度等级选择、加减速、 方向控制等状态转化. FPGA 采用异步复位,同步释放方式,通过上位机复位按钮发送复位指令即可实现 FPGA 的系统复位,增加了系统复位的可靠性. 应用 Verilog 编写偶数分频器,实现脉冲的输出ꎻ 采用编码器完成电机的位置闭环控制,在电机运行时,可将电机运行的状态数据反馈到上位机. 因此结合STM32 和FPGA 不需要复杂的硬件电路,就可以实现合理的资源分配,通过上位机达到实时控制步进电机运动状态的目的,提高整个系统数据传递与电机运行的稳定性和准确性.

  2 系统硬件设计

  
  2.1 通信模块
  
  微处理器 STM32 与上位机用串口( usart) 进行通信,STM32 负责接收上位机发送的命令、 数据并进行转换,然后发送给 FPGA,从而实现对步进电机的控制. 同时 STM32 通过 FSMC 总线接收来自 FPGA 关于电机运行的反馈数据,并通过串口通信在上位机界面显示出来. STM32 与 FPGA 能实现多种方式的通信,如 USART、 SPI、 IIC 等,本研究使用高速数据采集及传输的 FSMC 总线进行并行通信.
  
  FSMC 是一种灵活的静态存储控制器,单片机上有FSMC 的接口,通过数据线和地址线完成数据的发送和接收. 大规模 FPGA 设计基于 SRAM 结构,对于外部SRAM 的控制一般有: 地址线( A0 ~ A18)、 数据线( D0 ~ D15)、 写信号( WR)、 读信号( RD)、 片选信号( CS). 本研究使用 3 根地址线,使用 16 根数据线一次传输 2 个字节. STM32 与 FPGA 采用 FSMC 总线通信如右图 2 所示.
  图 2 FSMC 总线通信图
  图 2 FSMC 总线通信图
  
  2.2 驱动模块
  
  驱动器用于将 FPGA 发送的电脉冲信号转换为角位移. 当驱动器接收一个电脉冲信号时,就会驱动步进电机转动一个步距角. 二相混合式步进电机的步距角为1.8°,大小与驱动器所设定的细分数有关,本研究设定驱动器为 32 细分,因此细分后的步距角为 0.056 25°,转动一圈需要 6 400 个脉冲. 细分数的设定有利于减小电机的低频振荡和运行时的噪音. 步进电机的驱动器与 FPGA 采用的是共阴极接法,PUL+接脉冲信号、DIR+接方向信号,使信号能从 ENA+接入,将 PUL-、 DIR-、 ENA-接公共地.
  

  3 系统软件设计

  
  在步进电机控制系统中,微处理器 STM32 应用 Keil uvision5 编程软件和 C 语言进行程序的设计编写ꎻ步进电机运行程序是基于 Quartus II 软件和Verilog 语言设计编写的ꎻ 人机交互界面是借助Visual Studio 软件以 C#语言为基础进行设计的.
  
  3.1 分频器的设计
  
  分频器利用一个高稳定和高准确度的基准频率产生一系列等间隔的离散频率信号.      步进电机的持续运转要通过一系列的脉冲来驱动,通过对分频器的设计可产生连续不断的脉冲信号和获得需要的脉冲频率. 定义步进电机运行的脉冲频率为 f( Hz) ,分频系数为 p( 即 p 分频) ,两者关系如下式所示:
  
  公式1
  
  设定目标要求的速度等级,其所对应的步进电机脉冲频率 f 分别为 2、 5、 8、 10 kHzꎻ 其对应的分频系数 p 由式( 1 ) 计算并得出对应为 25 000、 10 000、6 250、 5 000. 使用 Verilog 语言进行分频器程序的设计,产生脉冲的流程如图 3 所示. 设计的分频器为偶分频,程序在上电复位时,其计数器 count = 0,脉冲信号clk_p为高电平ꎻ 为了产生脉冲信号,实现高低电平的切换,设置了与分频相关的两个参数aT 和bT,其中 aT = p/2 - 1,每当系统时钟 clk 的上升沿到来时,计数器 count 便实现一次加计数,经过 aT 个系统时钟后,脉冲信号 clk_p 发生电平的翻转即变为低电平,在经过bT 个系统时钟后,脉冲信号clk_p 发生电平翻转即变为高电平,因此在一个脉冲周期内实现了 p 分频,如此重复下去,可产生连续不断的脉冲信号.
  图 3 分频器设计流程图
  图 3 分频器设计流程图
  
  3.2 状态机设计
  
  步进电机在进行加减速时,通过控制单位时间内输出的脉冲数来改变其脉冲频率,如在加速过程脉冲频率会不断增大,对应的脉冲周期相应减小,通过分频技术可以得到想要的脉冲频率.
  
  脉冲频率的变化通过有限状态机( finite - state machine,FSM) 完成程序设计,本研究使用三段式 Mealy( 米勒) 状态机,包括 2 个时序逻辑的 always 块和一个组合逻辑的 always 块ꎬ通过设置现态( cstate) 和次态( nstate) 两参数完成加减速过程状态之间的转移和脉冲输出. 图 4 为 Mealy 状态机模型.
  图 4  Mealy 状态机模型
  图 4  Mealy 状态机模型
  
  步进电机加减速包含加速、 匀速、 减速这三个阶段,当电机接收到加减速命令后,以设定的起始脉冲频率加速到最大速度点,然后进行匀速运动,达到减速点时减速至起始频率后停止 . 定义在加减速过程中步进电机的位移即脉冲数为 Pulse_num,起始分频系数 aTmax = a,最大转速时分频系数 aTmin = b,每频率段的脉冲数( 位移) 为 n,设定每发出 n 个脉冲分频系数减 2,程序上这样设定aT = aT-2,bT = 2×( aT-2) +1. 由于aT 与bT 在程序运行时是并行的,因此aT 的值为前一状态保留的值.加速阶段的脉冲数 Accel_num 计算如下:
  
  公式2
  
  匀速阶段的脉冲数为 Uni_num 计算如下:
  
  Uni_num = Pulse_num - 2 × Accel_num                                           (3)
  
  因此,对于给定的脉冲总数,系统运行时都会按照程序中的设定,对三个阶段所需要的脉冲数进行分配. 步进电机转向的控制,主要由方向信号的高低电平来决定的,所设计的控制系统默认电机为逆时针方向转动即 dir = 0,当方向信号变为高电平即 dir = 1 时,电机为顺时针方向转动.
  
  3.3 例化模块
  
  模块化设计是 FPGA 最基本的理念,一个较为复杂的控制系统往往包含多个子模块,采用例化的方式可将各模块的输入和输出进行连接. 因此在 FPGA 中实例化控制系统的各功能模块,有利于代码的简化和修改,使系统在实时性和灵活性等方面有很大提高,有利于实现步进电机运动状态的控制. 现对电机运行采用模块的例化,实现层次化设计. 将电机运行分成 4 个.v 文件来实现,顶层文件 drive_1.v,负责例化模块并连线,速度选择模块 sel_speed.v,包含 4 个不同的速度等级,加减速模块 T_speed.v,通过有限状态机实现加减速运动的控制,闭环控制模块 closed_loop. v,防止电机丢步. 系统经例化处理后,综合结果的顶层模块图见图 5 .
  图 5 顶层模块图
  图 5 顶层模块图
  
  3.4 编码器模块设计
  
  闭环步进电机的补偿,补偿值为编码器测得的实际步数与设定步数的差值,在电机到达停止点时由驱动器完成补偿脉冲. 增量式光电编码器与电机相连,当电机接收驱动脉冲转动时,便带动了码盘转动ꎬ从而产生了转角信号. 光电编码器中 A、 B 是相位差为 90°的脉冲波,Z 信号用于调零,编码器每旋转一圈时产生一个脉冲信号.
  
  在一个编码器周期内,A、 B 信号共有 4 次的跳变沿,因此为了提高编码器的精度,采用 4 倍频技术. 电机正转时,每检测到一次跳变沿,设置可逆计数器 counter 加 1,电机反转时,每检测到一次跳变沿,则可逆计数器 counter 减 1. 以步进电机正转为例,A 信号超前 B 信号 90°,相对的电平信号变化为 10 - 11 - 01-00,如图 6 所示.
  图 6 编码器输出信号
  图 6 编码器输出信号
  

  4 仿真和调试

  
  4.1 FSMC 通信仿真
  
  FSMC 通信使用读写模式 A,因此 FPGA 通过模式 A 的时序完成数据的写入和读取. 微处理器 STM32 的 FSMC 接口支持 8 / 16 / 32 位数据宽度,进行数据传输的实验,在 FPGA 对应的地址上写入 16 位数据宽度,如表 1 所示.
  
  表 1 STM32 向 FPGA 写入数据表
  表 1 STM32 向 FPGA 写入数据表
  在 FPGA 程序代码里设置 db 为 16 位 inout 类型数据,即从端口内部看,可以对端口进行赋值即输出数据,也可以从此端口读入数据即输入. 设置 assign db = rd? indata:16’ hzzzz,rd( 读信号) 为 wire 型变量ꎬ当 rd = 1 时,可以进行数据的输出,rd = 16’ hzzzz 时,表示高阻” Z” 状态,输出受限制. 微处理器 STM32 向FPGA 写入数据时,片选信号 csn 为低电平有效,写信号 wrn 为低电平有效,当 wrn 显示为低电平时,在ab 上的地址 0 ~ 7 h 分别写入数据 db 为 1 000 ~ 1 007 h,实现了 STM32 对 FPGA 给定地址写入给定数据.
  
  应用嵌入式逻辑分析仪 SignalTap 实时显示从微处理器发送来的数据,如图 7 所示. 在进行命令发送时,当上位机发出命令后,微处理器STM32 通过串口实现数据的接收并进行转换,通过FSMC 总线把转换后的命令发送给 FPGA,FPGA 接收到发送来的命令后,开始执行相关的运行模块,控制步进电机的运行状态.
  图 7 SignalTap 数据传输实时仿真图
  图 7 SignalTap 数据传输实时仿真图
  
  4.2 输出脉冲仿真
  
  实验所用的 FPGA 为 ALIENTEK 新起点 EP4CE10 开发板,系统时钟为 50 MHz,即一个时钟周期为20 nsꎬ应用 Modelsim 对 FPGA 的输出脉冲实现联合仿真. 本研究设定 4 个速度等级,本次以分频系数为25 000的输出脉冲为例进行仿真实验,为了节省仿真时间,把分频系数 25 000 缩小 2 500 倍即为 10,在程序中设置参数 aT = 8’ d4、 bT = 8’ d9,运行程序仿真结果如图 8 所示. 在一个脉冲周期内,高电平的时间为100 ns 即 5 个时钟周期,低电平也为 100 ns,因此输出的脉冲占空比为 50%,为偶分频. 为了实现步进电机的不同速度等级,可采用设置不同的分频系数来获得不同的脉冲频率.
  图 8  Modelsim 输出脉冲仿真图
  图 8  Modelsim 输出脉冲仿真图
  
  步进电机一个脉冲运行一步,在电机加减速阶段,单位时间内的位移会发生变化. 因此在每个频段都设置相同的位移,即在加速时,位移一定,随着速度的增大,所用的时间减小,在减速时,随着速度的减小,所用的时间变长. 程序中设置位移为 2 个脉冲,起始的分频系数设为 15,脉冲数为 30 个,用Modelsim进行加减速仿真,结果如图 9 所示.
  图 9 加减速输出脉冲图
  图 9 加减速输出脉冲图
  
  从图 9 可以得出,在进行加减速时分为 3 个阶段: 在加速阶段,脉冲频率每隔 2 个脉冲增大一次,即对应图中左边部分脉冲宽度减小,脉冲数为 6 个,匀速阶段的脉冲频率不变,即对应图中间部分脉冲宽度不变,脉冲数为 18 个,减速阶段脉冲频率为每 2 个脉冲减小一次,即对应图中右边部分脉冲宽度增大ꎬ脉冲数为 6 个,当步进电机的脉冲频率降到起始频率即分频系数为 15 时,输出脉冲数为零,步进电机停止运行. 因此,输出脉冲的仿真结果表明,在加减速运行时能够准确的达到设定的脉冲数.
  
  4.3 系统的运行与调试
  
  搭建电机运动控制系统所需要的实验平台,进行实际的运行和调试,如图 10 所示. 在进行通信程序设计时,应设置好步进电机运动过程所对应的状态码,如表 2 所示. 在上位机设有数据的接收区,接收来自 FPGA 关于电机运行状态的反馈数据,接收模式设有两种为十六进制 hex 和字符,这里为方便显示,设为字符串接收模式. 打开上位机软件进行操作,配置串口号、 波特率和电机运行参数,设置完成后,点击运行,步进电机就能按照设定的要求运转. 步进电机接收到命令运行稳定,并通过 FSMC 总线成功向上位机发送运行状态的反馈数据. 控制系统的上位机操作界面如图 11 所示. 在数据接收区显示,地址 1、 2、 3 的数据为 0,表示系统复位完成,将 3 个地址里的数据清零,接收到的数据 1: 3003 2:2000 3:4000,查询表 2 可知步进电机以速度等级 4、 正向、 启动,系统复位后,1:0 2:2003 3:0,查询表 2 可知步进电机进行加减速运动. 因此设计的上位机能够准确地接收和发送命令,控制步进电机运行.
  图 10 搭建的试验平台图
  图 10 搭建的试验平台图
  图 11 上位机操作界面
  图 11 上位机操作界面
  
  表 2 电机运行状态编码
  表 2 电机运行状态编码
  步进电机在加减速运行时,通过SignalTap 实时测得的电机位置闭环控制图如图 12 所示,图中显示编码器计数 cnt,补偿脉冲 sup _ pulse,以及电机运行脉冲频率 freq. 在调试中设定目标脉冲数为set_p =256 160个,从图 12 中得到编码器计数cnt = 8 000ꎬ因采用  4  倍频, 计算出编码器实际计数值为32 000,实际测得的脉冲数 actual_p = 32 000 × 8 即256 000 个. 闭环控制采用步校验,在电机运行到达停止点之后补偿 160 个脉冲,实现电机位置的闭环控制. 因此经过调试,控制系统达到光学位移台的要求,能实现速度和位移的精确控制,通过上位机能准确地控制步进电机的运动状态,进而控制光学位移台平稳的运行.
  图 12 电机位置闭环控制图
  图 12 电机位置闭环控制图
  

  5 结语

  
  本研究结合 STM32 和 FPGA 设计了一种步进电机控制系统,采用编码器,通过步校验的方式实现电机位置的闭环控制. 此外,借助 Visual Studio 进行 UI 设计,提供了人机交互界面. 仿真和测试结果表明ꎬ该控制系统稳定性良好且控制精准,步进电机运动的各项指标符合设定要求. 利用 FPGA 并行速度快的特点,在本系统的基础上可完成对多路步进电机控制系统的设计,可移植性高,因此具有广泛的适应性和参考价值.

Tags: 步进电机  STM32 

标签云