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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機控制DM542c驅動器

[復制鏈接]
回帖獎勵 100 黑幣 回復本帖可獲得 10 黑幣獎勵! 每人限 1 次(中獎概率 50%)
跳轉到指定樓層
樓主
ID:411723 發(fā)表于 2020-9-4 21:35 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
額,不知道為啥寫的代碼沒有脈沖輸出過去,求大佬 寫一個可以輸出脈沖的   主要就是stepCW和StepCCw那塊函數(shù) 如何實現(xiàn) ,謝謝了 如果能對框架優(yōu)化就更好了

#include <reg52.h>
#include <stdio.h>
#include <math.h>



///////硬件設置////////

sbit FLASH = P3 ^ 4;
sbit kk=P1^4;

sbit PUL1 = P1 ^ 0;
sbit DIR1 = P1 ^ 1;
sbit ENA1 = P1 ^ 2;

sbit PUL2 = P1 ^ 5;
sbit DIR2 = P1 ^ 6;
sbit ENA2 = P1 ^ 7;

sbit PUL3 = P2 ^ 0;
sbit DIR3 = P2 ^ 1;
sbit ENA3 = P2 ^ 2;


sbit IN0 = P0 ^ 0;
sbit IN1 = P0 ^ 1;
sbit IN2 = P0 ^ 2;
sbit IN3 = P0 ^ 3;//輸入口 gpios
#define IN P0

sbit OUT0 = P0 ^ 4;
sbit OUT1 = P0 ^ 5;
sbit OUT2 = P0 ^ 6;
sbit OUT3 = P0 ^ 7;

////////////基本函數(shù)////////////
void Delay(unsigned int m)//延時
{
        unsigned int i, j;
        for (i = 0; i < m; i++)
                for (j = 0; j < 100; j++);
}
void Flash(unsigned int m)//閃爍測試
{
        FLASH = 0;
        Delay(m);
        FLASH = 1;
}
////軟件數(shù)據(jù)存儲/////
#define HMAX 20
code unsigned int mStep[20]= { 100,90,80,70,60,50,40,38,35,33,30,28,25,23,20,18,16,14,10,8 };
char SPM[9][1];
//////////軟件架構函數(shù)///////
void InitTask()//電機初始化/////////////test    ok
{
        kk=1;
        PUL1 = 1;       
  ENA1 = 1;
  PUL2 = 1;       
  ENA2 = 1;
  PUL3 = 1;
  ENA3 = 1;
}
void StepCW(unsigned int m,char p)//正傳1.8///test  ok
{
        unsigned int mm = m >> 1;
        //switch (p)
        //{
       
                //case 0x1:
            DIR1 = 1;
                        PUL1 = 0;
                        Delay(mm);
                        PUL1 = 1;
                        Delay(mm);
                        //break;
                /*case 0x2:
                        DIR2 = 1;
                        PUL2 = 0;
                        Delay(mm);
                        PUL2 = 1;
                        Delay(mm);
                        break;
                case 0x3:
                        DIR3 = 1;
                        PUL3 = 0;
                        Delay(mm);
                        PUL3 = 1;
                        Delay(mm);
                        break;*/
        //}
       
}
void StepCCW(unsigned int m, char p)//反轉1.8//test   ok
{
        unsigned int mm = m >> 1;
        switch (p)
        {
                case 0x1:
                        DIR1 = 0;
                        PUL1 = 0;
                        Delay(mm);
                        PUL1 = 1;
                        Delay(mm);
                        break;
                case 0x2:
                        DIR2 = 0;
                        PUL2 = 0;
                        Delay(mm);
                        PUL2 = 1;
                        Delay(mm);
                        break;
                case 0x3:
                        DIR3 = 0;
                        PUL3 = 0;
                        Delay(mm);
                        PUL3 = 1;
                        Delay(mm);
                        break;
        }       
}

void USP2P(int n, unsigned int m,char p) /////test ok
{
        int i;
        if (n >= 0)
                for (i = 0; i < n; i++) StepCW(m,p);
        else
                for (i = 0; i < -n; i++) StepCCW(m,p);
}

/*void UDP2P1(unsigned int n,unsigned int n1,char p)//啟動減速運行函數(shù)
{
        int i;
        unsigned int n01,n02,n03;
        if (n < n1)for (i = 0; i < n; i++) StepCW(mStep[0],p);
        else if (n < 2 * n1)
        {
                if (n % 2 == 0) n01 = n02 = n / 2;
                else{n01 = n / 2 + 1; n02 = n / 2;}
                for (i = 0; i < n01;i++)StepCW(mStep[i],p);
                for (i = n02 - 1; i >= 0; i--)StepCW(mStep[i],p);
        }
        else
        {
                n03 = n - 2 * n1;
                for (i = 0; i < n1; i++)StepCW(mStep[i],p);
                for (i = 0; i < n03; i++)StepCW(mStep[n1-1],p);
                for (i = n1-1; i >=0; i--)StepCW(mStep[i],p);
        }
}
void UDP2P2(unsigned int n, unsigned int n1, char p)//啟動減速運行函數(shù)
{
        int i;
        unsigned int n01, n02, n03;
        if (n < n1)
   {
   for (i = 0; i < n; i++)
    StepCCW(mStep[0], p);
   }
        else if (n < 2 * n1)
        {
                if (n % 2 == 0) n01 = n02 = n / 2;
                else {n01 = n / 2 + 1; n02 = n / 2;}
                for (i = 0; i < n01;i++) StepCCW(mStep[i], p);
                for (i = n02 - 1; i >= 0; i--)StepCCW(mStep[i], p);
        }
        else
        {
                n03 = n - 2 * n1;
                for (i = 0; i < n1; i++)StepCCW(mStep[i], p);
                for (i = 0; i < n03; i++)StepCCW(mStep[n1 - 1], p);
                for (i = n1 - 1; i >= 0; i--)StepCCW(mStep[i], p);
        }
}

void XuanZhe(int n, unsigned int m, char p) /////////////正反判斷函數(shù)
{
        unsigned int nn = abs(n);
        if (n >= 0)
                UDP2P1(nn, m, p);
        else
        {
          UDP2P2(nn, m, p);
        }
       
}*/
void SAVE2(int n,int m) /////test   ok ////////儲存坐標2函數(shù)
{
  int xx;
  SPM[xx][0] = n;
  SPM[xx][1] = m;
  xx++;
        if(xx>=9){xx=0;}
}
void Line1(int x,int y,int m)////左上運動
{
        int N;
        int i=0,F=0;
        N=abs(x)+abs(y);
        for(i=0;i<N;i++)
   {
                 if(F>=0)
                {
                 StepCW(m,0x1);
                 F=F-x;
    }
         else
    {
           StepCW(m,0x2);
                 F=F+x;
    }
         }
}
void Line2(int x,int y,int m)////右上運動
{
        int N;
        int i=0,F=0;
        N=abs(x)+abs(y);
        for(i=0;i<N;i++)
   {
                 if(F<0)
                {
                 StepCCW(m,0x1);
                 F=F+y;
    }
         else
    {
           StepCW(m,0x2);
                 F=F+x;
    }
         }
}
void Line3(int x,int y,int m)/////右下運動
{
        int N;
        int i=0,F=0;
        N=abs(x)+abs(y);
        for(i=0;i<N;i++)
   {
                 if(F>0)
                {
                 StepCCW(m,0x1);
                 F=F+y;
    }
         else
    {
           StepCCW(m,0x2);
                 F=F-x;
    }
         }
}
void Line4(int x,int y,int m)////左下運動
{
        int N;
        int i=0,F=0;
        N=abs(x)+abs(y);
        for(i=0;i<N;i++)
   {
                 if(F<0)
                {
                 StepCW(m,0x1);
                 F=F-y;
    }
         else
    {
           StepCCW(m,0x2);
                 F=F-x;
    }
         }
}

void Line(int x,int y,int m)////直線插補
{
        int k;
        if(x==0)
{
        if(y>0) for(k=0;k<y;k++)  StepCW(m,0x2);
        else  for(k=0;k<-y;k++)  StepCCW(m,0x2);
        return;
}
  if(y==0)
{
        if(x>0) for(k=0;k<x;k++)  StepCW(m,0x1);
        else  for(k=0;k<-x;k++)  StepCCW(m,0x1);
        return;
}
if(x>0)
{
        if(y>0) Line1(x,y,m);
        else Line4(x,y,m);

}
else
{
        if(y>0) Line2(x,y,m);
        else Line3(x,y,m);
}
       
}
void Resetre()/////復位函數(shù)/////
{
        int i;
        int res[1];
        for(i=0;i<9;i++)
{
        res[0]=res[0]+SPM[i][0];
        res[1]=res[1]+SPM[i][1];
}
        USP2P(res[0], 200,0x1);
        USP2P(res[1], 200,0x2);
}

/////串口構架
sbit ENTXD = P3^6;
#define ENABLETXD  {ENTXD=0;}
#define DISABLETXD {ENTXD=1;}
void InitCom(void)/////////////////tesk     ok
{
        //EA=1;      
         //ES=1;
         //ET1=1;
        TMOD = 0x20;//定時器1中斷允許
        PCON = 0x00;//smod=0
        SCON = 0x50;//方式1 ,定時器控制
        TH1 = 0Xfd;//波特率9600
        TL1 = 0Xfd;
        TR1 = 1;  //開定時器T1運行控制位
}

void comSendByte(unsigned char ch)///////tesk   ok
{
        TI = 0;
        SBUF = ch;
        while (!TI);
}
void comSendCMD(unsigned char node, unsigned char cmd, unsigned char low, unsigned char hi)
{
        ENABLETXD
        comSendByte(0xff);
        comSendByte(0xff);
        comSendByte(node);
        comSendByte(cmd);
        comSendByte(02);
        comSendByte(low);
        comSendByte(hi);
        DISABLETXD
}

unsigned char cmdBuFF[10];
unsigned char iCmdByte = 0;
////////////////////////////////////////
void main()
{
        unsigned char ch;
        unsigned char nodeID, cmdID, nParaBytes, ParaLow, ParaHi;
        unsigned int para;
        unsigned int ii;
        InitCom();
        InitTask();
       
        while (1)
        {
                if (RI)
                {
                        ch = SBUF;
                        RI = 0;
                comSendByte(ch);

                cmdBuFF[iCmdByte] = ch;
                iCmdByte++;
               
                 if (iCmdByte >= 7)
                    {
                        iCmdByte = 0;
                        if (cmdBuFF[0] != 0xff || cmdBuFF[1] != 0xff)
                                {
                                        continue;
                                }

                                else
                                {
                                        // byte0     1      2       3      4         5         6
                                        // 0xFF  0xFF   NODE#  CMDID          PARALEN   PARALOW   PARAHI
                                        nodeID = cmdBuFF[2];
                                        cmdID = cmdBuFF[3];
                                        nParaBytes = cmdBuFF[4];
                                        ParaLow = cmdBuFF[5];
                                        ParaHi = cmdBuFF[6];

                                        para = ParaHi;
                                        para <<= 8;
                                        para |= ParaLow;

                                       
                                        switch (cmdID)
                                        {
                                        case 0x0:
                                                Flash(200);
                                    ENABLETXD
                                                break;
                                        case 0x2:
                                          StepCW((char)ParaLow,nodeID);                                               
                                                break;
                                        case 0x3:
                                          USP2P(500, 100, 0x1);
                                                break;
                                        case 0x4:       
                                                SAVE2((int)ParaLow, (int)ParaHi);
                                                break;
                                        case 0x5:
                                                for(ii=0;ii<9;ii++)
                                          {
                                           Line(SPM[ii][0],SPM[ii][1],(int)ParaHi);
                                                }
                                                break;
                                        case 0x6:
                                                break;
                                        case 0x80:
                                       
                                                break;
                                        case 0x82:
                                               
                                                break;
                                        case 0x84:
                                               
                                                break;

                                        }
                                }
                                }
                }
                }
       
}


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

使用道具 舉報

沙發(fā)
ID:235954 發(fā)表于 2020-9-5 09:17 | 只看該作者
需要什么,PWM程序,還是串口通信程序
回復

使用道具 舉報

板凳
ID:411723 發(fā)表于 2020-9-5 09:39 | 只看該作者
梁廷明 發(fā)表于 2020-9-5 09:17
需要什么,PWM程序,還是串口通信程序

好了 不是程序的問題 ,是步進電機電源問題, 控制信號電平太低了 ,換成5v的就可以控制了,謝謝
回復

使用道具 舉報

地板
ID:832425 發(fā)表于 2020-11-24 14:42 | 只看該作者
看上去不錯,沒有共享出來大家學習一下嗎
回復

使用道具 舉報

5#
ID:475858 發(fā)表于 2020-11-27 15:46 | 只看該作者
控制信號和步進電機之間應該有驅動芯片
回復

使用道具 舉報

6#
ID:899124 發(fā)表于 2021-4-1 14:52 | 只看該作者
你好,我想請教一下,這個程序,我需要怎樣接電路啊?
回復

使用道具 舉報

7#
ID:899124 發(fā)表于 2021-4-2 16:01 | 只看該作者
你好,我想請教一下單片機與DM542之間怎么接線呢?是共用5V接正極還是怎么接線啊?
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品欧美一区二区 | 一级一级毛片免费看 | 成人欧美一区二区三区黑人孕妇 | 国产精品久久久久久av公交车 | 草草视频在线播放 | 麻豆视频在线免费观看 | 国产精品污污视频 | 精品亚洲一区二区 | 草草视频在线观看 | 精品福利在线 | 性高湖久久久久久久久 | 久久精品色欧美aⅴ一区二区 | v片网站 | 久久出精品 | 亚洲精品福利视频 | 一区二区三区国产好 | 99久久国产综合精品麻豆 | 亚洲激情网站 | 中文av在线播放 | 国产精品久久一区 | 日韩免费视频一区二区 | 欧美成人精品一区二区三区 | 91精品久久久久久综合五月天 | 日韩精品在线看 | 毛片黄片| 国产一区二区观看 | 欧美性受xxx | 欧美日韩国产精品一区 | 日韩精品一区二区三区视频播放 | 九九一级片 | 国产亚洲成av人片在线观看桃 | 一区二区三区高清 | 国产精品久久久久久久久动漫 | 日韩欧美在线免费观看视频 | 毛片a级毛片免费播放100 | 精品亚洲二区 | av在线播放网址 | 日韩欧美国产精品 | 在线看亚洲 | 在线观看国产 | 精品综合|