步进电机S曲线调速控制研究

2019-10-28 09:58陈祖霖
关键词:脉冲数寄存器中断

陈祖霖, 黄 峰, 吴 靖, 沈 英

(福州大学机械及自动化学院, 福建 福州 350108)

0 引言

步进电机是将电脉冲信号转变为角位移或线位移的开环控制电机, 是现代数字程序控制系统中的主要执行元件, 应用极为广泛[1]. 随着计算机和微机技术的不断发展, 步进电机在工业生产中随处可见, 应用单片机对电机实现自动控制已经成为了必然趋势, 能更好地挖掘出步进电机的潜力, 对服务实际生活与工业生产有重要意义.

步进电机角位移或线位移与其接收电脉冲数成正比, 转速或线速度与脉冲频率成正比[2]. 步进电机为开环控制, 工业用途中可增加编码器来进行闭环控制, 但这会增加控制成本. 一般通过采集控制器输出的脉冲信号作为反馈信号, 进行无传感器的“伪”闭环控制. 通常, 如果在步进电机启动或加速时脉冲频率过高, 转子由于惯性而跟随不上电信号的变化, 这将会导致堵转或失步; 由于同样的原因, 在停止或减速期间可能发生过冲, 导致步进电机的控制精度降低. 为防止丢步和过冲, 在启动时采用加速过程, 在停止时则采用减速过程[3]. 因此, 可采取S形加速/减速曲线进行控制. 步进电机有多种加减速算法, 近年来国外主要流行SPTA算法对步进电机加减速曲线进行控制, 国内研究以S形算法为主. S形算法的核心在于防止加速度产生突变, 减小冲击, 并使步进电机运动具有快速平稳的特性, 常被应用于精确控制中,如数控系统、 医疗器械和机器人系统等[4].

本研究以三段式S形曲线为例展开. S曲线涉及阶段较多, 实现较为复杂, 因此在实际项目中需要对控制曲线进行一定的离散拟合优化, 把加速/减速的脉冲频率首先存储在阵列中, 从而更好地实现控制要求. 步进电机一个脉冲运行一步, 在加速/减速时期, 单位时间内的位移会变化, 因此每个频段都要给它相应的位移. 采用高级定时器的重复计数寄存器(repeat count register, RCR), 可减少定时器的中断次数, 从而降低CPU的消耗, 并为研究步进电机S形加减速的学者提供一定的理论帮助.

1 S形加减速曲线的离散化处理

Logistic函数的图形是一个连续光滑的S形, 同时是一个严格的递增函数, 在线性和非线性之间显示出很好的平衡[5]. 它的值域为(0~1), 关于(0, 0.5)中心对称, 其公式定义为

(1)

将f(x)曲线用在步进电机调速控制中, 需要对其进行变换,

(2)

式中:C、D为y方向的平移和缩放;c、d为x方向的平移和缩放. 对应的步进电机加速曲线方程定义为

(3)

其中: ΔF=Fmax-Fmin,Fmax为最大脉冲频率,Fmin为步进电机的起动频率;n为length/2(length为离散化点数), 这样可以使得S曲线对称; 选择加速区间为[-1, 1], (i-n)/n是为了保证加速点落在加速区间内;a为函数的斜率即加速区间,a越大, 中间x坐标0点周围的加速度也越大, 通常a合适的取值范围在4~6. 步进电机加速过程是由基础频率和跳跃频率(步进电机在基础频率上逐渐提高的频率)组成加速曲线[6].

对应的步进电机减速段, 可以和加速段共用一个表, 或定义步进电机减速曲线方程为

(4)

可计算出每个减速点对应的脉冲频率, 为了减少MCU(micro control unit)计算量, 将计算得出的f值换算成定时器的自动重装载值ARR, 做成数组保存在MCU内存中, 这样控制器只需要按顺序在数组里读取值进行定时器计数值重装载就行了.

2 S形加减速算法的具体实现

2.1 定时器的选择及设置

STM32的定时器功能十分强大, 有TIME1和TIME8等高级定时器, 也有TIME2~TIME5等通用定时器, 还有TIME6和TIME7等基本定时器. 本研究采用16位的高级定时器TIME1中断输出来控制步进电机的运转. STM32的时钟频率可以达到72 MHz, 定时器时钟经过PSC(Prescaler)预分频器之后, 即CK_CNT, 用来驱动计数器计数.

图1 定时器1中断配置步骤流程图Fig.1 Flow chart of timer 1 interrupt configuration steps

PSC是一个16位的预分频器, 可以对定时器时钟TIMxCLK的1~65 535之间任何一个数进行分频. 其计算方式为CK_CNT=TIMxCLK/(PSC+1). 计数器CNT是一个16位的计数器, 只能往上计数, 最大计数值为65 535. 当计数达到自动重装载寄存器的时候产生更新中断, 并清零从头开始计数. 在设计程序过程中, 对定时器TIME1进行相关配置, 配置步骤如图1所示.

设置定时器输出比较模式为PWM1. 同时开启重复计数寄存器TIMx_RCR, 通过设置寄存器的值, 减少CPU的消耗. 一般通用定时器设置为单脉冲模式, 开启定时器后, 中断一次只产生一个脉冲, 然后关闭定时器. 而高级定时器有一个重复计数寄存器TIMx_RCR, 开启这个寄存器, 就能大大降低中断的频率.

设置重复计数器的值为RCR_VAL=X(X取0~255), 那么每中断一次, 控制器就会输出X+1个脉冲. 因此使用了重复计数器功能, 在向上计数到达设置的重复计数次数(TIMx_RCR)时, 才产生更新事件(UEV); 否则每次计数器溢出时都产生更新事件.

2.2 步进电机运行的参数设置及计算

根据已知的步距角, 设定的目标转速, 计算出步进电机运转所需要的总脉冲数Step_num. 把S形加减速曲线离散化成n个点, 则加速脉冲数定义为:

Accel_num=n×(X+1)

(5)

匀速脉冲数为:

Uni_num=Step_num-2×Accel_num

(6)

在使用定时器重复计数功能时, 对于匀速阶段的脉冲, 设置脉冲的整数部分为rcr_integer, 脉冲的余数部分为rcr_remainder, 其定义为:

rcr_integer=Uni_num/(1+RCR_VAL)

(7)

rcr_remainder=Uni_num%(1+RCR_VAL)

(8)

定时器输出PWM频率公式

(9)

式中: CLK为72 MHz; ARR取值范围为0~65 535; PSC为预分频数.

设置定时器的计数频率为1 MHz, PSC=71; 则计算出的定时器自动重装载寄存器值公式为

(10)

把计算出的temp_arr存进数组TIMx_table[n], 这样就得到了步进电机运行各阶段的自动重装载寄存器的值.

此外, 步进电机的运行一般要经过加速、 匀速、 减速3个阶段, 要求加减速过程时间尽量短, 恒速时间尽量长[7]. 步进电机从低速到最高速加速时间最好为100~300 ms, 最大不超过1.5 s, 由公式(10)计算得最大脉冲周期Tmax, 最小脉冲周期Tmin, 因此步进电机运行的平均脉冲周期定义为

(11)

加速段的时间定义为

(12)

2.3 S形加减速算法软件部分的实现

以32位的STM32为控制器, 对步进电机进行S曲线调速控制. 软件实现部分包含初始化模块和函数模块, 编写程序时对各模块进行相应的配置.

2.3.1初始化模块

初始化模块包括串口usart、 GPIO口以及高级定时器的初始化, 其中定时器的初始化设置是最为关键的一步, 主要有设置中断类型、 优先级分组、 比较输出模式等. 记得使能ARR的预装载功能即ARPE=1, 保证直到发生更新事件后, ARR预装载寄存器的值才被拷贝到影子寄存器中.

2.3.2函数模块

函数模块可以分为中断服务函数和位置函数. 在位置函数里, 根据实际条件需要, 确认步进电机的启动频率和最高频率, 设置步进电机的脉冲总数Step_num与重复计数寄存器的值X. 可由公式(6)计算得出匀速段脉冲数, 并求得其整数部分和余数部分.

中断服务函数里面包含加速段、 匀速段、 减速段的相关程序. 在向上计数达到重复计数器设置的次数X时, 定时器产生中断, 进入中断处理服务函数, CNT清零; 此时脉冲频率从TIMx_table[0]开始. 根据

TIMx_table[0]选出的第一个脉冲频率f1, 通过式(10)计算得出自动重装载值temp_arr, 定时器开启并以脉冲频率f1连续发出(X+1)个脉冲; 以后定时器每中断一次, 脉冲频率按照顺序, 依次从数组中对应选出, 直到TIMx_table[n-1], 然后分别计算出每个脉冲频率下的自动重装载值temp_arr; 即在加速段, 发送相同的脉冲数时间越来越短; 在减速段, 发送相同数目的脉冲数, 时间越来越长. 步进电机以最高频率进入匀速段, 程序中先判断脉冲整数部分rcr_integer是否为0; 当rcr_integer>0时, 执行相应设计好的程序; 当rcr_integer=0时, 则执行余数部分的相关程序.

步进电机的减速部分可以和加速段共用一张表TIMx_table[n], 当减速阶段发送完最后一个脉冲时, 步进电机运行结束. 这时会通过printf把相关数据打印到串口接收区. 软件运行的流程图如图2所示.

图2 软件流程图Fig.2 Software flow chart

3 试验验证

3.1 硬件连接及S曲线生成

在对S形曲线调速及软件实现进行深入的研究后, 对其理论部分进行验证, 应用串口调试助手显示出电机运行时各阶段参数的数据, 以确认该方法的可行性, 以ALIENTEK战舰版微处理器STM32f103为控制器, 步进电机选型为42BYGH40-1704A, 驱动器选型为TB6600, 硬件连接如图3所示.

步进电机加减速曲线离散化点数n一般大于300, 设置S曲线离散化点数n=500, 设置步进电机启动频率为3.316 kHz, 最高频率为127.690 kHz, 由式(3)计算得出每个离散点对应的脉冲频率f, 应用Origin将数据生成对应的曲线, 呈现S形, 如图4所示. 当开启定时器后, 步进电机加减速将按此轨迹运行.

图3 硬件连接图Fig.3 Hardware connection diagram

图4 离散化点数生成的S曲线Fig.4 S-curve generated by discretized points

3.2 试验与数据分析

3.2.1试验与脉冲数据分析

为降低步进电机的低频振动及噪音, 设置驱动器的细分数为64, 即步进电机转动一圈需要12 800个脉冲, 采用共阴极接法. 设置定时器以1 MHz的频率计数. 当发送的脉冲总数不同时, 通过串口接收区显示的步进电机运行数据如表1所示.

表1 脉冲总数不同, 电机运行时各参数的数据

从表1可以得出, 当RCR_VAL的值一定时, 发送任意的脉冲总数, 步进电机加速段与减速段脉冲是固定不变的, 但匀速段的脉冲发生变化. 对于电机匀速运行阶段, 因开启重复计数寄存器(TIMx_ARR)的功能, 故设置了整数部分(integer_num)和余数部分(remainder_num); 试验结果显示出步进电机在任意脉冲总数下, 都能达到平稳精确的运行, 不发生失步或过冲等现象.

可以根据实际条件的需要, 在已知脉冲总数的情况下, 通过修改重复计数寄存器的值RCR_VAL, 来调整加速段、 匀速段、 减速段分配的脉冲数, 其试验的串口接收区显示数据如表2所示.

表2 不同RCR_VAL值, 电机运行时各参数的数据

从表2可以得出, 当重复计数寄存器值不同, 而发送给电机的脉冲总数一定时, 可以通过软件的设置, 自动计算出步进电机3个阶段的脉冲分配数, 即各阶段的脉冲数之和与发送的脉冲总数相等, 因此在程序的设计中, 无论是在加减速段还是匀速段, 都保证了步进电机能准确地运行完设定的步数, 达到了精准控制的目标. 当RCR_VAL的值增大时, 电机的加速脉冲也随着增大, 从而导致加速时间随之增加. 由式(12)计算出步进电机加速时间t, 当RCR_VAL=9、 19、 26、 38时, 其加速时间t分别为0.765、 1.53、 2.065 5、 2.983 5 s. 因此随着重复计数寄存器值的增大, 加速时间也明显的变长; 但在实际应用中步进电机的加速时间不能超过1.5 s; 步进电机的加速时间与脉冲频率, RCR_VAL以及离散化的点数n等有关; 在离散化点数n及Logistic曲线的a值确定时, 若加速时间过长, 只能采用减少RCR_VAL值的方法, 通过每次值减N(N为整数), 获得较短的加速时间; 若离散化点数n及RCR_VAL值确定, 可增大a值, 每次加1进行调试, 达到减短加速时间的目的.

3.2.2试验与CPU状况分析

定时器中断后, CPU进入定时器的中断服务函数执行代码. 若单位时间内, 定时器中断m次, 则CPU执行m次代码. CPU的消耗与定时器的中断次数有关, CPU的消耗随定时器中断次数的减少而下降, 因此在已知脉冲总数下, 通过定时器中断次数来反应CPU的消耗情况. 在未开启重复计数寄存器时, 定时器每中断一次, 向步进电机发送一个脉冲. 若设定发送的脉冲总数为240 000个, 即步进电机运行37.5圈, 则定时器中断次数为240 000次; 使用重复计数寄存器时, 设置不同RCR_VAL的值, 当发送脉冲总数为240 000个, 试验得出的定时器中断次数如表3所示.

从表3中得出, 重复计数寄存器的值设置越高, 定时器的中断次数就越少, 降低了CPU的消耗. 但RCR_VAL的值与加速时间有关, RCR_VAL越大, 加速时间越长; 采用减少离散化点数n的方法, 可以缩短加速时间. 在设计S曲线加减速时, 应对各变量进行分析和取值调试, 才能达到在降低CPU消耗的同时, 保证步进电机有较短的加速时间, 得到响应快且稳定的加速曲线.

表3 不同RCR_VAL值, 定时器中断次数表

3.2.3与类似调速控制的比较

不同的场合需要不同的加减速控制方式, 应视情况而定. 本研究在加减速部分, 通过程序设计了S形加减速算法, 因此步进电机加、 减速曲线呈现S形. 传统的T形加减速, 其加速比S形来得快, 但曲线在加速与匀速部分不平滑, 过渡时容易产生加速度突变, 适用于精度要求不高的场合. 与T形加减速曲线相比, S曲线的优势在于启动时比较平稳, S曲线连续光滑, 在加速和匀速部分可以很好地平滑过渡, 适合静摩擦力比较大的负载; 从表1、 表2得出, 步进电机采用S曲线有效降低了失步和过冲等现象, 达到精确的控制要求, 适用于大多数的场合.

4 结语

详细研究了S曲线调速的理论以及STM32软件部分的实施. S曲线调速是一种比较新的算法, 通过合理设计脉冲的升、 降频率, 有效防止电机的失步、 过冲等现象. 文中最后对理论部分进行了试验, 试验结果显示出可以通过S曲线调速, 达到对步进电机进行精确控制的目的. 研究中使用了重复计数器的功能, 虽然可以减少MCU的中断次数, 降低CPU消耗, 但在一定程度上会对电机的加速时间有影响. 可以通过对脉冲频率以及重复计数寄存器适宜的取值, 来实现对步进电机调速进行优化控制. 为减少CPU消耗以及步进电机精确控制, 提供了一种有效方法.

猜你喜欢
脉冲数寄存器中断
STM32和51单片机寄存器映射原理异同分析
某型组合导航系统故障分析及预防
高精度电子体温计设计与实现
Lite寄存器模型的设计与实现
基于FPGA的中断控制器设计*
检定电能表的圈数设定问题探讨
跟踪导练(二)(5)
千里移防,卫勤保障不中断
介质收纳装置
FPGA内嵌PowerPC的中断响应分析