找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7180|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

求助:用這個(gè)程序步進(jìn)電機(jī)不能連續(xù)旋轉(zhuǎn),為什么?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:77707 發(fā)表于 2017-8-13 15:46 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
/*步進(jìn)電機(jī)(正轉(zhuǎn)一圈 反轉(zhuǎn)一圈)*/       
#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}; //反轉(zhuǎn)
unsigned char code FFZ[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; //正轉(zhuǎn)
unsigned int  K;


/**********************************************************************
*                                                                                                                                          *
*                       步進(jìn)電機(jī)驅(qū)動                                                                  *
*                                                                                                                                          *
***********************************************************************/
void  motor_ffw()
{
   unsigned char i;
   unsigned int  j;
          for (j=0; j<12; j++)         //轉(zhuǎn)1*n圈
    {

      for (i=0; i<8; i++)       //一個(gè)周期轉(zhuǎn)30度
        {
          if(K==1) P1 = FFW[i]&0x1f;  //取數(shù)據(jù)
                  if(K==2) P1 = FFZ[i]&0x1f;
          delay(20);                   //調(diào)節(jié)轉(zhuǎn)速
        }
     }
}

/******************************************************
*
*                     延時(shí)程序
*
********************************************************/
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();

         }
}
電機(jī)有反應(yīng),像是震動,不是旋轉(zhuǎn)。謝謝,指導(dǎo)。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:77707 發(fā)表于 2017-8-13 15:49 | 只看該作者
這個(gè)程序也不轉(zhuǎn),有震動。
/*************************************************************************************
*  標(biāo)題:  步進(jìn)電機(jī)試驗(yàn)一                                                                                                                         *
*                                                                                                                                                                          *
*    通過本例程了解步進(jìn)馬達(dá)使用及驅(qū)動程序編寫                                                                                 *
*;   單雙八拍工作方式:                                                                    *
*;   A-AB-B-BC-C-CD-D-DA (即一個(gè)脈沖,轉(zhuǎn) 3.75 度)                                                                       *
*    J14短路冒需斷開                                                                       *
*  請學(xué)員一定要消化掉本例程                                                                    *
                                                                                                                               *
**************************************************************************************/  
#include "reg52.h"
//Motor
sbit A = P1^0;          //定義管腳
sbit b = P1^1;
sbit C = P1^2;
sbit D = P1^3;

///////////////////////////////////////
//步進(jìn)電機(jī)驅(qū)動
unsigned char MotorStep=0;  //步進(jìn)馬達(dá)步序
unsigned int  MotorDelay,Speed=1,TIM,CT;

#define speed 15 // 調(diào)整速度 數(shù)值不要設(shè)的太低 低了會引起震動。

/*****************************************************
*            初始化馬達(dá)                                                                 *
******************************************************/
void InitMotor()
{
  A = 1;
  b = 1;
  C = 1;
  D = 1;
}



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

    MotorDelay=Speed;        //調(diào)整速度
    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();

         }



  }

/************************************************
*                                                                                                *
*              定時(shí)中斷延時(shí)                                                    *
************************************************/
  void Tzd(void) interrupt 1
{
   TH0 = 0xfe;    //11.0592
         TL0 = 0x33;

        if( CT++==speed)
          {TIM=1;
           CT=0;
          }
}
回復(fù)

使用道具 舉報(bào)

板凳
ID:61876 發(fā)表于 2017-8-13 16:39 | 只看該作者
我在用步進(jìn)電機(jī)的時(shí)候,剛開始也遇到了振動不轉(zhuǎn)的現(xiàn)象,多數(shù)時(shí)候是接線有問題,所以樓主第一要處理的就是線一定要分清。如果是四線電機(jī),最好用L298H橋驅(qū)動,用別的驅(qū)動電路,多數(shù)會出現(xiàn)不轉(zhuǎn)的現(xiàn)象。
回復(fù)

使用道具 舉報(bào)

地板
ID:77707 發(fā)表于 2017-8-13 17:10 | 只看該作者
gaozhaohong 發(fā)表于 2017-8-13 16:39
我在用步進(jìn)電機(jī)的時(shí)候,剛開始也遇到了振動不轉(zhuǎn)的現(xiàn)象,多數(shù)時(shí)候是接線有問題,所以樓主第一要處理的就是線 ...

非常感謝,我遵旨檢查。
回復(fù)

使用道具 舉報(bào)

5#
ID:229353 發(fā)表于 2017-8-25 17:32 | 只看該作者
你好,想問下您這個(gè)步進(jìn)電機(jī)的問題解決了嗎?我也遇到類似的問題了。
回復(fù)

使用道具 舉報(bào)

6#
ID:229362 發(fā)表于 2017-8-25 18:29 | 只看該作者
檢查線路
回復(fù)

使用道具 舉報(bào)

7#
ID:60379 發(fā)表于 2017-8-25 19:15 | 只看該作者
以下內(nèi)容來源于《51單片機(jī)輕松入門 基于STC15W4K系列》,程序和電路肯定是能用的。完整工程見附件。 1—正反轉(zhuǎn).rar (15.68 KB, 下載次數(shù): 6)




  1. /****************《51單片機(jī)輕松入門-基于STC15W4K系列》配套例程 *************
  2. ★★★★★★★★★★★★★★★★★★★★★★★★
  3. 《51單片機(jī)輕松入門-基于STC15W4K系列》 一書已經(jīng)由北航出版社正式出版發(fā)行。
  4.   作者親手創(chuàng)作的與教材配套的51雙核實(shí)驗(yàn)板(2個(gè)MCU)對程序下載、調(diào)試、仿真方便,不需要外部
  5.   仿真器與編程器,這種設(shè)計(jì)方式徹底解決了系統(tǒng)中多個(gè)最高優(yōu)先級誰也不能讓誰的中斷競爭問題。
  6.   淘寶店地址:shop117387413點(diǎn)taobao點(diǎn)com
  7.   QQ群:STC51-STM32(3) :515624099 或 STC51-STM32(2):99794374。
  8.         驗(yàn)證信息:STC15單片機(jī)
  9.   郵箱:xgliyouquan@126.com
  10.   ★★★★★★★★★★★★★★★★★★★★★★★★*/


  11. // 程序功能:上電后順轉(zhuǎn)200步,然后反轉(zhuǎn)200步,如此循環(huán)。
  12. // 使用P20、P21、P22、P23口驅(qū)動電機(jī)
  13. #include "STC15W4K.H "
  14. unsigned char code BiaoGe[8]={0x08,0x0C,0x04,0x06,0x02,0x03,0x01,0x09};
  15.                                         // 表格,換算成二進(jìn)制 1000,1100,0100, 0110 ,0010,0011, 0001 1001
  16.                                         // P2口輸出低4位驅(qū)動電機(jī)   A  B  /A  /B      
  17.                                         // 1——2相勵(lì)磁,發(fā)8次脈沖(順序輸出上面表格)轉(zhuǎn)動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、接驅(qū)動功率管,推挽輸出
  35.         P2M0 = 0x0f;         // 0000 1111   P2.7 接接霍爾傳感器信號輸入,高阻輸入
  36. }
  37. void shun200()                           // 順轉(zhuǎn)200步
  38. {
  39.         unsigned int i;
  40.         unsigned char n;
  41.         n=0;
  42.         for(i=0;i<400;i++)         // 200步,i/2為實(shí)際步數(shù)
  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;                                          // 保證電機(jī)繞組斷電
  53. }
  54. void fan200()                                          // 反轉(zhuǎn)200步
  55. {
  56.         unsigned int i;
  57.         unsigned char n;
  58.         n=8;                       
  59.         for(i=0;i<400;i++)            // 200步,i/2為實(shí)際步數(shù)
  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;                                          // 保證電機(jī)繞組斷電        
  70. }
  71. void main(void)                                 
  72. {                  
  73.         PROT_Init();                      // 初始化端口      
  74.         while(1)
  75.         {
  76.                 shun200();
  77.                 delay1s();
  78.                 fan200();
  79.                 delay1s();
  80.         }      
  81. }
復(fù)制代碼





回復(fù)

使用道具 舉報(bào)

8#
ID:229387 發(fā)表于 2017-8-25 21:06 | 只看該作者
脈沖分配不規(guī)律
回復(fù)

使用道具 舉報(bào)

9#
ID:223788 發(fā)表于 2017-8-25 22:03 | 只看該作者
應(yīng)該要加一個(gè)延時(shí)吧
回復(fù)

使用道具 舉報(bào)

10#
ID:229353 發(fā)表于 2017-8-26 09:21 | 只看該作者

什么意思,能說詳細(xì)一點(diǎn)么?
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表