基于STM32的步进电机驱动设计

这篇具有很好参考价值的文章主要介绍了基于STM32的步进电机驱动设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


程序源码提取链接放置文章底部,自行提取即可。

前言

采用STM32驱动28BYJ4步进电机,实现正转反转,完成角度调整。步进电机是一种将电脉冲转化为角位移的执行机构。当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动------一个固定的角度(及步进角)。可以通过控制脉冲个来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。


一、步进电机

1. 基本概念

stm32步进电机驱动程序,STM32,stm32,单片机,嵌入式硬件,arm开发,物联网
步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机。每输入一个脉冲信号,转子就转动一个角度或前进一步,其输出的角位移或线位移与输入的脉冲数成正比,转速与脉冲频率成正比。因此,步进电动机又称脉冲电动机。

步进电机控制特点:

  1. 它是通过输入脉冲信号来进行控制的。
  2. 电机的总转动角度由输入脉冲数决定。
  3. 电机的转速由脉冲信号频率决定。

相数:产生不同对极N、S磁场的激磁线圈对数。常用m表示。

拍数:完成一个磁场周期性变化所需脉冲数或导电状态用n表示,或指电机转过一个齿距角所需脉冲数,以四相电机为例,有四相四拍运行方式即AB-BC-CD-DA-AB,四相八拍运行方式即A-AB-B-BC-C-CD-D-DA-A。

步距角:也叫步进角,对应一个脉冲信号,电机转子转过的角位移用0表示。0=360度/(转子齿数J运行拍数),以常规二、四相,转子齿为50齿电机为例。四拍运行时步距角为0=360度/(504) =1.8度(俗称整步),八拍运行时步距角为0=360度/(50*8)=0.9度(俗称半步)。

保持转矩:(HOLDING TORQUE)是指步进电机通电但没有转动时,定子锁住转子的力矩。它是步进电机最重要的参数之一,通常步进电机在低速时的力矩接近保持转矩。

空载启动频率:步进电机有一个技术参数:空载启动频率,即步进电机在空载情况下能够正常启动的脉冲频率,如果脉冲频率高于该值,电机不能正常启动,可能发生丢步或堵转。在有负载的情况下,启动频率应更低。如果要使电机达到高速转动,脉冲频率应该有加速过程,即启动频率较低,然后按一定加速度升到所希望的高频(电机转速从低速升到高速)。

2. 电机结构

stm32步进电机驱动程序,STM32,stm32,单片机,嵌入式硬件,arm开发,物联网
原理图:

stm32步进电机驱动程序,STM32,stm32,单片机,嵌入式硬件,arm开发,物联网

3. 工作原理

stm32步进电机驱动程序,STM32,stm32,单片机,嵌入式硬件,arm开发,物联网
驱动节拍模式:
stm32步进电机驱动程序,STM32,stm32,单片机,嵌入式硬件,arm开发,物联网

4. 产品参数

1. 技术参数
stm32步进电机驱动程序,STM32,stm32,单片机,嵌入式硬件,arm开发,物联网
2. 外形尺寸(单位mm)
stm32步进电机驱动程序,STM32,stm32,单片机,嵌入式硬件,arm开发,物联网

二、ULN2003驱动板

ULN2003是最常见的电机驱动器IC之一,由7对达林顿晶体管对的阵列组成,每对能够驱动高达500mA和50V的负载。该板上使用了七对中的四对。

stm32步进电机驱动程序,STM32,stm32,单片机,嵌入式硬件,arm开发,物联网

连接器:可以完美地匹配电动机的电线,这使得将电动机轻松连接到板上非常容易;还有用于四个控制输入的连接以及电源连接。

四个LED:在四根控制输入线上显示活动(以指示步进状态),它们在电机运行时提供良好的视觉效果。

ON / OFF跳线:用于隔离步进电机的电源。

引脚排列
stm32步进电机驱动程序,STM32,stm32,单片机,嵌入式硬件,arm开发,物联网
IN1 – IN4脚:用于驱动电动机。将它们连接到stm32上的数字输出引脚。

GND:是常见的接地引脚。

VCC:为电动机供电。将其连接到外部5V电源。由于电机消耗的功率过多,因此切勿使用Arduino的5V电源为步进电机供电。

马达接头:电机插入的地方。该连接器是带键的,因此只能以一种方式进入。

原理图:
stm32步进电机驱动程序,STM32,stm32,单片机,嵌入式硬件,arm开发,物联网

三、驱动程序

motor

unsigned int Zz_flag = 0;
unsigned int Fz_flag = 0;
unsigned int Zz_Value = 0;
unsigned int Fz_Value = 0;

void Motor_Init(void)
{
	
	GPIO_InitTypeDef GPIO_InitStruct;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOC,&GPIO_InitStruct);
	//GPIO_ResetBits(GPIOC,GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9);
}
 
void Motor_Zz(void)//正转
{
	Zz_Value = 1;
	Fz_Value = 0;
}
void Motor_Fz(void)//反转
{
	Fz_Value = 1;
	Zz_Value = 0;
}
void Motor_Stop(void)
{
	Zz_Value = 0;
	Fz_Value = 0;
	Motor_A = 0;
	Motor_B = 0;
	Motor_C = 0;
	Motor_D = 0;
}
void Motor_Zz_Function(void)
{
			switch(Zz_flag)//八拍
		{
			case 0 : Motor_A = 1;Motor_B = 0;Motor_C = 0; Motor_D = 0;Zz_flag++;break;//A
			
			case 1 : Motor_A = 1;Motor_B = 1;Motor_C = 0; Motor_D = 0;Zz_flag++;break;//AB
			
			case 2 : Motor_A = 0;Motor_B = 1;Motor_C = 0; Motor_D = 0;Zz_flag++;break;//B
			
			case 3 : Motor_A = 0;Motor_B = 1;Motor_C = 1; Motor_D = 0;Zz_flag++;break;//BC
			
			case 4 : Motor_A = 0;Motor_B = 0;Motor_C = 1; Motor_D = 0;Zz_flag++;break;//C
			
			case 5 : Motor_A = 0;Motor_B = 0;Motor_C = 1; Motor_D = 1;Zz_flag++;break;//CD
			
			case 6 : Motor_A = 0;Motor_B = 0;Motor_C = 0; Motor_D = 1;Zz_flag++;break;//D
			
			case 7 : Motor_A = 1;Motor_B = 0;Motor_C = 0; Motor_D = 1;Zz_flag = 0;break;//DA
			
			default : break;
			
		}
}
void Motor_Fz_Function(void)
{
	switch(Fz_flag)
		{
			case 0 : Motor_A = 1;Motor_B = 0;Motor_C = 0; Motor_D = 1;Fz_flag++;break;//DA
			
			case 1 : Motor_A = 0;Motor_B = 0;Motor_C = 0; Motor_D = 1;Fz_flag++;break;//D
			
			case 2 : Motor_A = 0;Motor_B = 0;Motor_C = 1; Motor_D = 1;Fz_flag++;break;//CD
			
			case 3 : Motor_A = 0;Motor_B = 0;Motor_C = 1; Motor_D = 0;Fz_flag++;break;//C
			
			case 4 : Motor_A = 0;Motor_B = 1;Motor_C = 1; Motor_D = 0;Fz_flag++;break;//BC
			
			case 5 : Motor_A = 0;Motor_B = 1;Motor_C = 0; Motor_D = 0;Fz_flag++;break;//B
			
			case 6 : Motor_A = 1;Motor_B = 1;Motor_C = 0; Motor_D = 0;Fz_flag++;break;//AB
			
			case 7 : Motor_A = 1;Motor_B = 0;Motor_C = 0; Motor_D = 0;Fz_flag=0;break;//A
			
			default : break;
			
		}
}

main

int main()
{
	int key = 0;
	int arr = 50;
	int Motor_flag = 0;
	TIM3_init(99,7199);
	Motor_Init();
	KEY_Init();
	Motor_Zz();
	while(1)
	{
		
		key = Get_Indepedent_Key_Value();
		if(key) 
		{
			switch(key)
			{
				case KEY0_BASE : arr += 10; TIM_SetAutoreload(TIM3,arr);break;
				
				case KEY1_BASE : arr -= 10; TIM_SetAutoreload(TIM3,arr);break;
				
				case KEY_UP_BASE : if(Motor_flag % 2 == 0) Motor_Fz(); else Motor_Zz(); Motor_flag++;break;
				
				default : break;
			}
		} 
			
	}
}

程序源码

链接https://pan.baidu.com/s/1KsX2D5oYvQDmoAIYaDnINQ
提取码:ettg
文章来源地址https://www.toymoban.com/news/detail-785514.html

到了这里,关于基于STM32的步进电机驱动设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 毕业设计——基于STM32的智能家具系统(语音识别控制、步进电机、舵机)

    智能家具系统分为两个不同版本系列: ①系列一:手机app远程控制、远程检测温湿度显示在app,(云平台)!!!!                   https://blog.csdn.net/m0_59113542/article/details/123737710 ②系列二:语音识别控制-------本文章 硬件采购链接: 步进电机及相关驱动 ULN2003步进电机驱动

    2024年02月05日
    浏览(73)
  • 【STM32篇】DRV8425驱动步进电机

    【STM32篇】DRV8425驱动步进电机

    【STM32篇】4988驱动步进电机_hr4988-CSDN博客         在上篇文章中使用了HR4988实现了步进电机的驱动,在实际运用过程,HR4988或者A4988驱动步进电机会存在电机噪音太大的现象。本次将向各位友友介绍一个驱动简单且非常静音的一款步进电机驱动IC。         DRV8424/25 是适

    2024年04月11日
    浏览(11)
  • 基于STM32CUBEMX驱动低压步进器电机驱动器STSPIN220(3)----定时器中断产生指定数量脉冲

    基于STM32CUBEMX驱动低压步进器电机驱动器STSPIN220(3)----定时器中断产生指定数量脉冲

    在步进电机控制过程中,为了实现精确的位置和速度控制,经常需要输出指定数量的脉冲。这就需要使用定时器功能来生成PWM脉冲信号。本文将详细介绍如何利用STM32CUBEMX配置定时器以输出指定数量的PWM脉冲。 定时器是STM32微控制器的一个重要功能模块,可用于生成各种定时

    2024年02月14日
    浏览(12)
  • STM32CubeMX ULN2003步进电机驱动

    STM32CubeMX ULN2003步进电机驱动

    一、28BYJ-48 步进电机  28BYJ-48是一款5线单极步进电机,运行电压为5V。 根据数据表,当28BYJ-48电机在全步模式下运行时,每步对应于11.25°的旋转。这意味着每转有32步 (360°/11.25° = 32)。 如上图所示,步距角=5.625°/64 意思就是每64个脉冲步进电机就会转5.625度,因此我们很容易得

    2024年01月18日
    浏览(18)
  • STM32F4驱动42步进电机(采用驱动器)

    STM32F4驱动42步进电机(采用驱动器)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 stm32f407zgt6芯片,tb6600驱动器 植树机代码,可以驱动四路42步进电机,以下是只驱动1路。 : 红线接B+(TB6600), 蓝线接B-, 绿线接A-, 黑线接A+ 该图片是转载的。根据本文代码:Signal的-统一接开发板的GND(解

    2024年02月03日
    浏览(13)
  • 【STM32】实战3.1—用STM32与TB6600驱动器驱动42步进电机(一)

    【STM32】实战3.1—用STM32与TB6600驱动器驱动42步进电机(一)

    目录 0 参考资料出处 1 实验预期效果 2 硬件学习 2.1 TB6600驱动器  2.1.1 通过拨码开关设定细分与电流 2.1.2 共阴共阳接线法 2.2 开关电源(AC转DC变压器) 电源线 2.3 42步进电机 2.3.1 基本知识 2.3.2 转速细分控制 2.3.3 满步、半步、微步驱动原理 3 软件配置与硬件接线 3.1 STM32CubeM

    2024年02月02日
    浏览(15)
  • 【STM32】步进电机及其驱动(ULN2003驱动28BYJ-48丨按键控制电机旋转)

    【STM32】步进电机及其驱动(ULN2003驱动28BYJ-48丨按键控制电机旋转)

    参考文章与课程:   【视频课程】步进电机基础原理和应用——程子华主讲   【视频课程】电机系列教学视频(基于STM32硬件)——野火   【霄耀在努力】STM32驱动步进电机(原理、程序、解决电机只震动不转动问题)   步进控制系统由以下三个部分组成: 控制器

    2023年04月09日
    浏览(7)
  • STM32自学笔记14-步进电机驱动项目-TB67H450驱动

    STM32自学笔记14-步进电机驱动项目-TB67H450驱动

    目前的项目是一种2相4线步进电机的闭环驱动电路,使用的电机驱动芯片是 TB67H450 ,再使用磁编码器 MT6816 ,使用 FOC 算法,基于 STM32F1 单片机。 这一节是步进电机的驱动芯片驱动研究 首先研究驱动芯片 TB67H450 的datasheet 这是一个PWM斩波电机驱动芯片,内部框图可以看出来内

    2024年02月07日
    浏览(84)
  • STM32+A4988拓展板+HAL实现简单42步进电机驱动

    STM32+A4988拓展板+HAL实现简单42步进电机驱动

    1.A4988及其拓展板简介 2.接线 3.STM32_CUBEMX配置 4.代码详解 ——————————————————————————————————————————— 1.A4988及其拓展板简介 A4988 A4988拓展板     A4988是一款常用的步进电机驱动器,A4988驱动器采用了步进电机的微步技术,能

    2024年01月22日
    浏览(8)
  • STM32自学笔记16-步进电机驱动项目-磁编码器的校准

    上节我把MT6816的驱动给大致整明白了,接下去需要看看如何 校准 。 为什么编码器需要校准? 如上节所说,MT6816是一款 绝对值编码器 ,它为每个测量位置分配了唯一的二进制代码或字, 即使断电,也可以跟踪编码器的确切位置 。 但是由于硬件或其他因素的影响,编码器输

    2024年02月16日
    浏览(76)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包