毕设系列之 — 教程:单片机控制步进电机

毕设系列之 — 教程:单片机控制步进电机文章目录1简介2步进电机介绍3A4988驱动介绍4电机启动代码5最后1简介Hi,大家好,这里是丹成学长,今天向大家介绍如何使用单片机控制步进电机大家可用于课程设计或毕业设计技术解答毕设帮助:<Q>7468760412步进电机介绍步进电机是一种将电脉冲转化为角位移的执行机构。通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(即步进角),多用于雕刻机、3D打印机等需要精确控制的设备。本篇使用ULN2003驱动五线四相减速

大家好,又见面了,我是你们的朋友全栈君。


1 简介

Hi,大家好,这里是丹成学长,今天向大家介绍如何使用单片机控制步进电机

大家可用于 课程设计 或 毕业设计

技术解答
毕设帮助:<Q>746876041

2 步进电机介绍

步进电机是一种将电脉冲转化为角位移的执行机构。通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(即步进角),多用于雕刻机、3D打印机等需要精确控制的设备。本篇使用ULN2003驱动五线四相减速步进电机。

在这里插入图片描述

  • 步进电机每次能转动的最小角度叫做步距角。
  • 每当步进电机接收到一个驱动信号后,步进电机将按照一定的方向转动一个固定的角度。
  • 通过控制脉冲的个数来精确的控制步进电机的角位移量,通过控制脉冲的频率来控制电机转动的速度及加速度,从而达到调速的目的。
  • 步进电机按照相数不同分为单相、双相、多相三种,励磁方式分为1相励磁方式和2相励磁方式。
  • 本文使用的步进电机型号为28BYJ-48,1相励磁方式驱动,通过给ABCD四相依次通电来实现转自不停转动。

3 A4988驱动介绍

由于一般的开发板的通用IO驱动能力有限,有些外设不能直接使用IO进行驱动,需要借助一些驱动电路间接控制大功率器件。A4988是大电流驱动阵列,多用于单片机、智能仪表、PLC、数字量输出卡等控制电路中,可直接驱动继电器等负载。

在这里插入图片描述

在这里插入图片描述

4 电机启动代码

#include "a4988.h"
#include "delay.h"

/* STEP1 PDout(15) SDIR1 PGout(2) STEP2 PDout(14) SDIR2 PGout(3) STEP3 PDout(13) SDIR3 PGout(4) STEP4 PDout(12) SDIR4 PGout(5) MSTEP PDout(15) //固定芯片步进STEP MDIR PGout(2) //固定芯片步进DIR CSTEP PDout(14) //磁铁步进STEP CDIR PGout(3) //磁铁步进DIR RSTEP PDout(13) //蠕动泵STEP RDIR PGout(4) //蠕动泵DIR USTEP PDout(12) //超声步进电机STEP UDIR PGout(5) //超声步进电机DIR */

//方向脚初始化
void Step_DIR_Init(void)
{ 
   
 GPIO_InitTypeDef  GPIO_InitStructure;
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);   //使能PG端口时钟
    
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;  //端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       //IO口速度为50MHz
 GPIO_Init(GPIOG, &GPIO_InitStructure);                  //根据设定参数初始化
 GPIO_SetBits(GPIOG,GPIO_Pin_2);                         
 GPIO_SetBits(GPIOG,GPIO_Pin_3);    
 GPIO_SetBits(GPIOG,GPIO_Pin_4);        
 GPIO_SetBits(GPIOG,GPIO_Pin_5);    
}

//脉冲初始化,公用定时器4,重映射,4路频率会被一起改变
void Step_Pulse_Init(u16 arr,u16 psc)
{ 
   
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);    //使能定时器4时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
    
    GPIO_PinRemapConfig(GPIO_Remap_TIM4, ENABLE); //Timer4重映射 
    
   //设置该引脚为复用输出功能,输出TIM4的PWM脉冲波形
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; //TIM_CH4
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化GPIO
    
    //!!!!!配置完复用功能后,此时输出为低电平,似乎难以修改
    
   //初始化TIM4
    TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 
    TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

    //初始化TIM4 Channel_1234 PWM模式 
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
    //TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable; //关闭比较输出使能
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
    
    TIM_OC1Init(TIM4, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM4 OC1
    //TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4在CCR1上的预装载寄存器
    
    TIM_OC2Init(TIM4, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM4 OC2
    //TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4在CCR2上的预装载寄存器
    
    TIM_OC3Init(TIM4, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM4 OC3
    //TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4在CCR3上的预装载寄存器
    
    TIM_OC4Init(TIM4, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM4 OC4
    //TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4在CCR4上的预装载寄存器
 
    TIM_CCxCmd(TIM4,TIM_Channel_1,TIM_CCx_Disable);//关闭TIM4通道1
    TIM_CCxCmd(TIM4,TIM_Channel_2,TIM_CCx_Disable);//关闭TIM4通道2
    TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Disable);//关闭TIM4通道3
    TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Disable);//关闭TIM4通道4
    
    TIM_Cmd(TIM4, DISABLE);  //先不使能TIM4 
}



//芯片电机运动
void Mstep_move(u8 dir,u16 frequency)
{ 
   
    MDIR = dir;     
    Step_Pulse_Init((u16)(100000/frequency-1),719);
    TIM_SetCompare4(TIM4,(u16)(50000/frequency));
    TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Enable);//开启TIM4通道4
    TIM_Cmd(TIM4, ENABLE);//必须放在最后使能

}
//芯片电机停止
void Mstep_stop(void)
{ 
      
    TIM_SetCompare4(TIM4,0);    
    TIM_CCxCmd(TIM4,TIM_Channel_1,TIM_CCx_Disable);//关闭TIM4通道1
    TIM_CCxCmd(TIM4,TIM_Channel_2,TIM_CCx_Disable);//关闭TIM4通道2
    TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Disable);//关闭TIM4通道3
    TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Disable);//关闭TIM4通道4
    TIM_Cmd(TIM4, DISABLE);
}


//磁铁电机运动
void Cstep_move(u8 dir,u16 frequency)
{ 
   
    CDIR = dir;     
    Step_Pulse_Init((u16)(100000/frequency-1),719);
    TIM_SetCompare3(TIM4,(u16)(50000/frequency));
    TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Enable);//开启TIM4通道3
    TIM_Cmd(TIM4, ENABLE);//必须放在最后使能

}
//磁铁电机停止
void Cstep_stop(void)
{ 
      
    TIM_SetCompare3(TIM4,0);
    TIM_CCxCmd(TIM4,TIM_Channel_1,TIM_CCx_Disable);//关闭TIM4通道1
    TIM_CCxCmd(TIM4,TIM_Channel_2,TIM_CCx_Disable);//关闭TIM4通道2
    TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Disable);//关闭TIM4通道3
    TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Disable);//关闭TIM4通道4
    TIM_Cmd(TIM4, DISABLE);
}

//超声电机运动
void Ustep_move(u8 dir,u16 frequency)
{ 
   
    UDIR = dir;     
    Step_Pulse_Init((u16)(100000/frequency-1),719);
    TIM_SetCompare1(TIM4,(u16)(50000/frequency));
    TIM_CCxCmd(TIM4,TIM_Channel_1,TIM_CCx_Enable);//开启TIM4通道1
    TIM_Cmd(TIM4, ENABLE);//必须放在最后使能

}
//超声电机停止
void Ustep_stop(void)
{ 
      
    TIM_SetCompare1(TIM4,0);
    TIM_CCxCmd(TIM4,TIM_Channel_1,TIM_CCx_Disable);//关闭TIM4通道1
    TIM_CCxCmd(TIM4,TIM_Channel_2,TIM_CCx_Disable);//关闭TIM4通道2
    TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Disable);//关闭TIM4通道3
    TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Disable);//关闭TIM4通道4
    TIM_Cmd(TIM4, DISABLE);//USTEP会随波形停在高或低
}

//蠕动泵抽取
void Rstep_move(u8 dir,u16 frequency)
{ 
   
    RDIR = dir;     
    Step_Pulse_Init((u16)(100000/frequency-1),719);
    TIM_SetCompare2(TIM4,(u16)(50000/frequency));
    TIM_CCxCmd(TIM4,TIM_Channel_2,TIM_CCx_Enable);//开启TIM4通道2
    TIM_Cmd(TIM4, ENABLE);//必须放在最后使能

}
//蠕动泵停止
void Rstep_stop(void)
{ 
      
    TIM_SetCompare2(TIM4,0);
    TIM_CCxCmd(TIM4,TIM_Channel_1,TIM_CCx_Disable);//关闭TIM4通道1
    TIM_CCxCmd(TIM4,TIM_Channel_2,TIM_CCx_Disable);//关闭TIM4通道2
    TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Disable);//关闭TIM4通道3
    TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Disable);//关闭TIM4通道4
    TIM_Cmd(TIM4, DISABLE);//RSTEP会随波形停在高或低
}

5 最后

技术解答
毕设帮助:<Q>746876041

单片机毕设项目大全:
https://blog.csdn.net/huawei123444/article/details/119822845

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/138449.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • QQ机器人女友(手机制作qq机器人)

    目录前言具体实现1、定时发送信息2、让机器人陪女朋友聊天3、调用一些有趣的接口健康填报小助手开发中。。。写在最后前言上一篇文章介绍了怎么配置机器人框架,并且实现了一些简单的功能。(发送私聊或者群聊信息、接收上报的事件、简单的自动回复等等)这次为了让QQ机器人更加智能,调用了一些实用的接口。通过自己搭建的机器人实现定时叫女朋友起床、和女朋友聊天等功能。如上图所示,我的机器人每天都会准时叫女朋友起床;并且在我忙的时候然而女朋友无聊的时候可以陪她聊一会天。具体实现以下实现的功能都需要机器人已经配置完

    2022年4月17日
    187
  • 成功解决pycharm 没有菜单栏「建议收藏」

    成功解决pycharm 没有菜单栏「建议收藏」成功解决pycharm没有菜单栏目录解决问题解决方法解决问题解决pycharm没有菜单栏解决方法首先,按Ctrl+Shift+A打开界面,切换到“Action”栏,输入“Experimentalfeatures”,点击回车,其次,取消linux.native.menu复选框,应用,最后,重启PyCharm即可!…

    2022年8月28日
    15
  • mysql sql常用语句大全「建议收藏」

    mysql sql常用语句大全「建议收藏」一、常用操作数据库的命令1.showdatabases;查看所有的数据库2.createdatabasetest;创建一个叫test的数据库3.dropdatabasetest;删除一个叫test的数据库4.usetest;选中库,在建表之前必须要选择数据库5.showtables;在选中的数据库之中查看所有的表6.createtable表名(字段1…

    2022年4月29日
    57
  • 腾讯云域名如何绑定ip地址

    腾讯云域名如何绑定ip地址域名解析的前提是首先要拥有一个域名 如何把你的域名绑定你的公网 ip 这就需要域名解析 云服务有提供云解析的功能 本文是通过腾讯云操作讲解如何绑定域名 官网域名绑定教程 腾讯云如何绑定域名 腾讯云域名如何绑定 ip 进入控制台 gt 总览 gt 云解析 2 这里需要做进一步的设置 比如 在更多选项卡中 开启 CNAME 加速 开启搜索引擎推送等 3 接着点击解析选项 进入添加记录的控

    2025年12月16日
    2
  • MySQL安装(详细,适合小白)

    MySQL安装(详细,适合小白)MySQL安装一、mysql安装包下载二、配置my.ini文件三、初始化MySQL四、可能遇到的错误操作一、mysql安装包下载官网下载地址:mysql安装包下载如图所示:二、配置my.ini文件解压后的文件尽量不要放在C盘(内存小),解压后如下图所示在上图所示梗目录下配置my.ini文件[mysqld]#设置3306端口port=3306[mysqld]#设置3306端口port=3306#设置mysql的安装目录(存放地址可以更改)basedir=E:\My

    2022年6月6日
    41
  • java单例指令重排_java实现数组去重

    java单例指令重排_java实现数组去重java指令重排案例。

    2022年10月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号