热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

stm32单片机控制28BYJ48步进电机原理及代码

命名方式(以28BYJ48步进电机为例)28BYJ48步进电机的编号28-----步进电机的有效最大外径是28毫米B-----表示步进电机Y--

 命名方式(以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
#include "bsp_SysTick.h"#define STEPPER_ANGLE 0.703125 // 360/(4096/4)=360/512=0.703125enum dir{Pos, Neg}; //Pos = 0, Neg = 1 //enumΪ¶¨ÒåΪö¾Ù#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

调用函数

/*Á¬Ïß±í£ºSTM32 ULN2003Çý¶¯PA4 <-------> IN1PA5 <-------> IN2PA6 <-------> IN3PA7 <-------> IN45V 28BYJ-48²½½øµç»ú£¬ÄÚ²¿´øÓмõËÙ×°Öà ¼õËٱȣº1/64 ²½¾à½Ç£º5.625¡ã/64£¨64¸öÂö³åת¶¯5.625¡ã£©ÕýÏòת¶¯£ºËÄÏà°ËÅÄ¿ØÖÆ˳Ðò£º(A-AB-B-BC-C-CD-D-DA)1 2 3 4 5 6 7 8A - - + + + + + -B + - - - + + + +C + + + - - - + +D + + + + + - - -
·´Ïòת¶¯£º(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: ˳£¬ÄæʱÕëÐýת·½Ïò
speed£º×ªËÙ£¬·¶Î§[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);}
}//½Ç¶È¿ØÖÆ£º
/*
dir: ˳£¬ÄæʱÕëÐýת·½Ïò
angle£º½Ç¶È£¬·¶Î§[0,360]
speed£º×ªËÙ£¬·¶Î§[1,100]
*/void angle_control(unsigned int dir, double angle, unsigned int speed)
{int i;for(i = 0; i }
//µ÷ÓÃÕâ¸öº¯Êý¿ØÖƽǶÈÓнÏСµÄÎó²î»ò˵ÊÇȱÏÝ£ºÒ»ÊÇ˵stepper(dir, speed);ÊÇÒÔ°ËÅÄΪ×îС·Ö¶ÈÖµ
//Æä´ÎÊÇ£¬forº¯ÊýÖÐ×îС²½¾àΪ1£¬ºÜÏÔÈ»angle / STEPPER_ANGLE ×î¶àÓÐÒ»¸ö°ËÅĵÄÎó²î£¬
//¼´5.624/64*8=0.703¶È£¬Ò²²»ÊǺܴ󣬿ÉÒÔºöÂÔ²»¼Æ

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)

步进电机的相关参数:


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


推荐阅读
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
  • 本文详细介绍了如何在Android 4.4及以上版本中配置WebView以实现内容的自动高度调整和屏幕适配,确保中文显示正常,并提供代码示例。 ... [详细]
  • 本文介绍如何配置SecureCRT以正确显示Linux终端的颜色,并解决中文显示问题。通过简单的步骤设置,可以显著提升使用体验。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 本文介绍了在Windows Server 2003环境下,使用XAMPP Lite 1.7.1和DotProject 2.1.3时遇到的日历和甘特图中文乱码问题的解决方案。通过修改相关文件和配置,可以有效解决这些问题。 ... [详细]
  • 解决网站乱码问题的综合指南
    本文总结了导致网站乱码的常见原因,并提供了详细的解决方案,包括文件编码、HTML元标签设置、服务器响应头配置、数据库字符集调整以及PHP与MySQL交互时的编码处理。 ... [详细]
  • PostgreSQL 10 离线安装指南
    本文详细介绍了如何在无法联网的服务器上进行 PostgreSQL 10 的离线安装,并涵盖了从下载安装包到配置远程访问的完整步骤。 ... [详细]
  • 本文详细探讨了网站流量统计中常用的三个关键指标:页面浏览量(PV)、独立访客数(UV)和独立IP数(IP)。通过分析这些指标的定义、计算方法及其应用场景,帮助网站运营者更好地理解用户行为,优化网站内容与用户体验。 ... [详细]
  • ABBYY FineReader:高效PDF转换、精准OCR识别与文档对比工具
    在处理PDF转换和OCR识别时,您是否遇到过格式混乱、识别率低或图表无法正常识别的问题?ABBYY FineReader以其强大的功能和高精度的识别技术,完美解决这些问题,帮助您轻松找到最终版文档。 ... [详细]
  • 如何处理MySQL命令行中文乱码问题
    本文详细探讨了MySQL命令行中出现中文乱码的原因及解决方案,通过调整配置文件和执行特定SQL命令来确保字符集正确设置,为用户提供了一个有效的解决路径。 ... [详细]
  • 本文探讨了如何通过WebBrowser控件在用户点击输入框时自动显示图片验证码。该过程可能涉及JavaScript事件的触发与响应。 ... [详细]
  • 本文详细列举了软件开发中常见的功能测试要点,涵盖输入框、搜索、添加/修改、删除、文件上传下载等多个方面,旨在帮助测试人员全面覆盖测试需求,确保软件质量。 ... [详细]
  • Android中解析XML文件的实践指南
    本文详细介绍了在Android应用开发中解析XML文件的方法,包括从本地文件和网络资源获取XML文件的不同途径,以及使用DOM、SAX和PULL三种解析方式的具体实现。 ... [详细]
author-avatar
77阿建
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有