久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3443|回復: 9
打印 上一主題 下一主題
收起左側

單片機步進電機正反轉修改

[復制鏈接]
跳轉到指定樓層
樓主
ID:143767 發表于 2020-8-2 12:26 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
高手看一下,下面這程序我想讓步進電機正轉10-15秒后再反轉10-15秒再正轉,周而復始。程序需要怎樣修改?謝謝!

/*
1、本程序用于測試4相步進電機常規驅動
2、需要用跳帽或者杜邦線把信號輸出端和對應的步進電機信號輸入端連接起來
3、速度不可以調節的過快,不然就沒有力矩轉動了
可以按照給的原理圖接線*/
#include <reg52.h>


unsigned char code F_Rotation[4]={0x04,0x08,0x10,0x20};//正轉表格
unsigned char code B_Rotation[4]={0x20,0x10,0x08,0x04};//反轉表格

void Delay(unsigned int i)//延時
{
         while(--i);
}

main()
{
        unsigned char i;

         while(1)
         {
                  for(i=0;i<4;i++)      //4相
             {
                     P3=F_Rotation[ i];  //輸出對應的相 可以自行換成反轉表格
                     Delay(750*10);        //改變這個參數可以調整電機轉速
                 }
          }
}


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

使用道具 舉報

沙發
ID:190577 發表于 2020-8-2 15:56 | 只看該作者
需要使用定時器定時,你這個程序不好改,估計要重新寫一個,要用定時器0定時來實現電機脈沖輸出,定時器1定時時間,這樣才可以
回復

使用道具 舉報

板凳
ID:143767 發表于 2020-8-2 16:12 | 只看該作者
或者改成正轉180度然后反轉180度持續進行也可以,謝謝。
回復

使用道具 舉報

地板
ID:190577 發表于 2020-8-2 18:22 | 只看該作者
#include <reg52.h>
unsigned long beats = 0;  //電機轉動節拍總數

void StartMotor(unsigned long angle);

void main()
{
    EA = 1;       //使能總中斷
    TMOD = 0x01;  //設置T0為模式1
    TH0  = 0xF8;  //為T0賦初值0xF8CC,定時2ms
    TL0  = 0xCC;
    ET0  = 1;     //使能T0中斷
    TR0  = 1;     //啟動T0
   
    StartMotor(90);  //控制電機轉動2圈半
        while (1);
}
/* 步進電機啟動函數,angle-需轉過的角度 */
void StartMotor(unsigned long angle)
{
    //在計算前關閉中斷,完成后再打開,以避免中斷打斷計算過程而造成錯誤
    EA = 0;
    beats = (angle * 4076) / 360; //實測為4076拍轉動一圈
    EA = 1;
}
/* T0中斷服務函數,用于驅動步進電機旋轉 */
void InterruptTimer0() interrupt 1
{
    unsigned char tmp;  //臨時變量
    static unsigned char index = 0;  //節拍輸出索引
    unsigned char code BeatCode[8] = {  //步進電機節拍對應的IO控制代碼
        0xE0, 0xC0, 0xD0, 0x90, 0xB0, 0x30, 0x70, 0x60
    };
   
    TH0 = 0xF8;  //重新加載初值
    TL0 = 0xCC;
    if (beats != 0)  //節拍數不為0則產生一個驅動節拍
    {
        tmp = P1;                    //用tmp把P1口當前值暫存
        tmp = tmp & 0x87;            //用&操作清零
        tmp = tmp | (BeatCode[index]>>1); //用|操作把節拍代碼寫到低4位
        P1  = tmp;                   //把低4位的節拍代碼和高4位的原值送回P1
        index++;                     //節拍輸出索引遞增
        index = index & 0x07;        //用&操作實現到8歸零
        beats--;                     //總節拍數-1
    }
    else  //節拍數為0則關閉電機所有的相
    {
        P1 = P1 | 0x78;
    }
}
回復

使用道具 舉報

5#
ID:804115 發表于 2020-8-3 00:26 | 只看該作者
void Delay_S(unsigned int t)
{
        unsigned int m;
        unsigned char i,j,k;
        for(m=0; m<t; m++)
        {
                for(i=198;i>0;i--)     //注意后面沒分號
                        for(j=100;j>0;j--)    //注意后面沒分號
                                for(k=150;k>0;k--);    //注意后面有分號
        }
}

main()
{
        unsigned char i;
        unsigned long t;

         while(1)
         {
                for(i=0;i<4;i++)      //4相
                     {
                     P3=F_Rotation[ i];  //輸出對應的相 可以自行換成反轉表格
                     Delay(750*10);        //改變這個參數可以調整電機轉速
                }

                                Delay_S(10); //延時10秒

                                for(i=0;i<4;i++)      //4相
                     {
                     P3=B_Rotation[ i];  //輸出對應的相 可以自行換成反轉表格
                     Delay(750*10);        //改變這個參數可以調整電機轉速
                }
                               
                                Delay_S(10); //延時10秒
          }
}
回復

使用道具 舉報

6#
ID:143767 發表于 2020-8-3 17:07 | 只看該作者
謝謝指教,上面的兩個程序我都試過了,第一個程序電機不轉,只是抖動并發熱。第二個程序通電以后逆時針只轉很小的一個角度就停止。不知什么原因。
回復

使用道具 舉報

7#
ID:190577 發表于 2020-8-3 17:36 | 只看該作者
dj3365191 發表于 2020-8-3 17:07
謝謝指教,上面的兩個程序我都試過了,第一個程序電機不轉,只是抖動并發熱。第二個程序通電以后逆時針只轉 ...

發給你的程序只是參考程序
回復

使用道具 舉報

8#
ID:653909 發表于 2020-8-4 07:59 | 只看該作者
可能是你得電機某一相連接不好
回復

使用道具 舉報

9#
ID:259420 發表于 2020-8-4 09:48 | 只看該作者
#include <reg51.h>       //51芯片管腳定義頭文件
#include <intrins.h>         //內部包含延時函數 _nop_();
#define uchar unsigned char
#define uint  unsigned int
uchar code FFW[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};  //四相八拍正轉編碼
uchar code REV[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};  ////四相八拍反轉編碼
sbit  K1   = P3^2;       //正轉
sbit  K2   = P3^3;       //反轉
sbit  K3   = P3^4;       //停止
sbit  BEEP = P3^6;       //蜂鳴器
/********************************************************/
/*                                                  
/* 延時t毫秒
/* 11.0592MHz時鐘,延時約1ms                                    
/*                                                      
/********************************************************/
void delay(uint t)
{                           
   uint k;
   while(t--)
   {
     for(k=0; k<125; k++)
     { }
   }
}

/**********************************************************/
void delayB(uchar x)    //x*0.14MS
{
   uchar i;
   while(x--)
   {
     for (i=0; i<13; i++)
     { }
   }
}

/**********************************************************/
void beep()
{
   uchar i;
   for (i=0;i<100;i++)
    {
     delayB(4);
     BEEP=!BEEP;                 //BEEP取反
    }
     BEEP=1;                    //關閉蜂鳴器
}

/********************************************************/
/*
/*步進電機正轉
/*
/********************************************************/
void  motor_ffw()
{
   uchar i;
   uint  j;
   for (j=0; j<8; j++)         //轉1*n圈
    {
            if(K3==0)
        {break;}                //退出此循環程序
      for (i=0; i<8; i++)       //一個周期轉45度
        {
          P1 = FFW[i];          //取數據
          delay(2);            //調節轉速
        }
    }
}

/********************************************************/
/*
/*步進電機反轉
/*
/********************************************************/
void  motor_rev()
{
     uchar i;
         uint  j;
         for (j=0; j<8; j++)       //轉1×n圈
      {
            if(K3==0)
         {break;}               //退出此循環程序
        for (i=0; i<8; i++)     //一個周期轉45度
        {
          P1 = REV[i];          //取數據
          delay(2);            //調節轉速
        }
      }
}

/********************************************************
*                                                      
*  主程序                                               
*                                                      
*********************************************************/

main()
{
      uchar r,N=64;             //N 步進電機運轉圈數
   while(1)
    {  
      if(K1==0)
          {
        beep();
                for(r=0;r<N;r++)
         {
                   motor_ffw();       //電機正轉
                   if(K3==0)
                  {beep();break;}    //退出此循環程序
             }
      }
          else if(K2==0)
       {
            beep();
                for(r=0;r<N;r++)
         {
               motor_rev();       //電機反轉
                   if(K3==0)
                  {beep();break;}    //退出此循環程序
                 }
       }
          else  
                 P1 = 0xf0;
    }
}

/********************************************************/                       




以上僅供參考
回復

使用道具 舉報

10#
ID:143767 發表于 2020-8-5 13:29 | 只看該作者
謝謝指教,我已找到了程序,自己修改了下能用了。
回復

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区在线播放 | 九九伦理片 | 欧美一区二区三区高清视频 | jizz视频| 爱爱综合网 | 国产精品亚洲一区 | 久久国产成人 | 欧美一二三区 | 欧美激情久久久久久 | 91亚洲欧美 | 久久激情视频 | 亚洲精品自在在线观看 | 国产精品视频网 | av网站免费 | 国产精品不卡一区 | a级黄色网| 亚洲欧美日韩中文在线 | 久久尤物免费一区二区三区 | 亚洲v日韩v综合v精品v | 久草欧美 | 日本电影韩国电影免费观看 | 天天操天天操 | 国产一级免费视频 | 成人精品毛片国产亚洲av十九禁 | 日韩免| 欧美日韩国产精品一区 | 午夜免费| 久久成人精品一区二区三区 | 久久综合影院 | 91综合网| 久久九九免费 | 免费观看一级特黄欧美大片 | 久久视频一区 | 午夜爱爱毛片xxxx视频免费看 | 99热最新网址 | 久久久久久高潮国产精品视 | 艹逼网 | 成人av网站在线观看 | 日本精品一区二区 | 精久久久 | 午夜国产在线 |