IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 基于STM32的步进电机驱动设计( 含源码 ) -> 正文阅读

[嵌入式]基于STM32的步进电机驱动设计( 含源码 )


前言

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


一、步进电机

1. 基本概念

在这里插入图片描述
步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机。每输入一个脉冲信号,转子就转动一个角度或前进一步,其输出的角位移或线位移与输入的脉冲数成正比,转速与脉冲频率成正比。因此,步进电动机又称脉冲电动机。

步进电机控制特点:

  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. 电机结构

在这里插入图片描述
原理图:

在这里插入图片描述

3. 工作原理

在这里插入图片描述
驱动节拍模式:
在这里插入图片描述

4. 产品参数

1. 技术参数
在这里插入图片描述
2. 外形尺寸(单位mm)
在这里插入图片描述

二、ULN2003驱动板

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

在这里插入图片描述

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

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

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

引脚排列
在这里插入图片描述
IN1 – IN4脚:用于驱动电动机。将它们连接到stm32上的数字输出引脚。

GND:是常见的接地引脚。

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

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

原理图:
在这里插入图片描述

三、驱动程序

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/1vTNfv-bZMm_0QPPG7KuUQw?pwd=rqy2
提取码:rqy2

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-09-04 01:27:45  更:2022-09-04 01:30:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:38:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码