步进电机

1. 步进电机原理

步进电机:是数字控制电机,它将脉冲信号转变成角位移,即给一个脉冲信号,步进电机就转动一个角度。

步进电机可分为反应式步进电机(简称VR)、永磁式步进电机(简称PM)和混合式步进电机(简称HB),后两种常用。

步进电机控制特点:

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

2. 步进电机28BYJ-48

2.1 介绍

28:步进电机的有效最大外径是28毫米
B:表示是步进电机
Y:表示是永磁式
J:表示是减速型(减速比1:64)
48:可以四拍、八拍运行

28BYJ-48 的内部结构示意图如下所示。转子上面有6个齿,分别标注为0~5,转子的每个齿上都带有一块永磁体。

定子跟电机的外壳固定在一起的,它上面有8个齿,而每个齿上都缠上了一个线圈绕组,正对的2个齿上的绕组串联在一起的,这2个绕组总是会同时导通或关断的,如此就形成了4相,在图中分别标注为 A-B-C-D,这就是4相的概念。

工作原理: 假定电机的起始状态就如示意所示,逆时针方向转动,起始时B相绕组的开关闭合,B 相绕组导通,那么导通电流就会在正上和正下两个定子齿上产生磁性,这两个定子齿上的磁性就会对转子上的0和3号齿产生最强的吸引力,就会如图所示的那样,转子的0号齿在正上、3号齿在正下而处于平衡状态;此时我们会发现,转子的1号齿与右上的定子齿也就是 C 相的一个绕组呈现一个很小的夹角,2号齿与右边的定子齿也就是 D 相绕组呈现一个稍微大一点的夹角,很明显这个夹角是1号齿和 C 绕组夹角的2倍,同理,左侧的情况也是一样的。

接下来,我们把 B 相绕组断开,而使 C 相绕组导通,那么很明显,右上的定子齿将对转子1号齿产生最大的吸引力,而左下的定子齿将对转子4号齿,产生最大的吸引力,在这个吸引力的作用下,转子1、4号齿将对齐到右上和左下的定子齿上而保持平衡,如此,转子就转过了起始状态时1号齿和 C 相绕组那个夹角的角度。

再接下来,断开 C 相绕组,导通 D 相绕组,过程与上述的情况完全相同,最终将使转子2、5号齿与定子 D 相绕组对齐,转子又转过了上述同样的角度。

那么很明显,当 A 相绕组再次导通,即完成一个 B-C-D-A 的四节拍操作后,转子的0、3号齿将由原来的对齐到上下2个定子齿,而变为了对齐到左上和右下的两个定子齿上,即转子转过了一个定子齿的角度。依此类推,再来一个四节拍,转子就将再转过一个齿的角度,8个四节拍以后转子将转过完整的一圈,而其中单个节拍使转子转过的角度就很容易计算出来了,即360度/(8*4)=11.25度,这个值就叫做步进角度。而上述这种工作模式就是步进电机的单四拍模式——单相绕组通电四节拍。

我们再来讲解一种具有更优性能的工作模式,那就是在单四拍的每两个节拍之间再插入一个双绕组导通的中间节拍,组成八拍模式。比如,在从 B 相导通到 C 项导通的过程中,假如一个 B 相和 C 相同时导通的节拍,这个时候,由于 B、C 两个绕组的定子齿对它们附近的转子齿同时产生相同的吸引力,这将导致这两个转子齿的中心线对比到 B、C 两个绕组的中心线上,也就是新插入的这个节拍使转子转过了上述单四拍模式中步进角度的一半,即5.625度。这样一来,就使转动精度增加了一倍,而转子转动一圈则需要8*8=64拍了。另外,新增加的这个中间节拍,还会在原来单四拍的两个节拍引力之间又加了一把引力,从而可以大大增加电机的整体扭力输出,使电机更“有劲”了。

除了上述的单四拍和八拍的工作模式外,还有一个双四拍的工作模式——双绕组通电四节拍。其实就是把八拍模式中的两个绕组同时通电的那四拍单独拿出来,而舍弃掉单绕组通电的那四拍而已。其步进角度同单四拍是一样的,但由于它是两个绕组同时导通,所以扭矩会比单四拍模式大。

八拍模式是这类4相步进电机的最佳工作模式,能最大限度的发挥电机的各项性能,也是绝大多数实际工程中所选择的模式。

接下来,我们来了解“永磁式减速步进电机”中这个“减速”的概念了。下图是这个 28BYJ-48 步进电机的拆解图,从图中可以看到,位于最中心的那个白色小齿轮才是步进电机的转子输出,64个节拍只是让这个小齿轮转了一圈,然后它带动那个浅蓝色的大齿轮,这就是一级减速。大家看一下右上方的白色齿轮的结构,除电机转子和最终输出轴外的3个传动齿轮都是这样的结构,由一层多齿和一层少齿构成,而每一个齿轮都用自己的少齿层去驱动下一个齿轮的多齿层,这样每2个齿轮都构成一级减速,一共就有了4级减速,那么总的减速比是多少呢?即转子要转多少圈最终输出轴才转一圈呢?

回头看一下电机参数表中的减速比这个参数吧——1:64,转子转64圈,最终输出轴才会转一圈,也就是需要64×64=4096个节拍输出轴才转过一圈。4096个节拍转动一圈,那么一个节拍转动的角度——步进角度就是360/4096,看一下表中的步进角度参数5.625/64,算一下就知道这两个值是相等的,一切都已吻合了。

关于基本的控制原理本该到这里就全部结束了,但是不管是哪个厂家生产的电机,只要型号是 28BYJ-48,其标称的减速比就都是1:64。但实际上呢?经过拆解计算发现:真实准确的减速比并不是这个值1:64,而是1:63.684!得出这个数据的方法也很简单,实际数一下每个齿轮的齿数,然后将各级减速比相乘,就可以得出结果了,实测的减速比为(32/9)(22/11)(26/9)(31/10)≈63.684,从而得出实际误差为0.0049,即约为百分之0.5,转100圈就会差出半圈。

那么按照1:63.684 的实际减速比,可以得出转过一圈所需要节拍数是6463.684≈4076。但实际上误差还是存在的,因为上面的计算结果都是约等得出的,实际误差大约是0.000056,即万分之0.56,转一万圈才会差出半圈,已经可以忽略不计了。

八拍:(A-AB-B-BC-C-CD-D-DA-A)

#include "../BSP/bsp_28bjy48/bsp_28bjy48.h"typedef struct BSPPIN_STRUCT
{GPIO_TypeDef *GPIO_Port; //  端口uint16_t GPIO_Pin;  //  管脚
}PIN_STRUCT;#define MOTOR_PIN_COUNT 4PIN_STRUCT g_sPinIndex[MOTOR_PIN_COUNT] =
{{GPIOA, GPIO_PIN_0},{GPIOA, GPIO_PIN_1},{GPIOA, GPIO_PIN_2},{GPIOA, GPIO_PIN_3},
};void bsp_MotorGpioInit(void)
{}static void bsp_MotorStop(void)
{for(uint8_t i = 0; i < MOTOR_PIN_COUNT; i++){HAL_GPIO_WritePin(g_sPinIndex[i].GPIO_Port, g_sPinIndex[i].GPIO_Pin, GPIO_PIN_RESET);}
}static void bsp_OpenSingle(uint8_t Pin)
{for(uint8_t i = 0; i < MOTOR_PIN_COUNT; i++){if(i == Pin){HAL_GPIO_WritePin(g_sPinIndex[i].GPIO_Port, g_sPinIndex[i].GPIO_Pin, GPIO_PIN_SET);}else{HAL_GPIO_WritePin(g_sPinIndex[i].GPIO_Port, g_sPinIndex[i].GPIO_Pin, GPIO_PIN_RESET);}}
}/*** 4拍单相驱动*/
void bsp_MotorSingleStep(uint8_t PinName, uint16_t ms)
{bsp_OpenSingle(PinName);HAL_Delay(ms);         // 延时,控制电机速度bsp_MotorStop();             // 断电,防止电机过热
}/*** 四拍*/
void bsp_MotorSingleFour(uint8_t direction, uint32_t step, uint16_t ms)
{for(uint32_t j = 0; j < step; j++){if(direction == 1){for(uint8_t i = 0; i < MOTOR_PIN_COUNT; i++){bsp_MotorSingleStep(i, ms);}}else{for(uint8_t i = MOTOR_PIN_COUNT; i > 0; i--){bsp_MotorSingleStep((i-1), ms);}}}
}/*** 八拍单节拍* step 节拍序号*/
void bsp_MotorSingleEightStep(uint8_t step)
{switch(step){case 0:HAL_GPIO_WritePin(g_sPinIndex[0].GPIO_Port, g_sPinIndex[0].GPIO_Pin, GPIO_PIN_SET);HAL_GPIO_WritePin(g_sPinIndex[1].GPIO_Port, g_sPinIndex[1].GPIO_Pin, GPIO_PIN_RESET);HAL_GPIO_WritePin(g_sPinIndex[2].GPIO_Port, g_sPinIndex[2].GPIO_Pin, GPIO_PIN_RESET);HAL_GPIO_WritePin(g_sPinIndex[3].GPIO_Port, g_sPinIndex[3].GPIO_Pin, GPIO_PIN_RESET);break;case 1:HAL_GPIO_WritePin(g_sPinIndex[0].GPIO_Port, g_sPinIndex[0].GPIO_Pin, GPIO_PIN_SET);HAL_GPIO_WritePin(g_sPinIndex[1].GPIO_Port, g_sPinIndex[1].GPIO_Pin, GPIO_PIN_SET);HAL_GPIO_WritePin(g_sPinIndex[2].GPIO_Port, g_sPinIndex[2].GPIO_Pin, GPIO_PIN_RESET);HAL_GPIO_WritePin(g_sPinIndex[3].GPIO_Port, g_sPinIndex[3].GPIO_Pin, GPIO_PIN_RESET);break;case 2:HAL_GPIO_WritePin(g_sPinIndex[0].GPIO_Port, g_sPinIndex[0].GPIO_Pin, GPIO_PIN_RESET);HAL_GPIO_WritePin(g_sPinIndex[1].GPIO_Port, g_sPinIndex[1].GPIO_Pin, GPIO_PIN_SET);HAL_GPIO_WritePin(g_sPinIndex[2].GPIO_Port, g_sPinIndex[2].GPIO_Pin, GPIO_PIN_RESET);HAL_GPIO_WritePin(g_sPinIndex[3].GPIO_Port, g_sPinIndex[3].GPIO_Pin, GPIO_PIN_RESET);break;case 3:HAL_GPIO_WritePin(g_sPinIndex[0].GPIO_Port, g_sPinIndex[0].GPIO_Pin, GPIO_PIN_RESET);HAL_GPIO_WritePin(g_sPinIndex[1].GPIO_Port, g_sPinIndex[1].GPIO_Pin, GPIO_PIN_SET);HAL_GPIO_WritePin(g_sPinIndex[2].GPIO_Port, g_sPinIndex[2].GPIO_Pin, GPIO_PIN_SET);HAL_GPIO_WritePin(g_sPinIndex[3].GPIO_Port, g_sPinIndex[3].GPIO_Pin, GPIO_PIN_RESET);break;case 4:HAL_GPIO_WritePin(g_sPinIndex[0].GPIO_Port, g_sPinIndex[0].GPIO_Pin, GPIO_PIN_RESET);HAL_GPIO_WritePin(g_sPinIndex[1].GPIO_Port, g_sPinIndex[1].GPIO_Pin, GPIO_PIN_RESET);HAL_GPIO_WritePin(g_sPinIndex[2].GPIO_Port, g_sPinIndex[2].GPIO_Pin, GPIO_PIN_SET);HAL_GPIO_WritePin(g_sPinIndex[3].GPIO_Port, g_sPinIndex[3].GPIO_Pin, GPIO_PIN_RESET);break;case 5:HAL_GPIO_WritePin(g_sPinIndex[0].GPIO_Port, g_sPinIndex[0].GPIO_Pin, GPIO_PIN_RESET);HAL_GPIO_WritePin(g_sPinIndex[1].GPIO_Port, g_sPinIndex[1].GPIO_Pin, GPIO_PIN_RESET);HAL_GPIO_WritePin(g_sPinIndex[2].GPIO_Port, g_sPinIndex[2].GPIO_Pin, GPIO_PIN_SET);HAL_GPIO_WritePin(g_sPinIndex[3].GPIO_Port, g_sPinIndex[3].GPIO_Pin, GPIO_PIN_SET);break;case 6:HAL_GPIO_WritePin(g_sPinIndex[0].GPIO_Port, g_sPinIndex[0].GPIO_Pin, GPIO_PIN_RESET);HAL_GPIO_WritePin(g_sPinIndex[1].GPIO_Port, g_sPinIndex[1].GPIO_Pin, GPIO_PIN_RESET);HAL_GPIO_WritePin(g_sPinIndex[2].GPIO_Port, g_sPinIndex[2].GPIO_Pin, GPIO_PIN_RESET);HAL_GPIO_WritePin(g_sPinIndex[3].GPIO_Port, g_sPinIndex[3].GPIO_Pin, GPIO_PIN_SET);break;case 7:HAL_GPIO_WritePin(g_sPinIndex[0].GPIO_Port, g_sPinIndex[0].GPIO_Pin, GPIO_PIN_SET);HAL_GPIO_WritePin(g_sPinIndex[1].GPIO_Port, g_sPinIndex[1].GPIO_Pin, GPIO_PIN_RESET);HAL_GPIO_WritePin(g_sPinIndex[2].GPIO_Port, g_sPinIndex[2].GPIO_Pin, GPIO_PIN_RESET);HAL_GPIO_WritePin(g_sPinIndex[3].GPIO_Port, g_sPinIndex[3].GPIO_Pin, GPIO_PIN_SET);break;default:bsp_MotorStop();break;}
}
/*** 八拍* direction 方向* step 节拍数* ms  频率*/
void bsp_MotorSingleEight(uint8_t direction, uint32_t step, uint16_t ms)
{for(uint32_t j = 0; j < step; j++){if(direction == 0){for(uint8_t i = 0; i < 8; i++){bsp_MotorSingleEightStep(i);HAL_Delay(ms);}}else{for(uint8_t i = 8; i > 0; i--){bsp_MotorSingleEightStep(i-1);HAL_Delay(ms);}}}
}

步进电机28BYJ-48相关推荐

  1. 【步进电机与Arduino使用教程】

    步进电机与Arduino使用教程 介绍 步进电机 步进电机的工作原理 微步进 步进电机的类型 双极步进电机 单极步进电机 阅读步进电机规格 试验步进电机 演示 1 – 带 ULN2003 的 28BY ...

  2. 【电机驱动芯片(单、双极性步进电机驱动方式/四相五线和42步进电机)——ULN2003、双H桥芯片(DRV8833/DRV8825)】

    文章目录 一.步进电机工作原理 1.基本原理 2.相关总结 二.单极性步进电机驱动(以ULN2003芯片+28BYJ-48电机为例) 1.28BYJ-48四相五线步进电机介绍 2.ULN2003芯片介 ...

  3. 51单片机入门——步进电机

    文章目录 1 电机的分类 2 28BYJ-48型步进电机原理 3 让电机动起来 4 转动精度与深入分析 5 编写实用程序的基础 1 电机的分类 电机的分类方式有很多,从用途角度可划分为驱动类电机和控制 ...

  4. 基于android小区智能管理,基于Android的智能小区停车场设计

    原标题:基于Android的智能小区停车场设计 停车场作为智能小区管理的组成部分,业主对其管理的要求也不断提高,都希望管理能够达到方便快捷以及安全的效果.智能停车场是利用高度自动化的机电设备对停车场进 ...

  5. arduino自制cnc绘图仪_如何制作一台类似于CNC机器的自动绘图机

    第1步:您的旅程要求: 需要的零件: Arduino uno 1个步进电机(我们使用的型号为28BYJ -48) Adafruit电动机护罩v2 许多电线 两个计算机CD托盘 可选:一些3d打印的齿轮 ...

  6. 树莓派驱动28byj步进电机

    1.材料:树莓派4B.28byj步进电机.步进电机驱动(ULN2003),杜邦线若干(双母头) 2.接线,给驱动板供电5-12v,IN1,IN2,IN3,IN4分别接树莓派的24.23.22.27号引 ...

  7. 步进电机编写单4拍或4-8拍方式的汇编或c语言控制程序.,(毕业设计)基于单片机的步进电机控制系统(汇编及C语言程序各个)...

    基于单片机的步进电机控制系统设计 前言 步进电机是一种进行精确步进运动的机电执行元件,它广泛应用于工业机械的数字控制,为使系统的可靠性.通用性.可维护性以及性价比最优,根据控制系统功能要求及步进电机应 ...

  8. 步进电机编写单4拍或4-8拍方式的汇编或c语言控制程序.,基于SCM和PLC的两种步进电机控制方法...

    引 言 步进电机位移与输入脉冲信号数相对应,精度高.响应特性好.可靠性高.速度可在较宽范围内平滑调节,是控制系统中一种重要的自动化执行元件. SCM(Single Chip Microcomputer ...

  9. 步进电机编写单4拍或4-8拍方式的汇编或c语言控制程序.,51单片机C语言和汇编控制28BYJ48步进电机程序...

    本文提供三个51单片机控制步进电机正反转的程序,2个C程序,1个汇编,. 步进电机正反转程序 28BYJ48,,,,四相五线制,,用拍的脉冲... 电机先正转一周,在反转一周,停止.. 本程序利用 S ...

  10. 使用BH60测量小功率步进电机角度实验数据

    在 使用高精度旋转编码器BH60测量步进电机转动角度 实验中使用BH60绝对角度旋转传感器测量步进电机的角度.本文给出了实验测量数据. □ 测量数据 angle=[1.00,1.00,2.00,3.0 ...

最新文章

  1. php简单算法之冒泡排序
  2. 马云成功靠的是机遇还是努力?网友戏谑:是那张其貌不扬的脸
  3. Rhel6-mpich2 hpc集群配置文档
  4. SQL的多种JOIN
  5. zepto和jquery的区别,zepto的不同使用8条小结
  6. buu 密码学的心声
  7. 在狮驼岭,孙悟空救了猪八戒,猪八戒为何不帮孙悟空?
  8. Nginx 入门级配置
  9. m3u8文件在手机上用什么软件看_如何用手机从一个网页下载视频
  10. 基于Sql Server 2008的分布式数据库的实践
  11. 网易宣布:招30人![免费加入]网易java人才培养计划!
  12. 接口访问次数_如何基于spring开发自定义注解实现对接口访问频次限制?
  13. struts2 log4j_Struts2和Log4j集成示例项目
  14. 计算机电子设计论文,计算机毕业设计电子信息毕业设计电子信息毕业论文
  15. 基本逻辑符号与数学符号列表
  16. postman传String类型参数时不能加双引号
  17. Android 身份证号码、手机号码以及邮箱账号 的中间隐藏显示
  18. 如何在2小时内用1块钱赚到100块钱?
  19. 【论文阅读】Realtime Robust Malicious Traffic Detection via Frequency Domain Analysis
  20. 论文阅读_Same Coverage, Less Bloat: Accelerating Binary-only Fuzzing with Coverage-preserving Coverage-g

热门文章

  1. hualinux0.10 网络篇:如何学好CCNA(网络入门的正确打开方式)
  2. @人生最痛苦事是,在不懂爱的年龄,选择了婚姻,而在懂爱的年龄,遇到了不能在一起的人。
  3. EasyCVR打造基于人工智能和增强现实技术的智能运检系统“AR巡检”
  4. Linux基础学习笔记
  5. gravity 和 layout_gravity的区别
  6. VR全景创业丨备受普通人瞩目的互联网创业好项目
  7. “失败乃成功之母” 普通人想要财务自由唯有选择创业。丨国仁网络资讯
  8. POJ 1185(在求最大炮数上,输出一条方案,未Accept,网站在维护)
  9. 华硕h81m一k跳线图_主板跳线接法的所有秘密图文详解(适合新手)
  10. 计算机博士英文复试自我介绍,博士复试自我介绍中英文