28BYJ-48步进电机:

步进电机是一种将电脉冲转化为角位移的执行机构。通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。您可以通过控制脉冲个来控制角位移量,从而达到准确定位的目的;同时您可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

步进电机28BYJ48型四相八拍电机,电压为DC5V—DC12V。当对步进电机施加一系列连续不断的控制脉冲时,它可以连续不断地转动。每一个脉冲信号对应步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度(一个步距角)。当通电状态的改变完成一个循环时,转子转过一个齿距。四相步进电机可以在不同的通电方式下运行,常见的通电方式有单(单相绕组通电)四拍(A-B-C-D-A。。。),双(双相绕组通电)四拍(AB-BC-CD-DA-AB-。。。),八拍(A-AB-B-BC-C-CD-D-DA-A。。。)

红线接电源5V,橙色电线接P1.3口,黄色电线接P1.2口,粉色电线接P1.1口,蓝色接P1.0口。

由于单片机接口信号不够大需要通过ULN2003放大再连接到相应的电机接口,如下:

 橙   黄  粉 十六制(P1口) 
 1  0  0  0  0x08
 1  1  0  0  0x0c
 0  1  0  0  0x04
 0  1  1  0  0x06
 0  0  1  0  0x02
 0  0  1  1  0x03
 0  0  0  1  0x01
 1  0  0  1  0x09

顺序刚好相反

所以可以定义旋转相序
uchar code CCW[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};   //逆时钟旋转相序表
uchar code CW[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};    //正时钟旋转相序表

C语言代码:

#include<AT89X52.h>
 #include<intrins.h>
 #define uchar unsigned char
 #define uint unsigned int
 
 uchar code CCW[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};   //逆时钟旋转相序表
 uchar code CW[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};    //正时钟旋转相序表

sbit K1=P3^2;  //反转按键
 sbit K2=P3^3;  //正转按键
 sbit K3=P3^4;  //停止按键
 sbit FMQ=P3^6;  //  蜂鸣器

void delaynms(uint aa)
{
  uchar bb;
  while(aa--)
  {
   for(bb=0;bb<115;bb++)     //1ms基准延时程序
   {
    ;
   }
  }
 
}

void delay500us(void)
{
  int j;
  for(j=0;j<57;j++)
  {
   ;
  }
}

void beep(void)
{
  uchar t;
  for(t=0;t<100;t++)
  {
   delay500us();
 FMQ=!FMQ;   //产生脉冲
  }
  FMQ=1;    //关闭蜂鸣器
}

void motor_ccw(void)
{
  uchar i,j;
  for(j=0;j<8;j++)                 //电机旋转一周,不是外面所看到的一周,是里面的传动轮转了一周
  {
   if(K3==0)
 {
   break;   //如果K3按下,退出此循环
 }
 for(i=0;i<8;i++)  //旋转45度
 {
   P1=CCW[i];
   delaynms(10);   //调节转速
 }
  }
}

void motor_cw(void)
{
  uchar i,j;
  for(j=0;j<8;j++)
  {
   if(K3==0)
 {
   break;   //如果K3按下,退出此循环
 }
 for(i=0;i<8;i++)  //旋转45度
 {
   P1=CW[i];
   delaynms(2);   //调节转速
 }
  }
}

void main(void)
{
 uchar r;
 uchar N=64;          //因为步进电机是减速步进电机,减速比的1/64 ,
       //所以N=64时,步进电机主轴转一圈
 while(1)
 {
   if(K1==0)
   {
    beep();
  for(r=0;r<N;r++)
  {
    motor_ccw();  //电机逆转
    if(K3==0)
    {
     beep();
   break;
    }
  }
   }
   else if(K2==0)
   {
    beep();
        for(r=0;r<N;r++)
  {
    motor_cw();    //电机反转
    if(K3==0)
    {
     beep();
   break;
    }
  }
   }
   else
   P1=0xf0;    //电机停止
 }

}

附:步进电机小知识(转)

1.什么是步进电机?

步进电机是一种将电脉冲转化为角位移的执行机构。通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。您可以通过控制脉冲个来控制角位移量,从而达到准确定位的目的;同时您可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

2.步进电机分哪几种?

步进电机分三种:永磁式(PM),反应式(VR)和混合式(HB)
永磁式步进一般为两相,转矩和体积较小,步进角一般为7.5度 或15度;
反应式步进一般为三相,可实现大转矩输出,步进角一般为1.5度,但噪声和振
动都很大。在欧美等发达国家80年代已被淘汰;
混合式步进是指混合了永磁式和反应式的优点。它又分为两相和五相:两相步进
角一般为1.8度而五相步进角一般为 0.72度。这种步进电机的应用最为广泛。

3.什么是保持转矩(HOLDING TORQUE)?

保持转矩(HOLDING TORQUE)是指步进电机通电但没有转动时,定子锁住转
子的力矩。它是步进电机最重要的参数之一,通常步进电机在低速时的力矩接近
保持转矩。由于步进电机的输出力矩随速度的增大而不断衰减,输出功率也随速
度的增大而变化,所以保持转矩就成为了衡量步进电机最重要的参数之一。比如, 
当人们说2N.m的步进电机,在没有特殊说明的情况下是指保持转矩为2N.m的步
进电机。

4.什么是DETENT TORQUE?

DETENT TORQUE 是指步进电机没有通电的情况下,定子锁住转子的力矩。
DETENT TORQUE 在国内没有统一的翻译方式,容易使大家产生误解;由于
反应式步进电机的转子不是永磁材料,所以它没有DETENT TORQUE。

5.步进电机精度为多少?是否累积?

一般步进电机的精度为步进角的3-5%,且不累积。

6.步进电机的外表温度允许达到多少?

步进电机温度过高首先会使电机的磁性材料退磁,从而导致力矩下降乃至于失步,
因此电机外表允许的最高温度应取决于不同电机磁性材料的退磁点;
一般来讲,磁性材料的退磁点都在摄氏130度以上,有的甚至高达摄氏200度以
上,所以步进电机外表温度在摄氏80-90度完全正常。

7.为什么步进电机的力矩会随转速的升高而下降?

当步进电机转动时,电机各相绕组的电感将形成一个反向电动势;频率越高,反
向电动势越大。在它的作用下,电机随频率(或速度)的增大而相电流减小,从
而导致力矩下降。

8.为什么步进电机低速时可以正常运转,但若高于一定速度就无法启动,并伴有啸叫声?

步进电机有一个技术参数:空载启动频率,即步进电机在空载情况下能够正常启 
动的脉冲频率,如果脉冲频率高于该值,电机不能正常启动,可能发生丢步或堵
转。在有负载的情况下,启动频率应更低。如果要使电机达到高速转动,脉冲频
率应该有加速过程,即启动频率较低,然后按一定加速度升到所希望的高频(电
机转速从低速升到高速)。

9.如何克服两相混合式步进电机在低速运转时的振动和噪声?

步进电机低速转动时振动和噪声大是其固有的缺点,一般可采用以下方案来克服:

A.如步进电机正好工作在共振区,可通过改变减速比等机械传动避开共振区;
B.采用带有细分功能的驱动器,这是最常用的、最简便的方法;
C.换成步距角更小的步进电机,如三相或五相步进电机;
D.换成交流伺服电机,几乎可以完全克服震动和噪声,但成本较高;
E.在电机轴上加磁性阻尼器,市场上已有这种产品,但机械结构改变较大。

10.细分驱动器的细分数是否能代表精度?

步进电机的细分技术实质上是一种电子阻尼技术(请参考有关文献),其主要目
的是减弱或消除步进电机的低频振动,提高电机的运转精度只是细分技术的一个
附带功能。比如对于步进角为1.8°的两相混合式步进电机,如果细分驱动器的
细分数设置为4,那么电机的运转分辨率为每个脉冲0.45°,电机的精度能否达
到或接近0.45°,还取决于细分驱动器的细分电流控制精度等其它因素。不同厂
家的细分驱动器精度可能差别很大;细分数越大精度越难控制。

11.四相混合式步进电机与驱动器的串联接法和并联接法有什么区别?

四相混合式步进电机一般由两相驱动器来驱动,因此,连接时可以采用串联接法
或并联接法将四相电机接成两相使用。串联接法一般在电机转速较的场合使用,
此时需要的驱动器输出电流为电机相电流的0.7倍,因而电机发热小;并联接法
一般在电机转速较高的场合使用(又称高速接法),所需要的驱动器输出电流为 
电机相电流的1.4倍,因而电机发热较大。

12.如何确定步进电机驱动器的直流供电电源?

A.电压的确定

混合式步进电机驱动器的供电电源电压一般是一个较宽的范围(比如IM483
的供电电压为12~48VDC),电源电压通常根据电机的工作转速和响应要
求来选择。如果电机工作转速较高或响应要求较快,那么电压取值也高,但
注意电源电压的纹波不能超过驱动器的最大输入电压,否则可能损坏驱动器。

B.电流的确定

供电电源电流一般根据驱动器的输出相电流I来确定。如果采用线性电源,
电源电流一般可取I的1.1~1.3倍;如果采用开关电源,电源电流一般可
取I 的1.5~2.0倍。

13.混合式步进电机驱动器的脱机信号FREE一般在什么情况下使用?

当脱机信号FREE为低电平时,驱动器输出到电机的电流被切断,电机转子处于自
由状态(脱机状态)。在有些自动化设备中,如果在驱动器不断电的情况下要求
直接转动电机轴(手动方式),就可以将FREE信号置低,使电机脱机,进行手动
操作或调节。手动完成后,再将FREE信号置高,以继续自动控制。

14.如果用简单的方法调整两相步进电机通电后的转动方向?

只需将电机与驱动器接线的A+和A-(或者B+和B-)对调即可。

步进电机 28BYJ-48介绍和驱动及编程的更多相关文章

  1. 梦织未来Windows驱动编程 第03课 驱动的编程规范

    最近根据梦织未来论坛的驱动教程学习了一下Windows下的驱动编程,做个笔记备忘.这是第03课<驱动的编程规范>. 驱动部分包括基本的驱动卸载函数.驱动打开关闭读取写入操作最简单的分发例程 ...

  2. Minifilter微过滤框架:框架介绍以及驱动层和应用层的通讯

    minifilter是sfilter后微软推出的过滤驱动框架.相比于sfilter,他更容易使用,需要程序员做的编码更简洁. 系统为minifilter专门制作了一个过滤管理器,这个管理器本身其实是一 ...

  3. Win64 驱动内核编程-3.内核里使用内存

    内核里使用内存 内存使用,无非就是申请.复制.设置.释放.在 C 语言里,它们对应的函数是:malloc.memcpy.memset.free:在内核编程里,他们分别对应 ExAllocatePool ...

  4. storm介绍,核心组件,编程模型

    一.流式计算概念 利用分布式的思想和方法,对海量“流”式数据进行实时处理,源自业务对海量数据,在“时效”的价值上的挖掘诉求,随着大数据场景应用场景的增长,对流式计算的需求愈发增多,流式计算的一般架构图 ...

  5. 从0开发3D引擎(补充):介绍领域驱动设计

    我们使用领域驱动设计(英文缩写为DDD)的方法来设计引擎,在引擎开发的过程中,领域模型会不断地演化. 本文介绍本系列使用的领域驱动设计思想的相关概念和知识点,给出了相关的资料. 上一篇博文 从0开发3 ...

  6. Win64 驱动内核编程-11.回调监控进线程句柄操作

    无HOOK监控进线程句柄操作 在 NT5 平台下,要监控进线程句柄的操作. 通常要挂钩三个API:NtOpenProcess.NtOpenThread.NtDuplicateObject.但是在 VI ...

  7. Win64 驱动内核编程-8.内核里的其他常用

    内核里的其他常用 1.遍历链表.内核里有很多数据结构,但它们并不是孤立的,内核使用双向链表把它们像糖 葫芦一样给串了起来.所以遍历双向链表能获得很多重要的内核数据.举个简单的例子,驱 动对象 Driv ...

  8. Win64 驱动内核编程-23.Ring0 InLineHook 和UnHook

    Ring0 InLineHook 和UnHook 如果是要在R0里hook,作者的建议是InLine HOOK,毕竟SSDT HOOK 和 SHADOW SSDT HOOK比较麻烦,不好修改.目前R3 ...

  9. Win64 驱动内核编程-13.回调监控模块加载

    回调监控模块加载 模块加载包括用户层模块(.DLL)和内核模块(.SYS)的加载.传统方法要监控这两者加在必须 HOOK 好几个函数,比如 NtCreateSection 和 NtLoadDriver ...

随机推荐

  1. C++复数类对除法运算符 / 的重载

    C8-1 复数加减乘除 (100.0/100.0 points) 题目描述 求两个复数的加减乘除. 输入描述 第一行两个double类型数,表示第一个复数的实部虚部 第二行两个double类型数,表示 ...

  2. 谈谈javascript语法里一些难点问题(一)

    1)    引子 前不久我建立的技术群里一位MM问了一个这样的问题,她贴出的代码如下所示: var a = 1; function hehe() { window.alert(a); var a = ...

  3. Maven构建简单的多模块项目

    复制于http://www.cnblogs.com/luxh/p/3506750.html 做个记录 一般web项目会进行分模块开发.这里简单分为domain(领域层).persist(持久层).se ...

  4. APP成功上线前的bug解决方案

    首先测试用例设计阶段,设计并维护一个各个功能入口的说明文档.其实这个文档的作用很大,一方面对于bug回归阶段的人来说,这是用于提醒的;另外一个方面,在随机测试的时候,随机程度也能有所提高,测试人员能够 ...

  5. [转载]最牛B的编码套路

    原文地址:http://www.codeceo.com/article/nb-coding-style.html 这篇文章很不错,推荐给大家看. 最近,我大量阅读了Steve Yegge的文章.其中有 ...

  6. union、union all 、distinct的区别和用途

    1.从用途上讲 它们都具有去重的效果 2.从效率上讲 distinct通常不建议使用,效率较低;union all 和union 而言,union all效率更高;原因是:union 相当于多表查询出 ...

  7. gulp es6 转 es5

    npm install --save-dev gulp-babel babel-preset-es2015 var babel = require("gulp-babel"); / ...

  8. [Big Data - ELK] ELK(ElasticSearch, Logstash, Kibana)搭建实时日志分析平台

    ELK平台介绍 在搜索ELK资料的时候,发现这篇文章比较好,于是摘抄一小段: 以下内容来自: http://baidu.blog.51cto.com/71938/1676798 日志主要包括系统日志. ...

  9. Python 进制转换与位运算

    十进制转二进制.八进制.十六进制: dec = int(input("输入数字:")) print("十进制数为:", dec) print("转换为 ...

  10. Vue单页面应用

    单页面应用指一个系统只加载一次资源,然后下面的操作交互.数据交互是通过router.ajax来进       行,页面并没有刷新:<1>在vue搭建的环境里面怎么有没有公用的css和js? ...