找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2029|回复: 20
打印 上一主题 下一主题
收起左侧

关于步进电机梯形加减速单片机程序

[复制链接]
跳转到指定楼层
楼主
ID:1055885 发表于 2023-9-6 22:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教各位大佬个问题,我写了一个步进电机梯形加减速程序,但是运行时不够平顺,实际运行时表现就是急启急停,我是业余初学者,学历不高,想了很久,网上也没有实际的例程,有的看不懂,如果哪位大佬有空的话能不能帮我改一下,感激不敬。还有一个问题就是如果多个步进脉冲放在主程序内的话因为定时器的影响,步进运行时会卡顿,所以只能放在定时器内,但是所有步进程序都放在定时器内的话,又太多了,担心会出错,这两个问题困扰了很久不知道怎么改,芯片用的STC89c52rc单片机
感谢!!!!

下面是我的单片机代码,目前是只有加速


#include<reg52.h>
#define uint unsigned
#define uchar unsigned

uchar TY1,TY2;//Y轴
uint M2;//脉冲数

void Delay(uint);//延时子程序
void YY();//Z轴

sbit Y2=P2^1;//Y        
sbit A1=P3^4;//按键1

void main()//主函数
        {
                TY2=20;//加速初始
                EA=1;
                TMOD=0x11;
                ET0=1;
                TH0=(65536-400)/256;
                TL0=(65536-300)%256;
                TR0=1;//启动定时器0

                while(1)
                        {        
                                Delay(6);
                        }
        }

void timer0() interrupt 1 //定时器0
{
        TH0=(65536-400)/256;
        TL0=(65536-300)%256;
        TY1++;//进入中断计数
        if(TY1>=TY2)//中断数对比
                {
                        YY();//调用Y轴步进
                        TY2--;
                        TY1=0;
                        if(TY2<=1)//匀速
                                {
                                        TY2=1;
                                }
                }
}
void YY()//发送脉冲和脉冲计数
        {
                Y2=1;
                Y2=0;
                M2++;
        }

void Delay(uint n)//延时函数
{
uint i,j;
for(i=0;i<n;i++)
  for(j=0;j<10;j++);
}



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:94031 发表于 2023-9-7 06:26 | 只看该作者
要想步进电机运行平顺,应该选用带细分的步进电机驱动器。
回复

使用道具 举报

板凳
ID:844772 发表于 2023-9-7 08:54 | 只看该作者
梯形加速是角加速度线性啊,你这想做的是脉冲加速线性,可能思路就不大对。不过这么做也可以缓起缓停。建议你下载个例程吧。如果坚持你的程序,建议所有变量要赋值,特别是M2必须有初值。
回复

使用道具 举报

地板
ID:1055885 发表于 2023-9-7 14:33 来自手机 | 只看该作者
xuyaqi 发表于 2023-9-7 06:26
要想步进电机运行平顺,应该选用带细分的步进电机驱动器。

细分相当于把转速调慢了,那加减速不就没有意义了
回复

使用道具 举报

5#
ID:1055885 发表于 2023-9-7 14:34 来自手机 | 只看该作者
glinfei 发表于 2023-9-7 08:54
梯形加速是角加速度线性啊,你这想做的是脉冲加速线性,可能思路就不大对。不过这么做也可以缓起缓停。建议 ...

角加速是什么意思呢,什么样的思路,我只会脉冲
回复

使用道具 举报

6#
ID:123289 发表于 2023-9-7 14:55 | 只看该作者
试试:将中断时间间隔拉长一点。
回复

使用道具 举报

7#
ID:1055885 发表于 2023-9-7 15:19 来自手机 | 只看该作者
yzwzfyz 发表于 2023-9-7 14:55
试试:将中断时间间隔拉长一点。

这个试过了,中断时长拉长只是电机速度减慢了,加减速还是不够平顺
回复

使用道具 举报

8#
ID:883242 发表于 2023-9-7 17:04 | 只看该作者
急启急停是梦寐以求的理想状态好不好???步进电机的难点就是如何能更快的启动停止而不丢步,楼主已经做得很好,或者电机功率裕量足够。
回复

使用道具 举报

9#
ID:34149 发表于 2023-9-7 17:55 | 只看该作者
实现加减速的构思是如何的呢?我的理解是不是调节输出脉冲频率的变化来控制?我也想学学
回复

使用道具 举报

10#
ID:764101 发表于 2023-9-7 18:29 | 只看该作者
   如图,加速时使用PID加速,减速时使用某特定形状的函数波形限速,使得速度降为0时刚好停在设定的目标位置。这种加减速方式可以在很大速度范围内通用,缺点是加速和减速时的加速度波形不对称,减速时的加速度值略大,但影响不大。

步进电机加减速波形_位移速度加速度.jpg (124.59 KB, 下载次数: 49)

步进电机加减速波形_位移速度加速度.jpg
回复

使用道具 举报

11#
ID:1055885 发表于 2023-9-7 18:36 来自手机 | 只看该作者
dyx811 发表于 2023-9-7 17:55
实现加减速的构思是如何的呢?我的理解是不是调节输出脉冲频率的变化来控制?我也想学学

我也是这样想的,但是前面有人说是角加速,不知道是什么意思
回复

使用道具 举报

12#
ID:94031 发表于 2023-9-7 19:00 | 只看该作者
叫大个不叫老朱 发表于 2023-9-7 14:33
细分相当于把转速调慢了,那加减速不就没有意义了

把你没细分前的一步电流到位,通过驱动器高速细分为多步电流阶梯上升,下降到位,运行就比较平顺。
回复

使用道具 举报

13#
ID:1055885 发表于 2023-9-7 19:24 来自手机 | 只看该作者
xuyaqi 发表于 2023-9-7 19:00
把你没细分前的一步电流到位,通过驱动器高速细分为多步电流阶梯上升,下降到位,运行就比较平顺。

这个太深奥
回复

使用道具 举报

14#
ID:123289 发表于 2023-9-8 08:26 | 只看该作者
再拉大TY2试试。
回复

使用道具 举报

15#
ID:1055885 发表于 2023-9-8 09:55 来自手机 | 只看该作者
yzwzfyz 发表于 2023-9-8 08:26
再拉大TY2试试。

TY2拉大后只是前半段脉冲频率拉长了,接近匀速阶段还是会急加速,就是接近匀速这个阶段,启停都是这个阶段太急了
回复

使用道具 举报

16#
ID:478111 发表于 2023-9-18 14:37 | 只看该作者
用定时器中断去做,每进一次中断改变输出的占空比,就可以达到梯形加减速效果
回复

使用道具 举报

17#
ID:1055885 发表于 2023-9-19 23:47 来自手机 | 只看该作者
dongdongxixi 发表于 2023-9-18 14:37
用定时器中断去做,每进一次中断改变输出的占空比,就可以达到梯形加减速效果

这样只能改变进入中断次数的变量,不能改变定时器初值,因为还有别的电机公用一个定时器,如果改变进入中断次数的话就是我现在遇到的问题
回复

使用道具 举报

18#
ID:161164 发表于 2023-9-20 10:14 | 只看该作者
试试这段
  1. uchar TY3 = 0;
  2. void timer0() interrupt 1 //定时器0
  3. {
  4.     TH0 = (65536 - 400) / 256;
  5.     TL0 = (65536 - 400) % 256;
  6.     TY1++;//进入中断计数

  7.     if(TY1 >= TY2) //中断数对比
  8.     {
  9.         YY();//调用Y轴步进
  10.         if(TY3++ >= 10)
  11.         {
  12.             TY3 = 0;
  13.             TY2--;
  14.         }
  15.         TY1 = 0;
  16.         if(TY2 <= 1) //匀速
  17.         {
  18.             TY2 = 1;
  19.         }
  20.     }
  21. }
复制代码



回复

使用道具 举报

19#
ID:478111 发表于 2023-9-20 14:34 | 只看该作者
叫大个不叫老朱 发表于 2023-9-19 23:47
这样只能改变进入中断次数的变量,不能改变定时器初值,因为还有别的电机公用一个定时器,如果改变进入中 ...

我说的定时器的意思是PWM的意思,每进一次PWM中断,改变一下周期和占空比
回复

使用道具 举报

20#
ID:1055885 发表于 2023-9-28 00:57 来自手机 | 只看该作者
lkc8210 发表于 2023-9-20 10:14
试试这段

谢谢,确实有改善,但是在接近最高速时还是加速过快
回复

使用道具 举报

21#
ID:1055885 发表于 2023-9-28 00:58 来自手机 | 只看该作者
dongdongxixi 发表于 2023-9-20 14:34
我说的定时器的意思是PWM的意思,每进一次PWM中断,改变一下周期和占空比

好的,我研究研究
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表