找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8600|回复: 8
打印 上一主题 下一主题
收起左侧

a4988驱动二相四线电机,用51怎么控制step和dir来使电机运动

[复制链接]
跳转到指定楼层
楼主
ID:94832 发表于 2015-11-6 00:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
rt,求各位帮一下,最近在用51做雕刻机。。没想到一上来就被a4988给弄的。。。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:231918 发表于 2017-10-11 21:05 | 只看该作者
居然就是个没有后续节目的帖子
回复

使用道具 举报

板凳
ID:229992 发表于 2018-1-22 10:06 | 只看该作者
/***************************************************************
* 实 验 名 :步进电机实验
* 实验说明 :电机启动、停止、正转、反转
* 实验平台 :51单片机开发板
* 连接方式 :pulse接P10  DIR接P11 KYE1接P20 KYE2接P21 KYE3接P22 KYE4接P23 ENABLE接P12 MS1-3接P13-P14
* 注    意 :本例程使用了中断定时器,中断介绍会在下一实验中说明
****************************************************************************/

#include <reg52.h>
#include <intrins.h>

#define FOSC 11059200L //晶振设置,默认使用11.0592M Hz
//#define FOSC 12000000L //晶振设置,使用12M Hz
//#define FOSC 24000000L //晶振设置,使用24M Hz

#define TIME_MS 1 //设定定时时间 ms ,在11.0592M晶振下,不易超过60ms





//IO接口定义
sbit pulse = P1^0;//脉冲信号
sbit Dir   = P1^1; //正反转

sbit EN    = P1^2;
sbit MS1   = P1^3;
sbit MS2   = P1^4;
sbit MS3   = P1^5;



sbit KEY1 = P2^0;  //启动
sbit KEY2 = P2^1;  //停止
sbit KEY3 = P2^2;  //正转
sbit KEY4 = P2^3;  //反转


//全局变量定义
unsigned char count=0;

/*******************************************************************************
* 函 数 名 :Delayms
* 函数功能 :实现 ms级的延时
* 输    入 :ms
* 输    出 :无
*******************************************************************************/
void Delayms(unsigned int ms)
{
        unsigned int i,j;
        for(i=0;i<ms;i++)
        #if FOSC == 11059200L
                for(j=0;j<114;j++);
        #elif FOSC == 12000000L
          for(j=0;j<123;j++);
        #elif FOSC == 24000000L
                for(j=0;j<249;j++);
        #else
                for(j=0;j<114;j++);
        #endif
}

/*******************************************************************************
* 函 数 名 :Timer0Init
* 函数功能 :定时器0初始化
* 输    入 :无
* 输    出 :无
*******************************************************************************/
void Timer0Init()
{
        TMOD=0x01; //设置定时器0工作方式为1
        TH0=(65536-FOSC/12/1000*TIME_MS)/256;
        TL0=(65536-FOSC/12/1000*TIME_MS)%256;
        ET0=1; //开启定时器0中断
//        TR0=1;        //开启定时器       
        EA=1;  //打开总中断
}


/*******************************************************************************
* 函 数 名 :main
* 函数功能 :主函数
* 输    入 :无
* 输    出 :无
*******************************************************************************/
void main()
{
        Timer0Init();
        EN=0;
        MS1=0;
        MS2=0;
        MS3=0;
        while(1)
        {
  if(KEY1==0)  //判断是否按下键盘
        {
                Delayms(10); //延时,软件去干扰
                if(KEY1==0)   //确认按键按下
                {
      TR0=1;
                }
                while(KEY1==0);//按键锁定,每按一次count只加1.
        }
        if(KEY2==0)  //判断是否按下键盘
        {
                Delayms(10); //延时,软件去干扰
                if(KEY2==0)   //确认按键按下
                {
      TR0=0;
                }
                while(KEY2==0);//按键锁定,每按一次count只加1.
        }       
       
        if(KEY3==0)  //判断是否按下键盘
        {
                Delayms(10); //延时,软件去干扰
                if(KEY3==0)   //确认按键按下
                {
      Dir=0;
                }
                while(KEY3==0);//按键锁定,每按一次count只加1.
        }       
       
                if(KEY4==0)  //判断是否按下键盘
        {
                Delayms(10); //延时,软件去干扰
                if(KEY4==0)   //确认按键按下
                {
      Dir=1;
                }
                while(KEY4==0);//按键锁定,每按一次count只加1.
        }       
       
       
        }
}

/*******************************************************************************
* 函 数 名 :Timer0Int
* 函数功能 :定时器0中断函数 , 每隔TIME_MS ms进入
* 输    入 :无
* 输    出 :无
*******************************************************************************/
void Timer0Int() interrupt 1
{
        TH0=(65536-FOSC/12/1000*TIME_MS)/256;
        TL0=(65536-FOSC/12/1000*TIME_MS)%256;
        count++;
        if(count == 2)//1s
        {
                pulse = !pulse;//LED灯闪烁
                count = 0;
        }
}

回复

使用道具 举报

地板
ID:229992 发表于 2018-1-22 10:07 | 只看该作者
这个是一个大神的测试程序,你可以参照一下
回复

使用道具 举报

5#
ID:321799 发表于 2018-5-10 11:22 | 只看该作者
你行你叫满昊啊 发表于 2018-1-22 10:06
/***************************************************************
* 实 验 名 :步进电机实验
* 实验 ...

你好,你有电路图吗
回复

使用道具 举报

6#
ID:469480 发表于 2019-1-17 08:55 | 只看该作者
百度找的
/*-----------------------------------------------  
  名称:步进电机  
------------------------------------------------*/   
   
#include <reg52.h>   
   
sbit step=P1^0;        //步进脉冲,一个正脉冲就转一个步距角   
sbit dir=P1^1;        //1为正转,0为反转。   
sbit sleep=P1^2;   
sbit res=P1^3;   
unsigned char sum=0;   
   
/********************毫秒延时函数***************************/   
void Delay(unsigned int xms)   
{   
    unsigned int i,j;   
    for(i=xms;i>0;i--)   
        for(j=110;j>0;j--);   
}   
   
void ISR_Key(void) interrupt 2  //外部中断1   
{   
  Delay(20);   
  sum++;   
  if(sum==1)   
  {   
    dir=~dir;   
   }   
  if(sum==1) sum=0;   
   
}   
/******************************************************************/   
/*                   主函数                                       */   
/******************************************************************/   
main()   
{   
   
  dir=1;         //正转   
  sleep=1;       //休眠无效   
  res=1;         //复位无效   
  step=1;           
   
  EX1=1;         //外部中断1开   
  IT1=1;         //边沿触发   
  EA=1;          //全局中断开   
   
while(1)               
{   
     step=~step;     //输出脉冲   
     Delay(2);       //需要延时,不延时电机不动,延时太久也不动。改变这个参数可以调整电机转速 ,数字越小,转速越大。   
      
}   
}   
   
回复

使用道具 举报

7#
ID:469525 发表于 2019-1-17 19:55 | 只看该作者
正常歩进电机的频率为500HZ,每8步为1循环,具体请看附件(附件为四相八拍的歩进电机)

28BYJ-48步进电机.doc

271.5 KB, 下载次数: 47

回复

使用道具 举报

8#
ID:288090 发表于 2019-1-17 20:49 | 只看该作者
dir用高低电平表示方向,step用PWM输出控制,可控制转速
回复

使用道具 举报

9#
ID:501098 发表于 2019-6-19 17:01 | 只看该作者
你行你叫满昊啊 发表于 2018-1-22 10:07
这个是一个大神的测试程序,你可以参照一下

这也不好用啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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