标题:
51单片机与Arduino A4988步进电机驱动模块源程序
[打印本页]
作者:
chang199202
时间:
2021-10-5 03:49
标题:
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交换。
单片机源程序如下:
/***************************************************************
* 实 验 名 :步进电机实验
* 实验说明 :电机启动、停止、正转、反转
* 实验平台 :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 = P3^3; //启动
sbit KEY2 = P3^4; //停止
sbit KEY3 = P3^5; //正转
sbit KEY4 = P3^6; //反转
//全局变量定义
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; //打开总中断
/*///8*/
void Timer0Int() interrupt 1
{ TH0=(65536-FOSC/12/1000*8/10)/256;
TL0=(65536-FOSC/12/1000*8/10)%256;
//count++;
//if(count == 2)//1s
//{
pulse = ~pulse;//LED灯闪烁
//count = 0;
//}
}
/*******************************************************************************
* 函 数 名 :main
* 函数功能 :主函数
* 输 入 :无
* 输 出 :无
*******************************************************************************/
void main()
{
//Timer0Init();
EN=0;
MS1=0;
MS2=0;
MS3=0;
Dir=1;
TMOD=0x01;//定时器0 16位工作方式
TR0=1; //启动定时器0
ET0=1; //打开定时器中断
EA=1; //打开总中断
while(1);
}
/******************************************************************************** 函 数 名 :Timer0Int
* 函数功能 :定时器0中断函数 , 每隔TIME_MS ms进入
* 输 入 :无
* 输 出 :无
*******************************************************************************/
复制代码
51hei.png
(2.92 KB, 下载次数: 70)
下载附件
2021-10-5 04:09 上传
以上程序下载(内容和本网页上的一模一样,方便保存):
a4988a.7z
(2.65 KB, 下载次数: 64)
2021-10-5 03:47 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
hzxyy
时间:
2024-2-25 21:06
A49882.C 中代码缺失了一部分
作者:
LLower
时间:
2025-6-5 13:39
PWM设置翻转的频率好像不能太高,有时候会影响到输出的PWM波形
作者:
人若依
时间:
2025-6-5 20:44
学习一下!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1