登录
首页 单片机论坛
回帖 发帖
正文

主题:单片机控制步进电机的大侠进啦!!!

点击:2466 回复:13

中间加了现成的驱动器。

定时器取反完成一个中断,2次中断产生了一个脉冲。然后通过控制溢出时间来控制脉冲的频率。
//========中断部分===========
void MTIME() interrupt 1
{
    TH0=(65536-x)/256;
       TL0=(65536-x)%256;
       P_st=~P_st;
}
//===================
我的问题:上例假如速度我指定的,上位机可以发送速度的指令,单片机把它变成对应中断的时间(x的值)。我的思路对吗?写在哪里效率高。如果该值很小。很短时间就中断一次,会不会影响运行速度。
while(1)
{
谢谢大家;
}
11-03-23 13:37
请问楼主是做什么工作的?
有现成的驱动器,那就好办。
11-03-24 22:03
TH0=(65536-x)/256;
       TL0=(65536-x)%256;
是不是应该写在while(1)里,或者在接收上位机的程序里?
11-03-25 11:20
你的程序可能会有问题。
你给的程序应该是定时器的中断服务程序。在中断服务程序中为定时器重新赋初始值,这个思路是没问题的。问题是进入中断后,没有马上关中断和定时器(中断返回前应该重新打开)。
假如你给的X的值很小,会导致TH0,TL0的值比较大,之后,定时器按照这个新值开始计数。CPU在执行这段中断服务程序时,定时器并没有停止计数,而新的TH0,TL0都比较大,可能导致CPU还没有执行完本次的中断服务程序,定时器的下一次中断申请又来了,可是CPU不能及时响应,出问题了。
建议的做法:进入中断服务程序后,马上关中断和定时器,再执行其它程序,中断返回前重新打开定时器和中断。这样做虽然波形的周期会受到一些影响(由中断服务程序的长短决定),但保证可以正常工作。如果不想用上述方法,反正就是要产生一个周期可调的连续方波输出,可以换换其它思路。
11-03-31 12:59
我做的控制2轴步进电机的程序,可以看下:
///////////////////步进电机正转调试程序/////////////
#include  
/*****P1.0=A ;P1.1=B ;P1.2=A' ; P1.3=B'****/  
code unsigned char run[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};  //四相八拍工作方式
unsigned char s,i,j,k;
void delay(i)//延时函数
{
for(j=0;j for(k=0;k<250;k++);
}
main()
{
unsigned char z,y;
y=8;    //定义延时时间,时间越长电机转速越慢反之则快
while(1)
{
for(z=0;z<8;z++)  //改变数组的长度值需改变这个数字8,8为数组的长度。
{
P1=run[z];
delay(y);
}
}
}
11-04-01 22:57
楼上的,你的程序里没有考虑步进电机的加减速问题,如果步进电机带上负载,极容易丢拍。如果要考虑加减速,可以在变量y上做点文章。
11-04-02 18:23
嗯  不过这个程序  没有中断     直接输出脉冲   可以控制脉冲量  以及加减速       我用这样类似的程序做过无数次实验    有用到实际的控制中
11-04-05 10:46
四相八拍工作方式,有没有考虑这样一个问题:当步进电机按照所需的拍数运行完后恰好(实际上,可能会经常遇上)停在run数组的中间位置,当下次启动时应该怎么办(无论是正转,还是反转)?理想的做法应该是从数组的“下一个元素”(正转向后,反转向前)开始取值,否则,会丢拍。
11-04-08 20:04
大概这样;
void main(void)
{
  定时器初始化();
  while (1)
{
                    if(P1_0==0){START_md(频率,脉冲数,正反)};
                    if(P1_1==0){STOP_md()};
 
                }

void STOP_md(void)
{
  减速停止标志  
}
void start_md(void)
{
   设定定时器脉冲
  开中断;
  电机正反选择;
  电机运行标志;
}
void timer0 (void) interrupt 1
{
    中断时间设定ABC;
   判断电机运行标志--》低到正常速度ABC变换;
   判断正常运行ABC;
   判断电机运行到脉冲设定接近--》高速到地速度ABC变换;
   判断减速停止标志
  if(电机运行)--》高速到地速度ABC变换;
     {
            输出取反;
           if(输出==1)  
                   {
                            if(--脉冲==0)电机运行清,中断结束;
                     }
     }  
}
11-04-08 22:33
又学习了,呵呵!
11-04-08 23:09

上一页下一页

工控新闻

更多新闻资讯