小白白,求大神教导步进电机

2019-03-24 18:20发布

我有一个ULN2003A控制的四相步进电机,现在我打算用驱动器控制一个24V的两相步进电机,程序应该怎么改 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
蓝雨夜
1楼-- · 2019-03-25 04:23
 精彩回答 2  元偷偷看……
fafafafather
2楼-- · 2019-03-25 06:20
file:///C:Documents and SettingsAdministratorApplication DataTencentUsers448031894QQWinTempRichOleBV`9EYMV8Z4I7G~1}(GNRUT.jpgfile:///C:Documents and SettingsAdministratorApplication DataTencentUsers448031894QQWinTempRichOleBV`9EYMV8Z4I7G~1}(GNRUT.jpg

fafafafather
3楼-- · 2019-03-25 10:52
#include <AT89X51.h>
#include <stdio.h>
#include <math.h>
#define uc unsigned char
#define ui unsigned int                                                  
void chkbusy(void);
void wcode(uc cd) ;
void wdata(uc dat);
void disrow(uc page,uc col,uc *temp);
void display( uc page,uc col,uc *temp);
void ground(step);                                     //转步
void run1();                                     //正转
void run2();
void stop();
void delay(ui time);
uc scan_key1,scan_key2;                        //按键功能选择,00 停止,01 正转 10 反转
uc step1;step2;
static  step_index;
ui count1,count2;                                   //定时
uc butter;                                                        //按键
static  speed;                                                //速度参数
void main(void)
{  
   P2=0xff;
   step2=0;
   step1=0;
   P1=0xff;
   P0=0;
   EX1=1;
   EA=1;                                               //开中断
   speed=1500;
   while(1)
  {  
     if((scan_key1==1)&(scan_key2==0))             // 正转
         {  

            ground(step_index);
            delay(speed);
               step_index++;                                                   //大于7,从头再来
            if(step_index>7)
                   step_index=0;
          }
         if((scan_key1==0)&(scan_key2==1))                   //反转
         {                                                                    
           ground(step_index);
           delay(speed);
              step_index--;
           if(step_index<0)                                                        //小于0,从头再来。
                   step_index=7;
          }
         if(scan_key1==0&scan_key2==0)
          {
           P0=0xff;
          }
         if(step1==1&step2==0)
          {
            speed=speed-100;
                if(speed<1000|speed==1000)                                  
                { speed=1000;                                                          

                }
          }
          if(step1==0&step2==1)
          {
            speed=speed+100;                              
                if(speed>2500|speed==2500)                          
                 { speed=2500;                                                  

                 }
                  }
          }
}

//***************************************************
//*************************        延时子程序**************
//**************************************************
void delay(ui time)                                    ///延时程序
{ for (count1=0;count1<time;count1++ )                        //此处可以用中断进行准确定时。我只是瞎定了几个参数
  for(count2=0;count2<3;count2++);
}
//*********************************************************
//******************按键处理程序****************************
//************************************************************
void key(void) interrupt 2
{
  uc i;
  for(i=0;i<200;i++);                                                   //延时防抖
  if(P3_3==0)                                                       
   {
    butter=~P1;
    switch(butter)
         {case 0x01:    scan_key1=1;scan_key2=0; break;        //正常运行 ,用两个数字进行选择,是不错的办法
          case 0x02:    scan_key1=0;scan_key2=0;break;        //停止
          case 0x04:    scan_key1=0 ;scan_key2=1; break;      // 正转
          case 0x08:    step1=1;step2=0;break;               //减速
          case 0x10:    step1=0;step2=1;break;              // 加速
          default :                     ;                             //其它值返回
         }
   }
   P1=0XFF;
}
//**************************************************
//**********************转步************************
//**************************************************
void ground(step_index)         //转步
{
switch(step_index)
   {
     case 0://0            //
      P0_0 = 1;                   //
      P0_1 = 0;                   //
      P0_2 = 0;
      P0_3 = 0;
      break;
          case 1://0,1  
      P0_0 = 1;
      P0_1 = 1;
      P0_2 = 0;
      P0_3 = 0;
      break;
          case 2://1
      P0_0 = 0;
      P0_1 = 1;
      P0_2 = 0;
      P0_3 = 0;
      break;
          case 3://1,2
      P0_0 = 0;
      P0_1 = 1;
      P0_2 = 1;
      P0_3 = 0;
      break;
          case 4://2
      P0_0 = 0;
      P0_1 = 0;
      P0_2 = 1;
      P0_3 = 0;
      break;
          case 5://2,3
      P0_0 = 0;
      P0_1 = 0;
      P0_2 = 1;
      P0_3 = 1;
      break;
          case 6://3
      P0_0 = 0;
      P0_1 = 0;
      P0_2 = 0;
      P0_3 = 1;
      break;
          case 7://3,0
      P0_0 = 0;
      P0_1 = 0;
      P0_2 = 0;
      P0_3 = 1;
  }       
}
源程序
fafafafather
4楼-- · 2019-03-25 12:43
 精彩回答 2  元偷偷看……
Li_Lei
5楼-- · 2019-03-25 13:19
震动可能是相位顺序不对
fafafafather
6楼-- · 2019-03-25 17:32
huo_hu 发表于 2014-5-4 17:04
震动可能是相位顺序不对

是对的~。~两相是黑绿红蓝,不过只是轴轻微震动,而电机里面转子好像也在转,但轴爱上保持初始力矩不动,请问程序上要怎么改?最后转步的程序貌似是根据相位来的,是直接删掉然后就可以了吗??小白求教导

一周热门 更多>