步进电机28BYJ-48(12V)介绍:

首先,我们看下步进电机28BYJ-48(12V)外观图,如下:

28BYJ-48(12V)含义如下:28表示电机直径28毫米,B表示电机 ,Y表示永磁,J表示带减速箱,48表示四相八拍。

下面解释下“4 相永磁式”的概念,28BYJ-48 的构造如下图所示。

先看里圈,它有 6 个齿,辨别标注为 0~5,这个叫做转子,它是要转动的,转子的每一个齿都是一块永磁体,这就是“永磁式”的概念。再看外圈,这个就是定子,它是固定不动的,实践上它是跟电机的外壳固定在一同的,它有 8个齿,而每一个齿上都缠上了一个线圈绕组,正对着的 2 个齿上的绕组又是串联在一同的,也就是说正对着的2 个绕组老是会同时导通或关断的,如此就构成了4相,在图平分别标注为 A-B-C-D,这就是“4 相”的概念。

对于电机电机28BYJ-48(12V)是64个脉冲为一圈(注意是电机本身),得到电机28BYJ-48(12V)的步进角是5.625度(注意是电机本身)。而因为这个电机28BYJ-48(12V)是带减速齿轮的,所以最后在输出轴上的步进角是5.625/64=0.08789度(因为减速比是1/64)。最后推导出对于输出轴,是4096个脉冲为一圈(64×64)。电机转64圈,输出轴转1圈。

对电机施加一系列连续不断的控制脉冲时,它可以连续不断的转动。电机启动和停转平稳,可以精确控制转动角度。步进电机转动是需要按照一定的组合以一定的频率给步进电机的4“相”输入脉冲信号,将4个相分别称为A、B、C、D。在这里我们采用4相8拍的方式控制电机的转动,即A-AB-B-BC-C-CD-D-DA-A。。。。。。

步进电机驱动芯片ULN2003:

步进电机28BYJ-48(12V)由芯片ULN2003驱动。ULN2003是高耐压、大电流复合晶体管阵列,由七个硅NPN 复合晶体管组成,每一对达林顿都串联一个2.7K 基极电阻,在5V 工作电压下它能与TTL 和CMOS 电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。ULN2003 工作电压高,工作电流大,灌电流可达500mA,并且能够在关态时承受50V 的电压,输出还可以在高负载电流并行运行。ULN2003多用于单片机、智能仪表、PLC、数字量输出卡等控制电路中,可直接驱动继电器等负载。

ULN2003芯片引脚图如下:

引脚1:脉冲输入端。    引脚2:脉冲输入端。

引脚3:脉冲输入端。    引脚4:脉冲输入端。

引脚5:脉冲输入端。    引脚6:脉冲输入端。

引脚7:脉冲输入端。    引脚8:接地。

引脚9:该脚是内部7个续流二极管负极公共端,各二极管正极分别接各达林顿管的集电极。用于感性负载时,该脚接负载电源正极,实现续流作用。如果该脚接地,实际上就是达林顿管的集电极对地接通。

引脚10:脉冲信号输出端,对应7脚输入端。

引脚11:脉冲信号输出端,对应6脚输入端。

引脚12:脉冲信号输出端,对应5脚输入端。

引脚13:脉冲信号输出端,对应4脚输入端。

引脚14:脉冲信号输出端,对应3脚输入端。

引脚15:脉冲信号输出端,对应2脚输入端。

引脚16:脉冲信号输出端,对应1脚输入端。

51单片机STC15W4K56S4控制步进电机28BYJ-48实例:

步进电机28BYJ-48(12V)驱动电路如下:

步进电机28BYJ-48(12V)控制程序源代码如下:

/******************51单片机步进电机正反转动控制********************

处理器:STC15W4K56S4

功能:步进电机正转和反转循环进行

烧写程序时,选择单片机内部时钟,频率为22.1184M

单片机型号:STC15W4K56S4。

**************************************************************************/

#include "stc15.h"                                         //包含头文件stc15.h

#include <intrins.h>                                      //包含头文件intrins.h

#define MOTOR_STOP 0                            //步进电机停转标志

#define MOTOR_ZZ 1                                 //步进电机正转标志

#define MOTOR_FZ 2                                 //步进电机反转标志

sbit M_CHENG=P2^6;                                //步进电机橙线

sbit M_HUAN=P2^7;                                   //步进电机黄线

sbit M_FENG=P4^5;                                   //步进电机粉线

sbit M_LANG=P4^6;                                   //步进电机蓝线

void delay(unsigned int t);                          //delay延时函数

void delay_us(unsigned int t);                    //delay_us延时函数

void delay_ms(unsigned int t);                   //delay_ms延时函数

void GPIO_MOTOR_Configuration(void); //步进电机控制IO口初始化

void M_STOP(void);                                  //步进电机停转

void M_PHASE1(void);                             //步进电机相位1

void M_PHASE2(void);                             //步进电机相位2

void M_PHASE3(void);                             //步进电机相位3

void M_PHASE4(void);                             //步进电机相位4

void M_PHASE5(void);                             //步进电机相位5

void M_PHASE6(void);                             //步进电机相位6

void M_PHASE7(void);                             //步进电机相位7

void M_PHASE8(void);                             //步进电机相位8

void Timer0_Init(void);                              //定时器0初始化

unsigned char MOTOR_STATE=0;          //步进电机状态

unsigned char Bj_Counter=1;                  //计数变量

/*******************************延时函数******************************/

void delay(unsigned int t){while(t--);}       //delay延时函数

void delay_us(unsigned int t)                  //delay_us延时函数

{unsigned char i;while(t--){i=3;while(i--)delay(1);}}

void delay_ms(unsigned int t)                 //delay_ms延时函数

{while(t--){delay_us(t);}}

/*************************电机控制相关函数**************************/

void GPIO_MOTOR_Configuration(void)    //步进电机控制IO口初始化

{

P2M1=P2M1&0x3f;P2M0=P2M0&0x3f;

P4M1=P4M1&0x9f;P4M0=P4M0&0x9f;

}

void M_STOP(void)                                   //步进电机停转

{M_CHENG=0;M_HUAN=0;M_FENG=0;M_LANG=0;}

void M_PHASE1(void)                              //步进电机相位1

{M_CHENG=1;M_HUAN=0;M_FENG=0;M_LANG=0;}

void M_PHASE2(void)                             //步进电机相位2

{M_CHENG=1;M_HUAN=1;M_FENG=0;M_LANG=0;}

void M_PHASE3(void)                             //步进电机相位3

{M_CHENG=0;M_HUAN=1;M_FENG=0;M_LANG=0;}

void M_PHASE4(void)                             //步进电机相位4

{M_CHENG=0;M_HUAN=1;M_FENG=1;M_LANG=0;}

void M_PHASE5(void)                             //步进电机相位5

{M_CHENG=0;M_HUAN=0;M_FENG=1;M_LANG=0;}

void M_PHASE6(void)                             //步进电机相位6

{M_CHENG=0;M_HUAN=0;M_FENG=1;M_LANG=1;}

void M_PHASE7(void)                             //步进电机相位7

{M_CHENG=0;M_HUAN=0;M_FENG=0;M_LANG=1;}

void M_PHASE8(void)                             //步进电机相位8

{M_CHENG=1;M_HUAN=0;M_FENG=0;M_LANG=1;}

/************************定时器0初始化函数*************************/

void Timer0_Init(void)                          //定时器0初始化

{TMOD=0x01;TH0=0xea;TL0=0x66;TR0=1;ET0=1;EA=1;}

//改变定时时间可以改变步进电机转动速度

/********************************主函数*******************************/

void main(void)

{

GPIO_MOTOR_Configuration();                    //步进电机控制IO口初始化

Timer0_Init();                                                  //定时器0初始化

while(1)

{

MOTOR_STATE=MOTOR_ZZ;                    //步进电机正转

delay_ms(500);delay_ms(500);                   //delay_ms延时函数

MOTOR_STATE=MOTOR_STOP;              //步进电机停转

delay_ms(500);delay_ms(500);                   //delay_ms延时函数

MOTOR_STATE=MOTOR_FZ;                   //步进电机反转

delay_ms(500);delay_ms(500);                  //delay_ms延时函数

MOTOR_STATE=MOTOR_STOP;             //步进电机停转

delay_ms(500);delay_ms(500);                  //delay_ms延时函数

}

}

/***********************定时器0中断处理函数***********************/

void timer0()interrupt 1 using 2                  //定时器0中断处理

{

TH0=0xea;TL0=0x66;                               //3Ms定时

switch(MOTOR_STATE)

{

case MOTOR_STOP:                              //步进电机停转

{M_STOP();}break;

case MOTOR_ZZ:                                   //步进电机正转

{

if(Bj_Counter==1){M_PHASE1();}

else if(Bj_Counter==2){M_PHASE2();}

else if(Bj_Counter==3){M_PHASE3();;}

else if(Bj_Counter==4){M_PHASE4();}

else if(Bj_Counter==5){M_PHASE5();}

else if(Bj_Counter==6){M_PHASE6();}

else if(Bj_Counter==7){M_PHASE7();}

else if(Bj_Counter==8){M_PHASE8();}

}break;

case MOTOR_FZ:                                   //步进电机反转

{

if(Bj_Counter==1){M_PHASE8();}

else if(Bj_Counter==2){M_PHASE7();}

else if(Bj_Counter==3){M_PHASE6();}

else if(Bj_Counter==4){M_PHASE5();}

else if(Bj_Counter==5){M_PHASE4();}

else if(Bj_Counter==6){M_PHASE3();}

else if(Bj_Counter==7){M_PHASE2();}

else if(Bj_Counter==8){M_PHASE1();}

}break;

default:{;}

}

Bj_Counter++;

if(Bj_Counter==9){Bj_Counter=1;}

}

51单片机STC15W4K56S4控制步进电机28BYJ-48正反转相关推荐

  1. 51单片机+L298N控制步进电机【T型】加减速

    本文介绍另一种常见的步进电机[T型]加减速方法 关于L298N模块的使用介绍.以及S型加减速可以上一篇文章,传送门如下: 51单片机+L298N控制步进电机S曲线加减速 1. 与S曲线加减速对比 1. ...

  2. 51单片机红外控制步进电机

    通过红外遥控实现步进电机的步进电机的速度及正反转 #include<reg52.h> //定义一些特殊寄存器typedef unsigned char u8; typedef unsign ...

  3. 基于51单片机+ULN2003控制步进电机S曲线加减速

    目录 1.ULN2003功能简介 2.28BYJ48简介 3.S曲线加减速方法 4.proteus仿真及实物测试 1.ULN2003功能简介 ULN2003比较简单,相关资料也比较多.可以用来驱动四线 ...

  4. 基于51单片机步进电机控速正反转proteus仿真

    本设计是基于51单片机步进电机控速正反转(原理图+源码+仿真) 仿真图proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 编号C0005 [文档]C0005 网盘链接 资 ...

  5. 51单片机+L293D控制直流电机起保停正反转

    51单片机+L293D控制直流电机起保停正反转 仿真效果图 程序代码 #include <STC89C5xRC.H> #define EN1 P22 #define D1 P20

  6. 单片机 c语言百位加上小数点,51单片机水温控制LCD显示加VB上位机温度曲线绘制...

    现功能,1L水由1KW电炉加热,要求水温在一定范围内人工设定,并能随着环境温度改变自动调节,以维持设定的温度不变. 矩阵键盘输入设定温度,LCD1602显示温度值,VB上位机绘制温度曲线 /***** ...

  7. 51单片机+L298驱动步进电机+L297测速+LCD1602显示+按键调试+Proteus仿真

    51单片机+L298驱动步进电机+L297测速+LCD1602显示+按键调试+Proteus仿真 *Proteus仿真 L298N是双H桥式驱动器. L297是步进电机控制集成芯片(包括环形分配器), ...

  8. 【Proteus仿真】51单片机+按键控制步进电机驱动+LCD1602显示

    [Proteus仿真]51单片机+按键控制步进电机驱动+LCD1602显示 Proteus仿真 在Proteus当中,步进电机选取的不同,接线的顺序不同,为了避免在接线出错,将里面的两种步进电机都选择 ...

  9. ESP8266 AT指令设置及51单片机的控制

    ESP8266 AT指令设置及51单片机的控制 (献给正在学习路上的兄弟姐妹们) 对于ESP8266模块好多刚接触的朋友们第一感觉就是价格的确很便宜,然而初次接触它时你也许会对它束手无策,因为关于怎样 ...

最新文章

  1. c语言编程 三角波,周期矩形波、周期锯齿波、周期三角波,C语言程序.doc
  2. iOS开发-开发总结(七)
  3. 课后作业之字符串加密
  4. Hadoop Map/Reduce的工作流
  5. C++起始(内联函数,宏的优缺点,const关键字,auto关键字(C++11)基于范围的for循环(C++11). 指针空值nullptr(C++11))
  6. Ubuntu下GTK的安装、编译和测试
  7. CentOS下RabbitMQ 部署记录
  8. oracle存档模式,Oracle学习系列之如何开启归档模式
  9. 苹果手机各型号的屏幕尺寸
  10. 360数科知微实验室发布反诈报告:揭秘黑灰产数据流转真相
  11. 什么是索引覆盖?什么是索引下推?
  12. Python 爬虫数据写入csv文件中文乱码解决以及天眼查爬虫数据写入csv
  13. python pickle文件大小_无法在Python中加载以前转储的大大小pickle文件
  14. Microbit与Arduino的区别
  15. JDK: Date Process
  16. 留下来慢慢感悟(关于session和cookie)
  17. 38211协议学习笔记(2)-帧结构和物理资源
  18. 第六章网络应用技术(比较简单)
  19. 三菱PLC MC协议的配置和使用简析
  20. ubuntu手贱卸载Python导致桌面有些图标不见解决方案

热门文章

  1. java读取.properties配置文件的几种方法
  2. 生鲜电商,肉少僧多,叮咚买菜“卖”不动?
  3. oracle大写数字转小写,oracle数据库使用游标实现大写数字转换成小写数字
  4. MTK 驱动---MTK平台 电池驱动相关
  5. 北京系列5——颐和园
  6. 计算机科学数学理论浅谈
  7. shell与文本处理
  8. LeetCode 1047. Remove All Adjacent Duplicates In String
  9. PLC、STM32单片机、PC端485modbus通信调试过程
  10. 使用maven手动导入ojdbc14