5566|9

86

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

步进电机正反转为什么有快慢? [复制链接]

我写了这么一个程序用于控制步进电机,通过改变flag的值来改变电机的转向,但为什么两个转向的速度有很明显的不一致?
#include
unsigned char code Forward[4]={0xf1,0xe9,0xe5,0xe3};
unsigned char code Back[4]={0xf1,0xe3,0xe5,0xe9};
unsigned char flag=0;
void delay(unsigned int cnt)
{
        while(--cnt);
}
void main()
{
           unsigned char i;
        if(flag==0)
        {
                for(i=0;i<=4;i++)
                {
                        P1=Forward;
                        delay(500);
                }
        }
        else
        {
                for(i=0;i<=4;i++)
                {
                        P1=Back;
                        delay(500);
                }
               
        }
}

最新回复

时序问题  详情 回复 发表于 2011-10-20 15:36
点赞 关注

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
首先:直流电机的转速 是受PWM控制,所以其方向改变后,只要PWM不变,转速应该基本一样。

但是步进电机则不一样,因为步进电机是受步进的时序控制,
一般的步进电机的正传与反转的 步进时序图应该不一样。
所以 仅靠flag来改变方向,速度很可能不一样
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
那可能是你的Forward和Back表有问题
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

4
 
for(i=0;i <=4;i++)

你数组长度只有4个
应该是
for(i=0;i <=3;i++)
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

5
 


  1. void main()
  2. {
  3.   unsigned char i;
  4. if(flag==0)
  5. {
  6. if(i>3)i=0;
  7. else i++;
  8. P1=Forward[i];
  9. delay(500);
  10. }
  11. else
  12. {
  13. if(i=0)i=3;
  14. else i--;
  15. P1=Forward[i];
  16. delay(500);
  17. }
  18. }
复制代码
使用步进电机时,需要记录步数,正走和反走是要从一个交叉点来启动,就是说你正走了3步,那么反走的时候要在3往回反。而不是0的位置,否则会缺步!
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

6
 
数组这里貌似是个低级错误,不过我改好以后还是转速不一样
不过另一个程序:
#include
unsigned char code Forward[4]={0xf1,0xe9,0xe5,0xe3};
unsigned char code Back[4]={0xf1,0xe3,0xe5,0xe9};
void delay(unsigned int i)
{
while(--i);
}
main()
{
        unsigned char i;
        while(1)
        {
                for(i=0;i<4;i++)      
            {
                     P1=Back;  
                     delay(500);
                 }
          }
}
的话,P1=Back和P1=Forward转速却基本上一样。
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

7
 
发现你的程序它不是一个循环.................................................................................................................................................................................................................................................................飞了你知道么????????
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

8
 
...................
在main()里面通常是一个无限循环,明白么????????
void main()
{
  unsigned char i;
  while (1)
  {
    if(flag==0)
    {
      for(i=0;i<4;i++)
      {
         P1=Forward;
         delay(500);
      }
    }
    else
    {
      for(i=0;i<4;i++)
      {
        P1=Back;
        delay(500);
      }
    }
   }
}
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

9
 
#include
unsigned char code Forward[4]={0xf1,0xe9,0xe5,0xe3};
unsigned char code Back[4]={0xf1,0xe3,0xe5,0xe9};
unsigned char flag=0;
void delay(unsigned int cnt)
{
while(--cnt);
}
void main()
{
  unsigned char i;
while(1)
{


if(flag==0)
{
for(i=0;i<4;i++)
{
P1=Forward;
delay(500);
}
}
else
{
for(i=0;i 4;i++)
{
P1=Back;
delay(500);
}

}
}

程序 通过控制改变初始化flag的值 是可以控制正转反转的,至于速度,可能跟电机有关系 也可以适当的改变延时来试试delay()
 
 
 

回复

50

帖子

0

TA的资源

一粒金砂(高级)

10
 
时序问题
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表