选用的步进电机的型号为28BYJ-48(或MP28GA,5V,转速比1/64),驱动电路选用uln2003芯片的驱动板,其控制时序图如下:

四相八拍:A->AB->B ->BC ->C ->CD ->D ->DA

其A、B、C、D指的是uln2003芯片驱动板的1N1、1N2、1N3、1N4,波形在上表示有输入信号。

此外至少需要4根杜邦线,还需提供一个5V的直流电源,接线方式如下:

PE0接IN1
    PE1接IN2 
    PE2接IN3
    PE3接IN4 
    5V电源(一个是地,一个是正)。

  1. /***************************************************************************//**
  2. * @file : stm32_pio.h
  3. * @brief : STM32F1xx CoX PIO Peripheral Interface
  4. * @version : V1.0
  5. * @date : 28 Feb. 2011
  6. * @author : CooCox
  7. *******************************************************************************/
  8. #ifndef __STM_PIO_H
  9. #define __STM_PIO_H
  10. #include "cox_pio.h"
  11. /***************************************************************************//**
  12. * Define STM32F1xx CoX PIO Peripheral Interface
  13. *******************************************************************************/
  14. extern COX_PIO_PI pi_pio;
  15. #endif
  1. /***************************************************************************//**
  2. * @file : stm32_pio.c
  3. * @brief : STM32F1xx CoX PIO Peripheral Interface
  4. * @version : V1.0
  5. * @date : 28 Feb. 2011
  6. * @author : CooCox
  7. ******************************************************************************/
  8. #include "stm32_pio.h"
  9. #include "stm32f10x.h"
  10. /***************************************************************************//**
  11. * @brief Get pointer to GPIO peripheral due to GPIO port
  12. * @param[in] portNum : Port Number value, should be in range from 0 to 6.
  13. * @return Pointer to GPIO peripheral
  14. *******************************************************************************/
  15. static GPIO_TypeDef* STM32_GetGPIO(uint8_t port)
  16. {
  17. GPIO_TypeDef *pGPIO = COX_NULL;
  18. switch(port)
  19. {
  20. case 0: pGPIO = GPIOA; break;
  21. case 1: pGPIO = GPIOB; break;
  22. case 2: pGPIO = GPIOC; break;
  23. case 3: pGPIO = GPIOD; break;
  24. case 4: pGPIO = GPIOE; break;
  25. case 5: pGPIO = GPIOF; break;
  26. case 6: pGPIO = GPIOG; break;
  27. default: break;
  28. }
  29. return pGPIO;
  30. }
  31. /***************************************************************************//**
  32. * @brief Initializes the PIO peripheral
  33. * @param[in] pio : The specified peripheral
  34. * @return Result, may be :
  35. * -COX_ERROR : Error occurred, parameter is not supported
  36. * -COX_SUCCESS : Previous argument of the specified option
  37. *******************************************************************************/
  38. static COX_Status STM32_PIO_Init (COX_PIO_Dev pio)
  39. {
  40. GPIO_TypeDef* pGPIO = COX_NULL;
  41. uint8_t port, pin;
  42. port = (pio >> 8) & 0xFF;
  43. pin = (pio >> 0) & 0xFF;
  44. pGPIO = STM32_GetGPIO(port);
  45. if(port >6 || port<0 || pin<0 || pin > 15)
  46. return COX_ERROR;
  47. /* Enable GPIO and AFIO clocks */
  48. switch(port)
  49. {
  50. case 0: RCC->APB2ENR |= (RCC_APB2ENR_IOPAEN | RCC_APB2ENR_AFIOEN); break;
  51. case 1: RCC->APB2ENR |= (RCC_APB2ENR_IOPBEN | RCC_APB2ENR_AFIOEN); break;
  52. case 2: RCC->APB2ENR |= (RCC_APB2ENR_IOPCEN | RCC_APB2ENR_AFIOEN); break;
  53. case 3: RCC->APB2ENR |= (RCC_APB2ENR_IOPDEN | RCC_APB2ENR_AFIOEN); break;
  54. case 4: RCC->APB2ENR |= (RCC_APB2ENR_IOPEEN | RCC_APB2ENR_AFIOEN); break;
  55. default: break;
  56. }
  57. return COX_SUCCESS;
  58. }
  59. /***************************************************************************//**
  60. * @brief Set direction (Input or Output)
  61. * @param[in] pio : The specified PIO peripheral
  62. * @param[in] dir : Direction, should be
  63. * -0: Input
  64. * -1: Output
  65. * @return Result, may be :
  66. * -COX_ERROR : Error occurred, parameter is not supported
  67. * -COX_SUCCESS : Previous argument of the specified option
  68. *******************************************************************************/
  69. static COX_Status STM32_PIO_SetDir(COX_PIO_Dev pio, uint8_t dir)
  70. {
  71. GPIO_TypeDef* pGPIO = COX_NULL;
  72. uint8_t port, pin;
  73. port = (pio >> 8) & 0xFF;
  74. pin = (pio >> 0) & 0xFF;
  75. pGPIO = STM32_GetGPIO(port);
  76. /* Direction is input:GPIO_Mode_IN_FLOATING */
  77. if(dir == 0){
  78. if(pin>7)
  79. {
  80. /* Configure the eight high port pins */
  81. pin = pin-8;
  82. /* MODE[1:0]=00 */
  83. pGPIO -> CRH &= ~(0x3 << (pin*4));
  84. /* CNF[1:0] =01 */
  85. pGPIO -> CRH &= ~(0x8 << (pin*4));
  86. pGPIO -> CRH |= (0x4 <<(pin*4));
  87. }
  88. else
  89. {
  90. /* Configure the eight low port pins */
  91. pGPIO -> CRL &= ~(0x3 << (pin*4));
  92. pGPIO -> CRL &= ~(0x8 << (pin*4));
  93. pGPIO -> CRL |= (0x4 << (pin*4));
  94. }
  95. }
  96. /* Direction is output:GPIO_Mode_Out_PP */
  97. else {
  98. if(pin>7)
  99. {
  100. pin = pin-8;
  101. /* MODE[1:0]=11 */
  102. pGPIO -> CRH |= (0x3 <<(pin*4));
  103. /* CNF[1:0] =00 */
  104. pGPIO -> CRH &= ~(0xc <<(pin*4));
  105. }
  106. else
  107. {
  108. pGPIO -> CRL |= (0x3 << (pin*4));
  109. pGPIO -> CRL &= ~(0xc<<(pin*4));
  110. }
  111. }
  112. return COX_SUCCESS;
  113. }
  114. /******************************<span s

uln2003 驱动 继电器及步进电机

由于单片机的驱动能力较弱,使用继电器、步进电机等外设时,一般需要外接5v 12v电源驱动,使用uln2003即可使用小电压控制大电压的通断。
uln2003
uln2003的内部是一组达林顿管,你可以理解为放大倍数很高的三极管,你用到的控制极就是其基极,所以,它有0.7V电压就可以工作了。但一般在使用时,还是要保证提供2V以上,不然可能不会很可靠。
原理图                                                     应用电路
 
单片机的I/O口直接和ULN2003连,ULN2003有16个脚共7路驱动.
ULN2003的8脚接5V电源地,9脚接+5V或12V电源,因为ULN2003里面有续流二极管从9脚引出.
假如你用P1.0驱动一个电机,那么P1.0接ULN2003的1脚,ULN2003的16脚接电机线圈的一端,电机线圈的另一端接+5V电源.P1.0为高电平,电机就转,P1.0为低电平,电机就停.ULN2003驱动电流500MA.
这个器件用起来很简单,它是一个不能输出高电平的反相器,就是说你输入高电平的时候,输出低电平,你输入低电平的时候它就成高阻态(就是电阻很大,可以看成短路,这时如果你加上拉电阻的话输出就会拉成高电平)。
一般他的用法就当成电子开关用,就是你输入高电平的时候它相应的端口会输出低电平,而且这个低电平能吸收的电流达500mA。所以一般就是电机或者其他用电器的一段接ULN2003 的输出口(像接了一个开关然后再接到低)。还有一段接高电平或者电源。使用的时候就把相应的端口置高电平就会打开开关,让电机形成对地的回路,从而让电机运行;如果相应的端口为低电平,输出为高阻态,就像断开了对地的开关,从而不形成回路让电机关闭。
继电器
(继电器型号: hjr-4120-*v   *为线圈控制电压)
一般继电器的外壳有标注,如果没有,自己用万用表测一下也很简单:
1、找出线圈引脚。
用万用表测各引脚间的电阻,阻值在数百至1K欧姆左右的两个脚是线圈引脚。注意有些继电器的线圈分正负极,反接虽然不至于损坏,但不动作。
2、找出常开、常闭点。
用万用表测除线圈之外的四个引脚,导通的两个引脚是常闭关 系,给线圈加上5V(继电器线圈有效电压)直流电,使继电器动作,它们应断开;如果没有断开,则内部是短接关系。
给线圈加上5V(继电器线圈有效电压)直流电,使继电器动作,此时再用万用表测,如果有原来不通的两个引脚导通了,则它们是常开关系。
既与常开点有关系,又与常闭点有关系的引脚,就是公共端。

步进电机
相关特性:
1、 步进电机必须加驱动才可以运转, 驱动信号必须为脉冲信号,没有脉冲的时候,
步进电机静止, 如果加入适当的脉冲信号, 就会以一定的角度(称为步角)转动。转
动的速度和脉冲的频率成正比。
2、28BYJ48 5V 驱动的4 相5 线的步进电机,而且是减速步进电机,减速比为1:64,步进角为5.625/64 度。
如果需要转动1 圈,那么需要360/5.625*64=4096 个脉冲信号。
3、 步进电机具有瞬间启动和急速停止的优越特性。
4、 改变脉冲的顺序, 可以方便的改变转动的方向。
因此,目前打印机,绘图仪,机器人,等等设备都以步进电机为动力核心。
每一个脉冲信号对应步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度(一个步距角)。当通电状态的改变完成一个循环时,转子转过一个齿距。四相步进电机可以在不同的通电方式下运行,常见的通电方式有单(单相绕组通电)四拍(A-B-C-D-A。。。),双(双相绕组通电)四拍(AB-BC-CD-DA-AB-。。。),八拍(A-AB-B-BC-C-CD-D-DA-A。。。)。

采用四拍方式驱动:
将单片机IO(如P1)接到uln2003输入端,将步进电机的信号线对应接到uln2003的输出口,根据上表可以单片机IO口的8个驱动脉冲信号为:
uchar code Step_1[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09}; //逆时钟旋转相序表
uchar code Step_2[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08}; //正时钟旋转相序表
uln2003驱动继电器  步进电机原理图:

28byj48步进电机工作时序图和stm32+uln2003驱动代码

2013-04-30 11:30:41|  分类: 单片机 |  标签:stm32  28byj48  步进电机  |举报|字号 订阅

void init_stepmotor_GPIO(void)

{
//打开时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//GPIO设置
GPIO_InitTypeDef GPIO_InitStructure;   
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;   
GPIO_Init(GPIOA,&GPIO_InitStructure);  
}
void motor_cw(uint32_t circle,uint32_t delay)//circle循环数 delay控制转速
{
uint32_t i,j;
j=2000;
for(i=0;i<=circle;i++)
{
GPIO_Write(GPIOA, 8);
motor_delay(j);
GPIO_Write(GPIOA, 12);
motor_delay(j);
GPIO_Write(GPIOA, 4);
motor_delay(j);
GPIO_Write(GPIOA, 6);
motor_delay(j);
GPIO_Write(GPIOA, 2);
motor_delay(j);
GPIO_Write(GPIOA, 3);
motor_delay(j);
GPIO_Write(GPIOA, 1);
motor_delay(j);
GPIO_Write(GPIOA, 9);
motor_delay(j);
motor_delay(delay);//这个控制转速
}
}
void motor_ccw(uint32_t circle,uint32_t delay)
{
uint32_t i,j;
j=2000;
for(i=0;i<=circle;i++)
{
GPIO_Write(GPIOA, 9);
motor_delay(j);
GPIO_Write(GPIOA, 1);
motor_delay(j);
GPIO_Write(GPIOA, 3);
motor_delay(j);
GPIO_Write(GPIOA, 2);
motor_delay(j);
GPIO_Write(GPIOA, 6);
motor_delay(j);
GPIO_Write(GPIOA, 4);
motor_delay(j);
GPIO_Write(GPIOA, 12);
motor_delay(j);
GPIO_Write(GPIOA, 8);
motor_delay(j);
motor_delay(delay);//这个控制转速
}
}
void motor_delay(uint32_t delay)
{
uint32_t i;
for(i=1;i<delay;i++)
{
asm("nop");
}

28BYJ48型步进电机的控制方法

2011-03-13 23:02:00|  分类: 单片机技术|举报|字号 订阅

  前不久弄到一只28BYJ48型步进电机,没有资料,从网上查找,搜到一些资料,但按照网上介绍的程序实验,都没有成功。后来根据资料的原理部分,试着自己编写了一段程序,经过多次实验调试,终于成功了。

  哈哈,收获不小!!!

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

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

  下面是我写的C语言控制程序实现28BYJ48型步进电机正转五圈然后倒转五圈的效果:

//********************************************************************************
//*  标题:  步进电机正反转演示程序                                               *
//*  文件:  步进电机正反转演示.C                                                 *
//*  日期:  2011-3-13                                                            *
//*  环境:  使用自制单片机最小系统板测试通过                                     *
//********************************************************************************
//*  描述:  28BYJ-48步进电机正反转控制                                           *
//*  电机使用端口:P1.0、P1.1、P1.2、P1.3                                        *
//*  单双八拍工作方式:A-AB-B-BC-C-CD-D-DA                                       *
//********************************************************************************

#include <reg51.h>
#include <intrins.h>

//**********************正向旋转相序表*****************************
unsigned char code FFW[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};

//**********************反向旋转相序表*****************************

unsigned char code REV[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};

//***********************延时子程序********************************

void delay(unsigned int t)
{                          
   unsigned int k;
   while(t--)
   {
     for(k=0; k<125; k++)
     {}
   }
}

//**********************步进电机正转******************************

void  motor_ffw(unsigned int n)
 {
   unsigned char i;
   unsigned int  j;
   for (j=0; j<8*64*n; j++)
    {
      for (i=0; i<8; i++)
        {
          P1 = FFW[i];
         delay(1);
         }
    }
 }

//*********************步进电机反转********************************

void  motor_rev(unsigned int n)
{
    unsigned char i;
  unsigned int  j;
  for (j=0; j<8*64*n; j++)
      {
        for (i=0; i<8; i++)
        {
          P1 = REV[i];
          delay(1);
        }
      }
 }

//*************************主程序*********************************
main()
 {  
   while(1)                    
    { 
       motor_ffw(5);          //电机正转5圈
       delay(1000);
       motor_rev(5);          //电机反转5圈
       delay(1000);

}
 }

STM32+ULN2003驱动步进电机相关推荐

  1. 【Proteus仿真】Arduino+uln2003驱动步进电机+单按键启保停正反转控制

    [Proteus仿真]Arduino+uln2003驱动步进电机+单按键启保停正反转控制 Proteus仿真 功能实现 采用外部中断来获取按键信息 程序代码 #define LED ( 13 )#de ...

  2. 【Proteus仿真】Arduino UNO利用Stepper库实现uln2003驱动步进电机转动

    [Proteus仿真]Arduino UNO利用Stepper库实现uln2003驱动步进电机转动 Proteus仿真 Proteus说明 Proteus软件里面的步进电机的步距角默认是90,和代码中 ...

  3. 【Proteus仿真】Arduino UNO+uln2003驱动步进电机+按键启保停正反转控制

    [Proteus仿真]Arduino UNO+uln2003驱动步进电机+按键启保停正反转控制 Proteus仿真演示 功能说明 正反转采用2和3 引脚外部中断,3和4引脚调节加减速. 示例程序代码 ...

  4. 【Proteus仿真】Arduino UNO+ uln2003驱动步进电机+按键启保停控制

    [Proteus仿真]Arduino UNO+ uln2003驱动步进电机+按键启保停控制 Proteus演示 功能说明 加减速采用外部中断引脚2和3实现调速控制,调速方位,110-250,也就是代码 ...

  5. VSM Studio uln2003驱动步进电机+单按键启保停正反转八拍控制

    VSM Studio uln2003驱动步进电机+单按键启保停正反转八拍控制 Proteus仿真演示 基于51单片机,步进电机采用8节拍控制 VSM Studio代码 /* Main.c file g ...

  6. STM32控制ULN2003驱动步进电机28BYJ-48

    步进电机 步进电动机又称脉冲电动机,是一种将电脉冲信号转换成相应角位移或线位移的电动机.每输入一个脉冲信号,转子就转动一个角度或前进一步,其输出的角位移或线位移与输入的脉冲数成正比,转速与脉冲频率成正 ...

  7. STM32+DRV8711驱动步进电机

    步进电机的驱动原理 步进电机的知识涉及到比较多的东西,这里只是简单介绍一下,关于具体的知识之后再补充. 步进电机的驱动原理时期就是电磁感应现象,给步进电机供电流,然后会产生磁场,再合成磁场的方向,驱动 ...

  8. 【51单片机】 ULN2003模块 驱动步进电机(5线)正反转 代码以及接线图(简单教学,一看就会)

    步进电机有四相(A-B-C-D) 正向转动思路为A→B→C→D 反向转动思路为D→C→B→A 通过给每一相轮流供电,实现电机轴的360度转动 ..以下代码可直接复制使用: #include <r ...

  9. 【Proteus仿真】【STM32单片机】步进电机控制系统设计

    文章目录 一.主要功能 二.硬件资源 三.软件设计 四.实验现象 联系作者 一.主要功能 本项目使用Proteus8仿真STM32单片机控制器,使用ULN2003电机模块.LCD1602模块.按键模块 ...

最新文章

  1. Erlang error?
  2. WindowsPE 第七章 资源表
  3. 用事件标志组实现多事件的单向同步
  4. C# 之不安全代码(2)
  5. mysql在mac上的坑
  6. 图片播放器小项目(详解)
  7. 最近公共祖先_leetcode No.236 二叉树的最近公共祖先
  8. ie11用不了html5,HTML5拖放不能在IE11上运行
  9. nginx php-fpm 安装,Linux下nginx php-fpm安装配置笔记
  10. GDB中应该知道的几个调试方法-转
  11. 怎样追求心仪的女孩子
  12. 形容计算机专业好句子,关于形容专业水平高的句子大全 精于专业的名言警句...
  13. 【mfc】vs2019创建MFC基于对话框的项目没有插入任何代码运行报错:0xC0000005:读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突
  14. 计算机桌面文件如何发送给qq好友,桌面文件如何发到qq
  15. java对接dhl_DHL接口—数据交互
  16. 【英语学习】【医学】20种氨基酸的中英文名称与词源
  17. 华为人工智能atlasA800-9000物理服务器离线安装及CANN安装和MindSpore安装和Tensorflow安装
  18. SDIO wifi Marvell8801/Marvell88w8801 介绍(三) ---- Marvell8801/Marvell88w8801寄存器介绍
  19. ^[A-Za-z\\d]*$ 正则表达式
  20. 计算机大二学什么,本科计算机科学与技术大二下学期学什么,女的适合什么专业好...

热门文章

  1. 1-3 js基础还是看caicia吧(老师说小游戏)
  2. 五子棋 java 课设,五子棋java课程设计
  3. 电路交换,报文交换,分组交换简介与优缺点
  4. 网络工程师知识点整理—第五章:无线通信网
  5. 苹果手机(ipone)点击元素,事件不执行
  6. 测试的职责是什么,就是不当背锅侠
  7. php 短信验证 云之讯,python3.7实现云之讯、聚合短信平台的短信发送功能
  8. 前端常用工具库方法整理
  9. Ubuntu20.04中fastdfs,nginx的安装和配置(apt-get安装nginx添加fastdfs-nginx-module模块)
  10. 音频知识点(5)- VAD/CNG/DTX