打印

再次请教关于步进电机提速的问题?

[复制链接]
1663|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
7120223|  楼主 | 2008-7-28 18:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的是57BYG019步进电机四相八拍,我用单片机的定时器来控制脉冲的频率,现在电机最高在2.4ms这个级别,要是在高的话 电机就会发抖,慢转。因为2.4ms电机转动的速度达不到我的要求,现在我想把它速度提上去但是我怎么都提上去。我做个好多实验都失败了(4.0ms到1.0ms,每次加0.1ms但是到2.3ms以上还是失败了;还有就是4.0到1.0ms我分了十档但是还是卡在2.3ms处)这是为什么?我现在怎么做才能把速度提上去?(硬件不能加任何东西,只能是软件改) 
电源电压是33v,而且这个电路已经能成功实现比我更快的速度的,但是我就是写不出来同样的效果,先把我的程序发上,大家指点一下看哪儿有错误或不合理的地方:
单片机为77e58,串口程序没什么问题的。
#include<W77E58.H>
unsigned char input=0,m=8,count=1;
unsigned char   step=0;
unsigned char  a[10]={45,38,30,23,17,12,8,5,3,2},b[2]={'1','2'};
sbit LED_4=P3^7;
sbit LED_3=P3^6;   
void stop();
void delay(unsigned int k)
{ unsigned int i,j;
   for(i=0;i<k;i++)
    for(j=0;j<1000;j++);
}
void  main()
{       RCAP2H = 0xFF;
    RCAP2L = 0xB8;           // 设置定时器2,22.1184M ,9600
    CKCON = 0x28;            //4个时钟周期
    TCLK = 0x01;
    RCLK = 0x01;              // 把定时器2设置为波特率产生器
    TR2 = 1;                  // 定时器2开始计时
         TR0=1;
    TMOD=0x01;                   //定时器0,模式1
    SCON=0x50;                 // 把串口0设置为方式1
    ES = 1;                    // 允许串口0中断
    TH0=(65536-700*221184/40000)/256;
    TL0=(65536-700*221184/40000)%256;
    ET0=1;            //开定时器0中断
    PS0=1;         //串口优先
    EA = 1;                  // 允许全局中断
         RI=0;
         TI=0;
     LED_3=1;
     LED_4=1;
     while(1)
      {   LED_3=0;
          if(input==b[0])
            {  stop();
             TR0=0;
            }
          if(input==b[1])
             TR0=1;
          if(step!=10)
           {  step++;
              if(step==10)step=9;
           }
               delay(100);   //这个延时我做过好多次的修改,没什么起色范围(50`--1000)都是试过
         }
}
void  serial() interrupt  4    //串口中断 ,用来实现开关的
{     LED_4=0;
      input=SBUF;
      while(RI==0);            
       RI=0;     //清除接收标志
         SBUF=input;
        while(TI==0);
         TI=0;
         LED_4=1;
          
}
void time() interrupt 1       //定时器来实现电机频率的调节
{    TH0=(65536-700*221184/40000)/256;
    TL0=(65536-700*221184/40000)%256;
     count--;
     if(count==0)
       {  count=a[step];
         
       switch(m)
       {
       case    1: P2=0x32;    break;
       case 2: P2=0x36;    break;
       case 3: P2=0x34;    break;
       case 4: P2=0x3c;    break;
       case 5: P2=0x38;        break;
       case 6: P2=0x39;    break;
       case 7: P2=0x31;    break;
       case 8: P2=0x33;    break;
       }
           m--;
      if(m==0)m=8;
      }

}
void stop()
{
  P2=0xF0;

}

相关帖子

沙发
5880527| | 2008-7-28 19:22 | 只看该作者

你定时器的初始值没见到变化呀

使用特权

评论回复
板凳
7120223|  楼主 | 2008-7-28 20:14 | 只看该作者

我用的是count不同的值减减来实现频率变化的

使用特权

评论回复
地板
li_mu| | 2008-7-29 09:29 | 只看该作者

你是直接发脉冲给驱动器吗

那就没辙
如果是发拍子应该还可以把
尤其抖动那是驱动拍数不对吧

使用特权

评论回复
5
raymond| | 2008-7-29 11:34 | 只看该作者

呵呵

要快不是问题,0.2ms也能做到,结果是只要修改软件就好了,至于具体实现,还是有很多工作要做,关键是对电机的了解程度

使用特权

评论回复
6
7120223|  楼主 | 2008-7-29 17:48 | 只看该作者

啊???

大家说的怎么我还是没明白啊?

使用特权

评论回复
7
lanwuya| | 2008-10-14 10:20 | 只看该作者

一点建议

我觉得既然用定时器来实现延时从而改变频率,就不需修改软件延时delay(100);   添加定时器计数值的递减算法就可以了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

105

主题

389

帖子

0

粉丝