找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3480|回复: 6
收起左侧

51单片机控制DM542c驱动器

[复制链接]
回帖奖励 100 黑币 回复本帖可获得 10 黑币奖励! 每人限 1 次(中奖概率 50%)
ID:411723 发表于 2020-9-4 21:35 | 显示全部楼层 |阅读模式
额,不知道为啥写的代码没有脉冲输出过去,求大佬 写一个可以输出脉冲的   主要就是stepCW和StepCCw那块函数 如何实现 ,谢谢了 如果能对框架优化就更好了

#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;

////////////基本函数////////////
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;
}
////软件数据存储/////
#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];
//////////软件架构函数///////
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)//启动减速运行函数
{
        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)//启动减速运行函数
{
        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) /////////////正反判断函数
{
        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函数
{
  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()/////复位函数/////
{
        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;

                                        }
                                }
                                }
                }
                }
       
}


回复

使用道具 举报

ID:235954 发表于 2020-9-5 09:17 | 显示全部楼层
需要什么,PWM程序,还是串口通信程序
回复

使用道具 举报

ID:411723 发表于 2020-9-5 09:39 | 显示全部楼层
梁廷明 发表于 2020-9-5 09:17
需要什么,PWM程序,还是串口通信程序

好了 不是程序的问题 ,是步进电机电源问题, 控制信号电平太低了 ,换成5v的就可以控制了,谢谢
回复

使用道具 举报

ID:832425 发表于 2020-11-24 14:42 | 显示全部楼层
看上去不错,没有共享出来大家学习一下吗
回复

使用道具 举报

ID:475858 发表于 2020-11-27 15:46 | 显示全部楼层
控制信号和步进电机之间应该有驱动芯片
回复

使用道具 举报

ID:899124 发表于 2021-4-1 14:52 | 显示全部楼层
你好,我想请教一下,这个程序,我需要怎样接电路啊?
回复

使用道具 举报

ID:899124 发表于 2021-4-2 16:01 | 显示全部楼层
你好,我想请教一下单片机与DM542之间怎么接线呢?是共用5V接正极还是怎么接线啊?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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