使用硬件型号为:STM32F103C8T6最小系统板、A4988模块、42步进电机(42BYGH39)

1.1 A4988介绍


引脚 功能说明 接线
EN 使能端,低电平有效 接GND或单片机IOx1
MS1/2/3 步进模式选择 不接或单片机IOx3
SLP 休眠,高电平有效 短接RST
STEP 输入脉冲,一个脉冲转一下 单片机IOx1
DIR 方向位,0/1各代表一方向 单片机IOx1
VMOT/GND 电源接口,直流供电8~35V,最大2A 12/24V电源
1A/1B/2A/2B 步进电机接线 步进电机
VDD/GND 接单片机3.3V和GND 单片机电源

1.2 接线方式

STM32与USB转TTL

STM32 USB转TTL
3.3V/5V 3.3/5V
GND GND
PA9 RXD
PA10 TXD

STM32与A4988

STM32 A4988
3.3V/5V VDD
GND GND
PB6 STEP(motor.h定义)
PB7 DIR (motor.h定义)
EN接GND
SLP接RST

A4988与步进电机

A4988 步进电机
VMOT 12V电源+
GND 12V电源-
B2 B-
A2 B+
A1 A+
B1 A-

需要注意步进电机接线相序

A4988标注的1A、1B、2A、2B,数字代表相、ab代表正负。

步进电机标注的A+、A-、B+、B-,其中AB代表相,±代表正负。

因此接线对应方式应该是:A+和A-对应1A和1B、B+和B-对应2A和2B。比如我的步进电机为黑色A+、绿色A-、红色B+、蓝色B-,那么对应A4988的B2 A2 A1 B1,电机接线顺序就是B- B+ A+ A-(蓝-红-黑-绿)。

如果接错可能会出现电机反转,或只振动不旋转的现象。

1.2 程序设计

本程序为串口控制步进电机,改编自开发板的串口例程,另外编写了步进电机的驱动函数。

GPIO中间的延时表示速度,delay_ms(2)约0.8s每圈,delay_ms(1)约0.4s每圈。

默认情况下(全步进)一个STEP脉冲步进电机转90°。

//motor.h
#ifndef __MOTOR_H
#define __MOTOR_H
#include "delay.h"//PF0-7,12-15#define Motor_GPIO GPIOF               //PF
#define Motor_RCC RCC_APB2Periph_GPIOF
//第一个步进电机A4988的接线
#define Motor1_STEP GPIO_Pin_1  //STEP - PF1
#define Motor1_DIR  GPIO_Pin_2  //DIR  - PF2
//第二个步进电机A4988的接线   //PB
#define Motor2_STEP GPIO_Pin_3  //STEP - PF3
#define Motor2_DIR  GPIO_Pin_4  //DIR  - PF4void MOTOR_Init(void);
void motor(unsigned int motor1_dir, unsigned int motor1_step, unsigned int motor2_dir, unsigned int motor2_step);#endif
//motor.c
#include "motor.h"
/*GPIO_motornum和GPIOx用于选择电机,GPIO_direction用于选择电机方向,dir:0为逆1为正,k为90°的倍数*/
// GPIOvoid MOTOR_Init()
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(Motor_RCC,ENABLE);//Motor初始化GPIO_InitStructure.GPIO_Pin = Motor1_STEP|Motor1_DIR|Motor2_STEP|Motor2_DIR;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(Motor_GPIO,&GPIO_InitStructure);    // 初始化GPIOBGPIO_ResetBits(Motor_GPIO,Motor1_STEP);          //初始化GPIOB_6输出低电平GPIO_ResetBits(Motor_GPIO,Motor1_DIR);         //初始化GPIOB_7输出低电平GPIO_ResetBits(Motor_GPIO,Motor2_STEP);            //初始化GPIOB_8输出低电平GPIO_ResetBits(Motor_GPIO,Motor2_DIR);         //初始化GPIOB_9输出低电平
}void motor(unsigned int motor1_dir, unsigned int motor1_step, unsigned int motor2_dir, unsigned int motor2_step)
{unsigned int i;switch(motor1_dir){case 0 : GPIO_SetBits(Motor_GPIO,Motor1_DIR); break; case 1 : GPIO_ResetBits(Motor_GPIO,Motor1_DIR); break; default : break; }switch(motor2_dir){case 0 : GPIO_SetBits(Motor_GPIO,Motor2_DIR); break; case 1 : GPIO_ResetBits(Motor_GPIO,Motor2_DIR); break; default : break; }/*GPIO_SetBits(Motor_GPIO,Motor1_STEP);GPIO_SetBits(Motor_GPIO,Motor2_STEP);delay_ms(2);                                  //周期1.3msGPIO_ResetBits(Motor_GPIO,Motor1_STEP);GPIO_ResetBits(Motor_GPIO,Motor2_STEP);delay_ms(2);*/for(i = 0;i < motor1_step || i < motor2_step; i++){if(i<motor1_step){GPIO_SetBits(Motor_GPIO,Motor1_STEP);delay_ms(2);                                 //周期1.3msGPIO_ResetBits(Motor_GPIO,Motor1_STEP);delay_ms(2);}if(i<motor2_step){GPIO_SetBits(Motor_GPIO,Motor2_STEP);delay_ms(2);                                 //周期1.3msGPIO_ResetBits(Motor_GPIO,Motor2_STEP);delay_ms(2);}}//delay_ms(2);                    //延时一会
}
//main.c
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "mbotLinuxUsart.h"//引用该头文件是使用,通信协议的前提
#include "motor.h"#define IMAGE_WIDTH     640/2
#define IMAGE_HEIGHT    480/2//测试发送变量
short testSend1   =1111;
short testSend2   =2222;
short testSend3   =3333;
unsigned char testSend4 = 0x05;//测试接收变量
int testRece1     =400;
int testRece2     =300;
unsigned char testRece3 = 0x00;int main(void)
{
//=======================================变量定义=====================================================u8 dir1;u8 dir2;u16 step1;u16 step2;
//======================================硬件初始化====================================================delay_init();                                    //延时函数初始化   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组2uart_init(115200);                              //串口初始化为115200MOTOR_Init();              //初始化A4988驱动//=======================================循环程序=====================================================while(1){//将需要发送到ROS的数据,从该函数发出,前三个数据范围(-32768 - +32767),第四个数据的范围(0 - 255)usartSendData(testSend1,testSend2,testSend3,testSend4);if(testRece1>IMAGE_WIDTH){dir1=1;step1=testRece1-IMAGE_WIDTH;}else{dir1=0;step1=IMAGE_WIDTH-testRece1;}if(testRece2>IMAGE_HEIGHT){dir2=0;step2=testRece2-IMAGE_HEIGHT;}else{dir2=1;step2=IMAGE_HEIGHT-testRece2;}motor(dir1,step1,dir2,step2);//必须的延时delay_ms(13);}
}//====================================串口中断服务程序=================================================
void USART1_IRQHandler()
{if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){USART_ClearITPendingBit(USART1,USART_IT_RXNE);//首先清除中断标志位//从ROS接收到的数据,存放到下面三个变量中usartReceiveOneData(&testRece1,&testRece2,&testRece3);}
}
//===========================================END=======================================================

1.3 实验

STM32从ROS系统获取图像中的目标中心坐标。
receiveData1存放目标x值,receiveData2存放目标y值。

由于ROS系统持续发送坐标值,因此STM32实时接受数据进行控制。A4988采用16细分,每次驱动(50循环)步进5.625°,即每个循环0.1°,可考虑根据目标偏移程度设置每次指令步进大小。例如每差1坐标,每次指令加一个循环0.1°。

本博客文章首先发布于个人博客:https://www.mahaofei.com/,欢迎大家访问。

STM32+A4988控制步进电机相关推荐

  1. STM32+TB6600控制步进电机调节转速

    1.用到的元器件 STM32F103C8T6 42步进电机 TB6600电机驱动器 2.步进电机相关知识 通用42步进电机: 步距角 1.8° 步距角精度 ±5% 相数 2相 励磁方式 混合式 转子齿 ...

  2. 基于STM32之控制步进电机,学到即赚到!(含主代码)

    目录 前言 一.关于步进电机那点事 二.接线问题 三.主要代码 四.总结 前言 最近发现电机类的步进电机挺有趣的,于是趁快开学了有空再码一篇,分享一下自己的学习心得,有哪里写的不好欢迎随时指正. 一. ...

  3. K_A07_001 基于 STM32等单片机驱动A4988模块按键控制步进电机正反转

    目录 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 SETP时序 对应程序: 细分说明 程序 四.部分代码说明 1.接线说明 1.1.STC89C52RC+A4988模块 1.2. ...

  4. K_A07_003 基于 STM32等单片机驱动DRV8825模块按键控制步进电机正反转

    目录 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 SETP时序 对应程序: 细分说明 程序 四.部分代码说明 1.接线说明 1.1.STC89C52RC+DRV8825模块 1. ...

  5. STM32控制步进电机:基于定时器中断的ULN2003驱动器/步进电机驱动程序

    STM32控制步进电机:基于定时器中断的ULN2003驱动器/步进电机驱动程序 一.ULN2003驱动器 1.工作原理 2.步距角以及一圈所需步数的计算 二.硬件连接 三.STM32F103定时器中断 ...

  6. 利用stm32控制步进电机 速度加速度控制

    因为想申请 CSDN 博客认证需要一定的粉丝量,而我写了五年博客才 700 多粉丝,本文开启关注才可阅读全文,很抱歉影响您的阅读体验 利用stm32控制步进电机 尝试用42系步进电机做倒立摆,总结步进 ...

  7. arduino通过CNC SHIELD(A4988)控制两个步进电机

    arduino通过CNC SHIELD(A4988)控制两个步进电机 目的 本例程使用arduino通过CNC SHIELD(A4988模块)控制两个步进电机运动 内容来源 修改太极创客关于Accel ...

  8. K_A07_005 基于 STM32等单片机驱动 DRV8833 模块按键控制步进电机正反转

    目录 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 步进电机驱动时序 对应程序: 四.部分代码说明 1.接线说明 1.1.STC89C52RC+DRV8833模块 1.2.STM3 ...

  9. 【C语言】STM32控制步进电机——一种S形加减速曲线的推导与实现

    目录 1 前言 2 理论分析 2.1 选择曲线 2.2 计算函数方程 2.3 单位分析 2.4 模拟验证 3 两种代码实现 3.1 速度与时间关系 3.1.1 原理 3.1.2 优点 3.1.3 缺点 ...

  10. STM32控制步进电机:工作原理及库函数(标准库) / HAL库控制程序(不定期更新)

    STM32控制步进电机:工作原理并附带库函数/HAL库程序 一.步进电机的基本工作原理 1.步进电机工作原理 2.混合式步进电机工作原理 二.步进电机参数解析(后续学习会继续补充此处内容

最新文章

  1. LeetCode: 105. Construct Binary Tree from Preorder and Inorder Traversal
  2. SpaceX「十一手」火箭创纪录,一天内两次升空,马斯克:飞100次才退役
  3. matlab 正在等待响应标头。可能服务器没有响应,或者 weboptions.Timeout,Expect:100-continue
  4. js变量提升_一道JS变量提升题
  5. java 观察者模式_图解Java设计模式之观察者模式
  6. 前端小demo——全选和全不选
  7. 软件测试,从零开始:测试新手入门必读
  8. 服务器mac地址变了怎办_获取服务器的IP地址和MAC地址
  9. u大师装iso系统linux,【iso怎么用u盘装系统】iso镜像怎么用u盘装_iso用u盘装系统-系统城...
  10. PHP开源旅游网站程序,PHP开源旅游网站源码下载
  11. Kafka下载安装及部署
  12. (转载)SPSS之聚类分析(图文+数据集)
  13. Java程序:停车场计费
  14. fiddler监控手机端https请求显示tunnel to ......443
  15. 进程间通信之---消息队列
  16. nodejs+exceljs百万数据导出
  17. verilog将100mhz分频为1hz_50m 分频器设计——50MHZ(含verilog程序)
  18. 佳能Canon imagePRESS C7010VP 打印机驱动
  19. 官方的ae cs4英文版下载 含注册机 汉化补丁提供在线视频安装教程
  20. Linux Crontab 定时任务

热门文章

  1. 使用win10远程控制ubuntu14.04(2)
  2. mysql5.6安装步骤详细_详解MySQL5.6安装步骤
  3. python-视频爬取到本地
  4. 无法启动此程序 因为计算机中丢失msvcr71.dll,msvcr71.dll丢失怎样修复?计算机中丢失msvcr71.dll的解决方法...
  5. vscode背景的更换_vscode自定义背景颜色
  6. 微信html5怎么制作,图文揭秘微信h5怎么制作-朋友圈微信H5页面制作方法
  7. python获取域名对应的ip_Python实现通过解析域名获取ip地址的方法分析
  8. chrome 插件tempermonkey
  9. Modelica技术特点及优势
  10. 服务器光纤存储系统,光纤存储服务器 配置