找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2501|回复: 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);        //改变这个参数可以调整电机转速
                 }
          }
}


回复

使用道具 举报

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;
    }
}
回复

使用道具 举报

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秒
          }
}
回复

使用道具 举报

ID:143767 发表于 2020-8-3 17:07 | 显示全部楼层
谢谢指教,上面的两个程序我都试过了,第一个程序电机不转,只是抖动并发热。第二个程序通电以后逆时针只转很小的一个角度就停止。不知什么原因。
回复

使用道具 举报

ID:190577 发表于 2020-8-3 17:36 | 显示全部楼层
dj3365191 发表于 2020-8-3 17:07
谢谢指教,上面的两个程序我都试过了,第一个程序电机不转,只是抖动并发热。第二个程序通电以后逆时针只转 ...

发给你的程序只是参考程序
回复

使用道具 举报

ID:653909 发表于 2020-8-4 07:59 | 显示全部楼层
可能是你得电机某一相连接不好
回复

使用道具 举报

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

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




以上仅供参考
回复

使用道具 举报

ID:143767 发表于 2020-8-5 13:29 | 显示全部楼层
谢谢指教,我已找到了程序,自己修改了下能用了。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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