中国自动化学会专家咨询工作委员会指定宣传媒体
免费注册 登录 广告服务 | 客服中心
您现在所在的是:

单片机论坛

抖音 德嘉 泓格论坛 FLIR红外热像论坛
工控论坛首页 单片机论坛 → 浏览主题: 单片机控制步进电机的大侠进啦!!!
发表新帖 回复该主题
回帖:13个,阅读:2355 [上一页] [1] [2] [下一页]
* 帖子主题:

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

分享到
700
anihcer
文章数:1
年度积分:50
历史总积分:700
注册时间:2011/3/23
发站内信
发表于:2011/3/23 13:37:03
#0楼
中间加了现成的驱动器。

定时器取反完成一个中断,2次中断产生了一个脉冲。然后通过控制溢出时间来控制脉冲的频率。

//========中断部分===========
void MTIME() interrupt 1
{
    TH0=(65536-x)/256;
       TL0=(65536-x)%256;
       P_st=~P_st;
}
//===================

我的问题:上例假如速度我指定的,上位机可以发送速度的指令,单片机把它变成对应中断的时间(x的值)。我的思路对吗?写在哪里效率高。如果该值很小。很短时间就中断一次,会不会影响运行速度。

while(1)
{
谢谢大家;
}
2181
jog0821
文章数:250
年度积分:50
历史总积分:2181
注册时间:2010/6/16
发站内信
发表于:2011/3/24 22:03:44
#1楼
请问楼主是做什么工作的?
有现成的驱动器,那就好办。
天道酬勤!
18704
pqsh 版主
文章数:7350
年度积分:534
历史总积分:18704
注册时间:2006/8/22
发站内信
2018论坛解答高手
发表于:2011/3/25 11:20:44
#2楼
TH0=(65536-x)/256;
       TL0=(65536-x)%256;
是不是应该写在while(1)里,或者在接收上位机的程序里?
如果我忘了我
请帮忙记得我
pqsh@163,326199298@v&q同号
758
hDragon
文章数:19
年度积分:50
历史总积分:758
注册时间:2011/3/30
发站内信
发表于:2011/3/31 12:59:42
#3楼
一点看法
你的程序可能会有问题。
你给的程序应该是定时器的中断服务程序。在中断服务程序中为定时器重新赋初始值,这个思路是没问题的。问题是进入中断后,没有马上关中断和定时器(中断返回前应该重新打开)。
假如你给的X的值很小,会导致TH0,TL0的值比较大,之后,定时器按照这个新值开始计数。CPU在执行这段中断服务程序时,定时器并没有停止计数,而新的TH0,TL0都比较大,可能导致CPU还没有执行完本次的中断服务程序,定时器的下一次中断申请又来了,可是CPU不能及时响应,出问题了。
建议的做法:进入中断服务程序后,马上关中断和定时器,再执行其它程序,中断返回前重新打开定时器和中断。这样做虽然波形的周期会受到一些影响(由中断服务程序的长短决定),但保证可以正常工作。如果不想用上述方法,反正就是要产生一个周期可调的连续方波输出,可以换换其它思路。
2181
jog0821
文章数:250
年度积分:50
历史总积分:2181
注册时间:2010/6/16
发站内信
发表于:2011/4/1 22:57:45
#4楼
我做的控制2轴步进电机的程序,可以看下:
///////////////////步进电机正转调试程序/////////////

#include<reg52.h>  

/*****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<i;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);
}
}
}
天道酬勤!
758
hDragon
文章数:19
年度积分:50
历史总积分:758
注册时间:2011/3/30
发站内信
发表于:2011/4/2 18:23:49
#5楼
。。。。。。
楼上的,你的程序里没有考虑步进电机的加减速问题,如果步进电机带上负载,极容易丢拍。如果要考虑加减速,可以在变量y上做点文章。
2181
jog0821
文章数:250
年度积分:50
历史总积分:2181
注册时间:2010/6/16
发站内信
发表于:2011/4/5 10:46:41
#6楼
嗯  不过这个程序  没有中断     直接输出脉冲   可以控制脉冲量  以及加减速       我用这样类似的程序做过无数次实验    有用到实际的控制中
天道酬勤!
758
hDragon
文章数:19
年度积分:50
历史总积分:758
注册时间:2011/3/30
发站内信
发表于:2011/4/8 20:04:29
#7楼
.......
四相八拍工作方式,有没有考虑这样一个问题:当步进电机按照所需的拍数运行完后恰好(实际上,可能会经常遇上)停在run数组的中间位置,当下次启动时应该怎么办(无论是正转,还是反转)?理想的做法应该是从数组的“下一个元素”(正转向后,反转向前)开始取值,否则,会丢拍。
3641
yueliang150
文章数:389
年度积分:50
历史总积分:3641
注册时间:2003/4/24
发站内信
发表于:2011/4/8 22:33:50
#8楼
大概这样;

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)电机运行清,中断结束;

                     }

     }  
}
单片机、ARM产品开发设计;
小设备、夹具、治具控制器设计开发;数码管、点阵LED电子看板开发;
2181
jog0821
文章数:250
年度积分:50
历史总积分:2181
注册时间:2010/6/16
发站内信
发表于:2011/4/8 23:09:15
#9楼
又学习了,呵呵!
天道酬勤!
工控学堂推荐视频:

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

78.0005