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单片机控制28BYJ48步进电机原理及代码 -> 正文阅读

[嵌入式]stm32单片机控制28BYJ48步进电机原理及代码

?命名方式(以28BYJ48步进电机为例)

28BYJ48步进电机的编号

28-----步进电机的有效最大外径是28毫米

B-----表示步进电机

Y-----表示永磁式

J-----表示减速型

48-----表示四相八拍

工作原理

1、五线四相步进电机,不同相位得电会让步进电机的转子转动一个角度,按一定规律给不同的相位通电,就可以让步进电机连续转动,下表就是通电的顺序。

表里面的顺,逆时针的方向只是代表相位给电时序,

注:总共五条线,一个是VCC,剩下四条分别接上ABCD相

分别对应与ULN2003/ULN2003A驱动芯片的5V以及4个输入口对应连接

2、每走一个位置,都要给一定的延时,不然还没等转子到位,下一个脉冲就进来了,肯定会引起错误,导致电机堵转或者异常震动。

3、通过改变延时的时间,就可以控制电机的转速,不能太慢,也不要太快,不断调试到合理范围就行。

4、单片机IO口和电机四条相线连接时,一定不能错误,要按照顺序相连接。

5、调换得电的顺序,就可以控制电机的转向。

注意在51单片机中,为IO口置0相当于是高电平,而置1的时候相当于是低电平,和上面的图片一致(GND)

二、关键实验程序

在编写注释的时候用的是ANSI编码器,在这里部分注释可能会出现乱码,复制到编译器中就会正常显示(也注意一般用UTF-8编码器进行编写,ANSI编码器对中文不友好,一般一个汉字用的2个字符储存,所以在转存的时候就会出现乱码)

头文件

#ifndef __BSP_ULN2003_H__
#define __BSP_ULN2003_H__

#include <stm32f10x.h>
#include "bsp_SysTick.h"

#define STEPPER_ANGLE		0.703125   //  360/(4096/4)=360/512=0.703125

enum dir{Pos, Neg};   //Pos = 0, Neg = 1  //enum?a?¨ò??a???ù

#define IN1_HIGH	GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET)
#define IN1_LOW		GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET)

#define IN2_HIGH	GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_SET)
#define IN2_LOW		GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_RESET)

#define IN3_HIGH	GPIO_WriteBit(GPIOA, GPIO_Pin_6, Bit_SET)
#define IN3_LOW		GPIO_WriteBit(GPIOA, GPIO_Pin_6, Bit_RESET)

#define IN4_HIGH	GPIO_WriteBit(GPIOA, GPIO_Pin_7, Bit_SET)
#define IN4_LOW		GPIO_WriteBit(GPIOA, GPIO_Pin_7, Bit_RESET)

void ULN2003_Configuration(void);
void stepper(unsigned int dir, unsigned int speed);
void angle_control(unsigned int dir, double angle, unsigned int speed);

#endif

调用函数

/*
	á???±í£o
	STM32								ULN2003?y?ˉ
	PA4      	<-------> 	IN1
	PA5			<-------> 	IN2
	PA6			<-------> 	IN3
	PA7			<-------> 	IN4
	
	5V 28BYJ-482???μ??ú£??ú2?′?óD???ù×°?? ???ù±è£o1/64   2??à??£o5.625??/64£¨64????3?×a?ˉ5.625??£?

?y?ò×a?ˉ£o
	???à°????????3Dò£o(A-AB-B-BC-C-CD-D-DA)
				1		2		3		4		5		6		7		8
	A			-		-		+		+		+		+		+		-
	B			+		-		-		-		+		+		+		+
	C			+		+		+		-		-		-		+		+
	D			+		+		+		+		+		-		-		-
·′?ò×a?ˉ£o(DA-D-CD-C-BC-B-AB-A)
*/

#include "bsp_uln2003.h"

void ULN2003_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_WriteBit(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7, Bit_RESET);
}

//?ù?è????:
/*
dir: ?3£???ê±??Dy×a·??ò
speed£o×a?ù£?·??§[1,100]
*/
void stepper(unsigned int dir, unsigned int speed)
{
	if(dir == Pos)
	{
		//step1:
		IN1_HIGH;
		IN2_LOW;
		IN3_LOW;
		IN4_LOW;
		Delay_us(speed);
		
		//step2:	
		IN1_HIGH;
		IN2_HIGH;
		IN3_LOW;
		IN4_LOW;
		Delay_us(speed);

		//step3:		
		IN1_LOW;
		IN2_HIGH;
		IN3_LOW;
		IN4_LOW;
		Delay_us(speed);

		//step4:
		IN1_LOW;
		IN2_HIGH;
		IN3_HIGH;
		IN4_LOW;
		Delay_us(speed);

		//step5:
		IN1_LOW;
		IN2_LOW;
		IN3_HIGH;
		IN4_LOW;
		Delay_us(speed);

		//step6:
		IN1_LOW;
		IN2_LOW;
		IN3_HIGH;
		IN4_HIGH;
		Delay_us(speed);

		//step7:
		IN1_LOW;
		IN2_LOW;
		IN3_LOW;
		IN4_HIGH;
		Delay_us(speed);

		//step8:
		IN1_HIGH;
		IN2_LOW;
		IN3_LOW;
		IN4_HIGH;
		Delay_us(speed);
	}
	else
	{
		//step1:
		IN1_HIGH;
		IN2_LOW;
		IN3_LOW;
		IN4_HIGH;
		Delay_us(speed);

		//step2:		
		IN1_LOW;
		IN2_LOW;
		IN3_LOW;
		IN4_HIGH;
		Delay_us(speed);

		//step3:		
		IN1_LOW;
		IN2_LOW;
		IN3_HIGH;
		IN4_HIGH;
		Delay_us(speed);

		//step4:
		IN1_LOW;
		IN2_LOW;
		IN3_HIGH;
		IN4_LOW;
		Delay_us(speed);

		//step5:
		IN1_LOW;
		IN2_HIGH;
		IN3_HIGH;
		IN4_LOW;
		Delay_us(speed);

		//step6:
		IN1_LOW;
		IN2_HIGH;
		IN3_LOW;
		IN4_LOW;
		Delay_us(speed);

		//step7:
		IN1_HIGH;
		IN2_HIGH;
		IN3_LOW;
		IN4_LOW;
		Delay_us(speed);

		//step8:
		IN1_HIGH;
		IN2_LOW;
		IN3_LOW;
		IN4_LOW;
		Delay_us(speed);
	}
}

//???è????£o
/*
dir: ?3£???ê±??Dy×a·??ò
angle£o???è£?·??§[0,360]
speed£o×a?ù£?·??§[1,100]
*/

void angle_control(unsigned int dir, double angle, unsigned int speed)
{
	int i;
	
	for(i = 0; i < angle / STEPPER_ANGLE; i++) //μ÷ó?(angle / STEPPER_ANGLE)??°???
		stepper(dir, speed);
}
//μ÷ó??a??oˉêy???????èóD??D?μ??ó2??ò?μê?è±?Y£oò?ê??μstepper(dir, speed);ê?ò?°????a×?D?·??è?μ
//??′?ê?£?foroˉêy?D×?D?2??à?a1£?oü??è?angle / STEPPER_ANGLE ×??àóDò???°???μ??ó2?£?
//?′5.624/64*8=0.703?è£?ò22?ê?oü′ó£??éò?o???2???

1、步进电机的减速比为1/64,即转子转动64圈,外面的转轴才会转动1圈

2、步进电机的步距角为5.624/64 (步进电机的定子绕组每次改变一次通电状态,步进电机外面的转轴转过的角度称步距角;即步进电机的最小旋转角度)

3、所以360/(5.624/64)≈ 4096 (步进电机外面的转轴转过一圈所需要改变定子绕组的通电状态次数)

这里补充介绍一个概念:步进角

步进电机的定子绕组每次改变一次通电状态,转子转过的角度称步进角。

(可以认为是电机内部的转子的最小旋转角度)

步进角 = (360)/m * Z * C

m-----定子相数

Z-----转子磁极对数

C-----通电方式

{ C = 1 ,单相轮流通电,双相轮流通电方式

? C = 2 , 双相轮流通电方式

1,相数:是指产生不同对极N,S磁场的激磁线圈对数

2,拍数:完成一个周期性变化所需脉冲数,以四相电机为例,有单相四拍的运行方式:(A-B-C-D),有双相四拍的运行方式:(AB-BC-CD-DA),有四相八拍的运行方式:(A-AB-B-BC-C-CD-D-DA)

这里的源码用的是双相轮流通电方式,在源码中可以看到四个相位MA,MB,MC,MD使能为高电平状态的相位数为相邻2个或1个(A-AB-B-BC-C-CD-D-DA)

步进电机的相关参数:


注意事项:由于电机的制造误差,安装误差,单片机的误差还有软件延时函数误差,这些误差累加起来之后,就会导致电机的转速、转动角度出现一定的误差。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-04-04 12:27:28  更:2022-04-04 12:29:14 
 
开发: 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/26 4:46:03-

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