大家好,我是『芯知识学堂』的SingleYork,前一篇文章给大家介绍了“SYK-0806-A2S1 工业自动化控制之【09-步进电机正反转】”,
这一篇中,笔者要给大家介绍如何实现步进电机加减速控制。
很多新手在使用步进电机的时候可能会发现,本来额定转速600RPM的电机,可能只能转到100RPM,
速度一加快,就启动不了了,直接堵转!这是为什么呢?难道电机有问题?
明明参数上写的可以达到600转每分钟的啊?怎么速度就是上不去呢?
实际上,如果厂家没有虚标电机参数的话,那么标称600RPM的电机基本上都是可以达到这个速度的,
但是步进电机的速度是不能直接一下子跳到600RPM,就好比我们开车一样,你一脚油门下去,也不可能速度马上彪到120KM/H,
都是需要一个加速的过程。同样,步进电机停止的时候,也是需要一个减速的过程,
不然,当电机在高速运转的时候,突然停下,由于惯性作用,会出现严重的抖动,
尤其是在带负载比较大的情况下,抖动更为明显,就好比我们一脚急刹车,此时车辆本身由于巨大的惯性,还是会往前冲上一段距离才会停下来。
最简单的加减速应该就是类似下图这种梯形曲线了,如下图所示:
每一个电机都有一个启动频率,低于这个启动频率太多电机也不能启动,高于这个启动频率太多电机同样也不能启动,
所以只有在初始频率接近电机的启动频率时,电机才能正常启动!
在电机启动后,慢慢增加脉冲信号的输出频率,电机便会越来越快,当电机达到最高频率时,速度也就不能再升高了,再高又会堵转了!
当电机需要停止时,也是不能马上关闭输出的,原因已经说过了,同样也是需要一个减速过程,直到速度为零。
当然这个加减速的时间,就是需要好好考虑了,一般都是几百毫秒左右。
本例中,笔者通过timer0来控制电机脉冲的输出,timer2来对加减速时间进行控制。电机的动作逻辑如下:
X00由低电平变成高电平时,电机0以初始1kHz频率顺时针启动,加速时间450ms,然后匀速运行5秒,再减速450ms,最后停止 。
笔者所使用的电机驱动器的输入端硬件如下图所示:
根据上图,笔者为了接线简单直接采用了5V电平来控制(如果使用24V电平的话,此处需要在CLK-/DIR-两根线上各穿一个2K左右的电阻),
直接将COM端接到了5V,CLK-/DIR-分别接到了P30和P31上,程序中GPIO定义如下:
- #define M0_PUL P30 //定义电机0脉冲对应的GPIO
- #define M0_DIR P31 //定义电机0方向对应的GPIO
-
- #define M0_Start X00 //定义电机0 启动 信号对应的GPIO
复制代码
另外,为了后续修改方便,还添加了一些跟电机相关的宏定义:
- #define M_Run_CW 0 //电机顺时针运行
- #define M_Run_CCW 1 //电机逆时针运行
-
- #define M0_Level_Low 0 //低电平
- #define M0_Level_High 1 //高电平
-
- #define M_State_IDEL 0 //电机状态 - 空闲(停止)
- #define M_State_Acc 1 //电机状态 - 加速(停止)
- #define M_State_Eve 2 //电机状态 - 匀速(停止)
- #define M_State_Dec 3 //电机状态 - 减速(停止)
-
- #define M_Min_Fre 1000UL //电机运行最低频率
- #define M_Max_Fre 10000UL //电机运行最高频率
复制代码
同时也将两个定时器的初始频率都设置在了1000Hz:
- u32 Timer0_Fre = 1000UL; //timer0频率初值
- u32 Timer2_Fre = 500UL; //timer2频率初值
复制代码
定义了一个变量用于timer2的计时:
复制代码
app_init()函数跟上一讲一样,不需要改动:
- void app_init(void)
- {
- GPIO_Config(); //GPIO配置
-
- Timer0_config(Timer0_Fre); //定时器0配置
- Timer2_config(Timer2_Fre); //定时器2配置
-
- TR0= 0; //定时器0停止运行
- EA = 1; //开启总中断
- }
复制代码
最大的改动就是在app_run()这个函数里面了,在这个函数里面用了一个switch语句,电机在四种状态下执行不同的动作:
复制代码
最后就是timer0和timer2的中断函数了,其中timer0是用于产生电机脉冲,timer2用于加减速、匀速一些流程上的计时控制:
- /********************* Timer0中断函数************************/
- void timer0_int (void) interrupt TIMER0_VECTOR //频率可变
- {
- M0_PUL = !M0_PUL; //电机脉冲信号P30状态翻转
- }
-
- /********************* Timer2中断函数************************/
- void timer2_int (void) interrupt TIMER2_VECTOR //1ms
- {
- Timer2_Cnt ++;
- }
复制代码
程序逻辑很简单,注释也比较全,相信大家都能看懂。当然咯,笔者这里只是讲了一种比较简单的加减速方法,
感兴趣的小伙伴们可以自行去深入学习一下S型曲线加减速算法或者其他的算法,效果肯定要比笔者这个好了。
好了,关于使用本节内容笔者就介绍到这里了,有疑问的小伙伴们可以给笔者留言或者直接参与评论,
下一节笔者将给大家介绍“如何让步进电机运行我们想要的圈数”,详见“SYK-0806-A2S1 工业自动化控制之【11-步进电机转动指定圈数】”,感谢大家的支持!
本章附件:
【STC15系列】SYK-0806-A2S1- 10-步进电机加减速.rar
(68.49 KB, 下载次数: 5)
|