社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 1253|回复: 8

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

[复制链接]

13

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2014-5-4 16:45:09 | 显示全部楼层 |阅读模式
我有一个uln2003A控制的四相步进电机,现在我打算用驱动器控制一个24V的两相步进电机,程序应该怎么改
此帖出自51单片机论坛


回复

使用道具 举报

5196

TA的帖子

454

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

发表于 2014-5-4 16:47:44 | 显示全部楼层
两相  是不是要用双桥来驱动,A,B绕组好些呢?

点评

我已经按照电路图做了PCB板了,不想改了,我自己也改了下程序,但是只是不停震动不转,究竟是怎么回事,P0.0-P0.3哪两个口是输出方向的啊??求教  详情 回复 发表于 2014-5-4 16:55


回复

使用道具 举报

13

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2014-5-4 16:47:50 | 显示全部楼层
file:///C:\Documents and Settings\Administrator\Application Data\Tencent\Users\448031894\QQ\WinTemp\RichOle\BV`9EYMV8Z4I7G~1}(GNRUT.jpgfile:///C:\Documents and Settings\Administrator\Application Data\Tencent\Users\448031894\QQ\WinTemp\RichOle\BV`9EYMV8Z4I7G~1}(GNRUT.jpg

原理图

原理图


回复

使用道具 举报

13

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2014-5-4 16:49:07 | 显示全部楼层
#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;
  }       
}
源程序


回复

使用道具 举报

13

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2014-5-4 16:55:45 | 显示全部楼层
蓝雨夜 发表于 2014-5-4 16:47
两相  是不是要用双桥来驱动,A,B绕组好些呢?

我已经按照电路图做了PCB板了,不想改了,我自己也改了下程序,但是只是不停震动不转,究竟是怎么回事,P0.0-P0.3哪两个口是输出方向的啊??求教


回复

使用道具 举报

2856

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2014-5-4 17:04:02 | 显示全部楼层
震动可能是相位顺序不对

点评

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


回复

使用道具 举报

13

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2014-5-4 19:48:21 | 显示全部楼层
huo_hu 发表于 2014-5-4 17:04
震动可能是相位顺序不对

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


回复

使用道具 举报

2856

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2014-5-4 21:44:38 | 显示全部楼层
走慢点验证一下1c2c3c4c点电平的顺序

点评

...我知道为什么转不到了,因为我是驱动24V的电机用驱动器,如果用共阳极接法,1.3连VCC,两口常1,当按下反转键时,1-3变0反转,可是程序应该怎么改呢??  详情 回复 发表于 2014-5-5 01:13


回复

使用道具 举报

13

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2014-5-5 01:13:08 | 显示全部楼层
huo_hu 发表于 2014-5-4 21:44
走慢点验证一下1c2c3c4c点电平的顺序

...我知道为什么转不到了,因为我是驱动24V的电机用驱动器,如果用共阳极接法,1.3连VCC,两口常1,当按下反转键时,1-3变0反转,可是程序应该怎么改呢??


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2017-11-20 17:28 , Processed in 0.472309 second(s), 26 queries , Redis On.

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