找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机与Arduino A4988步进电机驱动模块源程序

[复制链接]
跳转到指定楼层
楼主
本人小白,刚入坑单片机。手头正好有几个a4988驱动模块和51单片机。网上找了段代码,发现无法使用,电机抖动(与电机接线无关)。
用山寨逻辑分析仪测得脉冲宽度为4ms arduino脉宽为1.6ms。后改动少许代码,成功运行。删除了部分按钮功能,插电即转。注意电机线2a2b为一组,如有抖动尝试调换一组线即可。

一、介绍

该扩展板可用作雕刻机,3D打印机等的驱动扩展板,一共有4路步进电机驱动模块的插槽,(注意本板子不包含A4988步进电机驱动模块,需要可在本店另购),可驱动4路不进电机,而每一路步进电机都只需要2个IO口,也就是说,6个IO口就可以很好的管理3个步进电机,使用起来非常的方便,告别传统步进电机操作繁琐。

二、UNO与模块IO口对应关系介绍
步进电机的基本控制需要的引脚,其他引脚是在雕刻机,或3D打印机的时候才用到的,这里我们不作详解,IO对应如上图。

Arduino UNO----------------------扩展板
8 ------------------------ EN (步进电机驱动使能端,低电平有效)
7----------------------- Z.DIR(Z轴的方向控制)
6----------------------- Y.DIR(Y轴的方向控制)
5----------------------- X.DIR(X轴的方向控制)
4 ---------------------- Z.STEP(Z轴的步进控制)
3 ---------------------- Y.STEP(Y轴的步进控制)
2 ---------------------- X.STEP(X轴的步进控制)

//下面是简单的步进电机控制程序,
#define EN 8 //步进电机使能端,低电平有效
#define X_DIR 5 //X轴 步进电机方向控制
#define Y_DIR 6 //y轴 步进电机方向控制
#define Z_DIR 7 //z轴 步进电机方向控制
#define X_STP 2 //x轴 步进控制
#define Y_STP 3 //y轴 步进控制
#define Z_STP 4 //z轴 步进控制
/*

//函数:step 功能:控制步进电机方向,步数。

//参数:dir 方向控制, dirPin对应步进电机的DIR引脚,stepperPin 对应步进电机的step引脚, steps 步进的步数

//无返回值

*/

void step(boolean dir, byte dirPin, byte stepperPin, int steps)

{
digitalWrite(dirPin, dir);
delay(50);
for (int i = 0; i < steps; i++) {
digitalWrite(stepperPin, HIGH);
delayMicroseconds(800);
digitalWrite(stepperPin, LOW);
delayMicroseconds(800);
}
}

void setup(){//将步进电机用到的IO管脚设置成输出
pinMode(X_DIR, OUTPUT); pinMode(X_STP, OUTPUT);
pinMode(Y_DIR, OUTPUT); pinMode(Y_STP, OUTPUT);
pinMode(Z_DIR, OUTPUT); pinMode(Z_STP, OUTPUT);
pinMode(EN, OUTPUT);
digitalWrite(EN, LOW);
}

void loop(){
step(false, X_DIR, X_STP, 200); //X轴电机 反转1圈,200步为一圈
step(false, Y_DIR, Y_STP, 200); //y轴电机 反转1圈,200步为一圈
step(false, Z_DIR, Z_STP, 200); //z轴电机 反转1圈,200步为一圈
delay(1000);
step(true, X_DIR, X_STP, 200); //X轴电机 正转1圈,200步为一圈
step(true, Y_DIR, Y_STP, 200); //y轴电机 正转1圈,200步为一圈
step(true, Z_DIR, Z_STP, 200); //z轴电机 正转1圈,200步为一圈
delay(1000);
}


实验现象:步进电机反转一圈,停顿1秒,再正传一圈,如此循环。

值得注意的是:在接插A4988模块的时候注意不要插反,步进电机接线方式是:

2A ,2B 为一组(红,绿), 1A,1B为一组(蓝,黄)想改变方向,改变其中一组的位置即可,比如2A,与2B交换。
值得注意的是:在接插A4988模块的时候注意不要插反,步进电机接线方式是:

2A ,2B 为一组(红,绿), 1A,1B为一组(蓝,黄)想改变方向,改变其中一组的位置即可,比如2A,与2B交换。

单片机源程序如下:
  1. /***************************************************************
  2. * 实 验 名 :步进电机实验
  3. * 实验说明 :电机启动、停止、正转、反转
  4. * 实验平台 :51单片机开发板
  5. * 连接方式 :pulse接P10  DIR接P11 KYE1接P20 KYE2接P21 KYE3接P22 KYE4接P23 ENABLE接P12 MS1-3接P13-P14
  6. * 注    意 :本例程使用了中断定时器,中断介绍会在下一实验中说明
  7. ****************************************************************************/

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

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

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





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

  17. sbit EN    = P1^2;
  18. sbit MS1   = P1^3;
  19. sbit MS2   = P1^4;
  20. sbit MS3   = P1^5;



  21. sbit KEY1 = P3^3;  //启动
  22. sbit KEY2 = P3^4;  //停止
  23. sbit KEY3 = P3^5;  //正转
  24. sbit KEY4 = P3^6;  //反转


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

  27. /*******************************************************************************
  28. * 函 数 名 :Delayms
  29. * 函数功能 :实现 ms级的延时
  30. * 输    入 :ms
  31. * 输    出 :无
  32. *******************************************************************************/
  33. void Delayms(unsigned int ms)
  34. {
  35.         unsigned int i,j;
  36.         for(i=0;i<ms;i++)
  37.         #if FOSC == 11059200L
  38.                 for(j=0;j<114;j++);
  39.         #elif FOSC == 12000000L
  40.           for(j=0;j<123;j++);
  41.         #elif FOSC == 24000000L
  42.                 for(j=0;j<249;j++);
  43.         #else
  44.                 for(j=0;j<114;j++);
  45.         #endif
  46. }

  47. /*******************************************************************************
  48. * 函 数 名 :Timer0Init
  49. * 函数功能 :定时器0初始化
  50. * 输    入 :无
  51. * 输    出 :无
  52. *******************************************************************************/
  53. /*void Timer0Init()
  54. //{
  55.         TMOD=0x01; //设置定时器0工作方式为1
  56.         TH0=(65536-FOSC/12/1000*TIME_MS)/256;        TL0=(65536-FOSC/12/1000*TIME_MS)%256;
  57.         ET0=1; //开启定时器0中断
  58.         TR0=1;        //开启定时器        
  59.         EA=1;  //打开总中断
  60. /*///8*/
  61. void Timer0Int() interrupt 1
  62. {        TH0=(65536-FOSC/12/1000*8/10)/256;
  63.         TL0=(65536-FOSC/12/1000*8/10)%256;
  64.         //count++;
  65.         //if(count == 2)//1s
  66.         //{
  67.                 pulse = ~pulse;//LED灯闪烁
  68.                 //count = 0;
  69.         //}
  70. }

  71. /*******************************************************************************
  72. * 函 数 名 :main
  73. * 函数功能 :主函数
  74. * 输    入 :无
  75. * 输    出 :无
  76. *******************************************************************************/
  77. void main()
  78. {
  79.         //Timer0Init();
  80.         EN=0;
  81.         MS1=0;
  82.         MS2=0;
  83.         MS3=0;
  84.         Dir=1;
  85.         TMOD=0x01;//定时器0 16位工作方式
  86.         TR0=1;    //启动定时器0
  87.         ET0=1;    //打开定时器中断
  88.         EA=1;     //打开总中断
  89.         while(1);
  90.         
  91. }
  92. /******************************************************************************** 函 数 名 :Timer0Int
  93. * 函数功能 :定时器0中断函数 , 每隔TIME_MS ms进入
  94. * 输    入 :无
  95. * 输    出 :无
  96. *******************************************************************************/
复制代码


以上程序下载(内容和本网页上的一模一样,方便保存):
a4988a.7z (2.65 KB, 下载次数: 60)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:224003 发表于 2024-2-25 21:06 | 只看该作者
A49882.C 中代码缺失了一部分
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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