找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求助:用这个程序步进电机不能连续旋转,为什么?

[复制链接]
跳转到指定楼层
楼主
/*步进电机(正转一圈 反转一圈)*/       
#include "reg52.h"

void delay(unsigned int t);

//Motor
sbit F1 = P1^0;
sbit F2 = P1^1;
sbit F3 = P1^2;
sbit F4 = P1^3;

unsigned char code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //反转
unsigned char code FFZ[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; //正转
unsigned int  K;


/**********************************************************************
*                                                                                                                                          *
*                       步进电机驱动                                                                  *
*                                                                                                                                          *
***********************************************************************/
void  motor_ffw()
{
   unsigned char i;
   unsigned int  j;
          for (j=0; j<12; j++)         //转1*n圈
    {

      for (i=0; i<8; i++)       //一个周期转30度
        {
          if(K==1) P1 = FFW[i]&0x1f;  //取数据
                  if(K==2) P1 = FFZ[i]&0x1f;
          delay(20);                   //调节转速
        }
     }
}

/******************************************************
*
*                     延时程序
*
********************************************************/
void delay(unsigned int t)
{                           
   unsigned int k;
   while(t--)
   {
     for(k=0; k<80; k++)
     { }
   }
}


main()
{
    while(1)
        {
         K=1;
         motor_ffw();
         K=2;
         motor_ffw();

         }
}
电机有反应,像是震动,不是旋转。谢谢,指导。

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

使用道具 举报

沙发
ID:77707 发表于 2017-8-13 15:49 | 只看该作者
这个程序也不转,有震动。
/*************************************************************************************
*  标题:  步进电机试验一                                                                                                                         *
*                                                                                                                                                                          *
*    通过本例程了解步进马达使用及驱动程序编写                                                                                 *
*;   单双八拍工作方式:                                                                    *
*;   A-AB-B-BC-C-CD-D-DA (即一个脉冲,转 3.75 度)                                                                       *
*    J14短路冒需断开                                                                       *
*  请学员一定要消化掉本例程                                                                    *
                                                                                                                               *
**************************************************************************************/  
#include "reg52.h"
//Motor
sbit A = P1^0;          //定义管脚
sbit b = P1^1;
sbit C = P1^2;
sbit D = P1^3;

///////////////////////////////////////
//步进电机驱动
unsigned char MotorStep=0;  //步进马达步序
unsigned int  MotorDelay,Speed=1,TIM,CT;

#define speed 15 // 调整速度 数值不要设的太低 低了会引起震动。

/*****************************************************
*            初始化马达                                                                 *
******************************************************/
void InitMotor()
{
  A = 1;
  b = 1;
  C = 1;
  D = 1;
}



void SetMotor()
{
  //  if(Speed == 0) return;

    MotorDelay=Speed;        //调整速度
    switch(MotorStep)
    {
       case 0:
          if(TIM)   // A
          {                                    
            A = 0;                    //0xf1  
            b = 1;
                        C = 1;
            D = 1;
            MotorStep = 1;
                        TIM=0;
          }
       break;

       case 1:                 // AB
         if(TIM)
          {       
            A = 0;                   //0xf3
            b = 0;
                   C = 1;
            D = 1;
            MotorStep = 2;
                        TIM=0;
          }
       break;

       case 2:           //B
         if(TIM)
          {
           
                  A = 1;
            b = 0;                  //0xf2
            C = 1;
            D = 1;
           
            MotorStep = 3;
                        TIM=0;
          }
       break;


       case 3:                //BC
         if(TIM)
          {       
            A = 1;
            b = 0;                    //0xf6
            C = 0;
            D = 1;
            MotorStep = 4;
                        TIM=0;
          }
       break;
     case 4:                 //C
         if(TIM)
          {       
            A = 1;
            b = 1;                    //0xf4
            C = 0;
            D = 1;
            MotorStep = 5;
                        TIM=0;
           }
       break;
        case 5:                          //CD
         if(TIM)
          {       
            A = 1;
            b = 1;                    //0xfc
            C = 0;
            D = 0;
            MotorStep = 6;
                        TIM=0;
          }
       break;
        case 6:                          //D
         if(TIM)
          {       
            A = 1;
            b = 1;                    //0xf8
            C = 1;
            D = 0;
            MotorStep = 7;
                        TIM=0;
          }
       break;
        case 7:                        //DA
         if(TIM)
          {       
            A = 0;
            b = 1;                    //0xf9
            C = 1;
            D = 0;
            MotorStep = 0;
                        TIM=0;
          }
       break;
       
        }

}


void system_Ini()
{
    TMOD|= 0x11;
    TH0=0xDC; //11.0592M
    TL0=0x00;       
        IE = 0x8A;       
    TR0  = 1;


}

main()
{ system_Ini();
   InitMotor();
    while(1)
        {
         SetMotor();

         }



  }

/************************************************
*                                                                                                *
*              定时中断延时                                                    *
************************************************/
  void Tzd(void) interrupt 1
{
   TH0 = 0xfe;    //11.0592
         TL0 = 0x33;

        if( CT++==speed)
          {TIM=1;
           CT=0;
          }
}
回复

使用道具 举报

板凳
ID:61876 发表于 2017-8-13 16:39 | 只看该作者
我在用步进电机的时候,刚开始也遇到了振动不转的现象,多数时候是接线有问题,所以楼主第一要处理的就是线一定要分清。如果是四线电机,最好用L298H桥驱动,用别的驱动电路,多数会出现不转的现象。
回复

使用道具 举报

地板
ID:77707 发表于 2017-8-13 17:10 | 只看该作者
gaozhaohong 发表于 2017-8-13 16:39
我在用步进电机的时候,刚开始也遇到了振动不转的现象,多数时候是接线有问题,所以楼主第一要处理的就是线 ...

非常感谢,我遵旨检查。
回复

使用道具 举报

5#
ID:229353 发表于 2017-8-25 17:32 | 只看该作者
你好,想问下您这个步进电机的问题解决了吗?我也遇到类似的问题了。
回复

使用道具 举报

6#
ID:229362 发表于 2017-8-25 18:29 | 只看该作者
检查线路
回复

使用道具 举报

7#
ID:60379 发表于 2017-8-25 19:15 | 只看该作者
以下内容来源于《51单片机轻松入门 基于STC15W4K系列》程序和电路肯定是能用的。完整工程见附件。 1—正反转.rar (15.68 KB, 下载次数: 6)




  1. /****************《51单片机轻松入门-基于STC15W4K系列》配套例程 *************
  2. ★★★★★★★★★★★★★★★★★★★★★★★★
  3. 《51单片机轻松入门-基于STC15W4K系列》 一书已经由北航出版社正式出版发行。
  4.   作者亲手创作的与教材配套的51双核实验板(2个MCU)对程序下载、调试、仿真方便,不需要外部
  5.   仿真器与编程器,这种设计方式彻底解决了系统中多个最高优先级谁也不能让谁的中断竞争问题。
  6.   淘宝店地址:shop117387413点taobao点com
  7.   QQ群:STC51-STM32(3) :515624099 或 STC51-STM32(2):99794374。
  8.         验证信息:STC15单片机
  9.   邮箱:xgliyouquan@126.com
  10.   ★★★★★★★★★★★★★★★★★★★★★★★★*/


  11. // 程序功能:上电后顺转200步,然后反转200步,如此循环。
  12. // 使用P20、P21、P22、P23口驱动电机
  13. #include "STC15W4K.H "
  14. unsigned char code BiaoGe[8]={0x08,0x0C,0x04,0x06,0x02,0x03,0x01,0x09};
  15.                                         // 表格,换算成二进制 1000,1100,0100, 0110 ,0010,0011, 0001 1001
  16.                                         // P2口输出低4位驱动电机   A  B  /A  /B      
  17.                                         // 1——2相励磁,发8次脉冲(顺序输出上面表格)转动4步
  18. void delay3ms(void)
  19. {
  20.         unsigned char i,j,k;
  21.         for(i=1;i>0;i--)         // 注意后面没分号
  22.         for(j=65;j>0;j--)        // 注意后面没分号
  23.         for(k=254;k>0;k--);      // 注意后面有分号         
  24. }
  25. void delay1s(void)
  26. {
  27.    unsigned char i,j,k;
  28.    for(i=85;i>0;i--)        // 注意后面没分号
  29.    for(j=254;j>0;j--)       // 注意后面没分号
  30.    for(k=255;k>0;k--);      // 注意后面有分号
  31. }                                         

  32. void PROT_Init(void)
  33. {         
  34.         P2M1 = 0x80;     // 1000 0000   P2.0、P2.1、P2.2、P2.3、接驱动功率管,推挽输出
  35.         P2M0 = 0x0f;         // 0000 1111   P2.7 接接霍尔传感器信号输入,高阻输入
  36. }
  37. void shun200()                           // 顺转200步
  38. {
  39.         unsigned int i;
  40.         unsigned char n;
  41.         n=0;
  42.         for(i=0;i<400;i++)         // 200步,i/2为实际步数
  43.         {        
  44.                 P2=BiaoGe[n]|0xf0;           // 不影响P2口高4位               
  45.                 delay3ms();
  46.                 n=n+1;      
  47.                 if (n>7)
  48.                 {                           
  49.                 n=0;
  50.                 }                       
  51.         }
  52.         P2&=0xf0;                                          // 保证电机绕组断电
  53. }
  54. void fan200()                                          // 反转200步
  55. {
  56.         unsigned int i;
  57.         unsigned char n;
  58.         n=8;                       
  59.         for(i=0;i<400;i++)            // 200步,i/2为实际步数
  60.         {        
  61.             n=n-1;               
  62.                 P2=BiaoGe[n]|0xF0;              // 不影响P2口高4位                       
  63.                 delay3ms();
  64.                 if (n==0)
  65.                 {                           
  66.                 n=8;
  67.                 }                       
  68.         }
  69.         P2&=0xf0;                                          // 保证电机绕组断电        
  70. }
  71. void main(void)                                 
  72. {                  
  73.         PROT_Init();                      // 初始化端口      
  74.         while(1)
  75.         {
  76.                 shun200();
  77.                 delay1s();
  78.                 fan200();
  79.                 delay1s();
  80.         }      
  81. }
复制代码





回复

使用道具 举报

8#
ID:229387 发表于 2017-8-25 21:06 | 只看该作者
脉冲分配不规律
回复

使用道具 举报

9#
ID:223788 发表于 2017-8-25 22:03 | 只看该作者
应该要加一个延时吧
回复

使用道具 举报

10#
ID:229353 发表于 2017-8-26 09:21 | 只看该作者

什么意思,能说详细一点么?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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