设计分享 | STM32F103RCT6利用ULN2003驱动步进电机正反转

这篇具有很好参考价值的文章主要介绍了设计分享 | STM32F103RCT6利用ULN2003驱动步进电机正反转。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

vx:嵌入式工程师成长日记

https://mp.weixin.qq.com/s?__biz=Mzg4Mzc3NDUxOQ==&mid=2247484170&idx=1&sn=3fa68d0fbf30cf614e8779abf38c3e2b&chksm=cf430652f8348f44e4b95bb7b22ce7f9f5a86e13f421741aefd08cedb169708309c79566ab1f&token=1923877603&lang=zh_CN#rdhttps://mp.weixin.qq.com/s?__biz=Mzg4Mzc3NDUxOQ==&mid=2247484170&idx=1&sn=3fa68d0fbf30cf614e8779abf38c3e2b&chksm=cf430652f8348f44e4b95bb7b22ce7f9f5a86e13f421741aefd08cedb169708309c79566ab1f&token=1923877603&lang=zh_CN#rd

具体功能实现

接通电源后,电机开始正转,转够一圈后,电机开始反转,同时在OLED上会显示forward和reverse分别表示正反转

STM32F103RCT6原理图

设计分享 | STM32F103RCT6利用ULN2003驱动步进电机正反转

器件

STM32F103RCT6,OLED屏,十根杜邦线 ,ULN2003步进电机拓展版,28BYJ-48步进电机

设计分享 | STM32F103RCT6利用ULN2003驱动步进电机正反转

正反转展示图

正转展示图

设计分享 | STM32F103RCT6利用ULN2003驱动步进电机正反转

此时,OLED屏上显示forward,电机正转

反转展示图

设计分享 | STM32F103RCT6利用ULN2003驱动步进电机正反转

此时,OLED上显示reverse,电机反转

03

知识介绍

驱动电机的方法

①1相励磁法:

每一瞬间只有一个线圈相通,其它休息。

优点:简单,耗电低,精确性良好。

缺点:力矩小,振动大,每次励磁信号走的角度都是标称角度。 

 1相励磁法  A->B->C->D

②2相励磁法:

每一瞬间有两个线圈导通。

优点:力矩大,震动小。

缺点:每励磁信号走的角度都是标称角度。

2相励磁法  AB->BC->CD->DA

③1-2相励磁法:

1相和2相交替导通。

优点)精度较高,运转平滑,每送一个励磁信号转动1/2标称角度,称为半步驱动。(前两种称为4相4拍,这一种称为4相8拍)

1-2相励磁法  A-->AB-->B->BC->C-->CD->D-->DA

正转和反转代码(1-2相励磁法)

逆时针:

u8 phasecw[8] =

{0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};

//1000,1100,0100,0110,0010,0011,0001,1001

顺时针:

u8 phaseccw[8]=

{0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};

// 顺时针

//1001,0001,0011,0010,0110,0100,1100,1000

上图是ULN2003步进电机驱动模块,可以看到上面的标号分别是A,B,C,D,因此代码我们可以按这个顺序来理解。

比如:AB是1100,BC是0110,CD是0011等

ULN2003电机驱动模块

上图为驱动模块原理图

ULN2003是高耐压、大电流复合晶体管阵列,由七个硅NPN 复合晶体管组成,每一对达林顿都串联一个2.7K 的基极电阻,在5V 的工作电压下它能与TTL 和CMOS 电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。

步进电机采用五线四相直流电速电机

其中:电压为5V,步进角度为5.625°,减速比为1/64,所以步距角为5.625/64=0.087°

意思就是,电机内部的转自转过5.626°,但是由于减速64倍所以外部的轴只转动0.087°。所需脉冲是360/0.087=4096个,由于采用四相八拍驱动,因此八个脉冲为一个周期,所以外部转动一周需要4096/8=512个周期。

04

主函数代码(C语言)KEIL5实现

main.c(主函数代码)

#include "stm32f10x.h"

#include "delay.h"

#include "step.h"

#include "OLED.h"

int main(void)

{

   Step_Motor_GPIO_Init();

   delay_init();

    OLED_Init();

    OLED_ShowString(1,1,"direction:");

   while(1){

     motorNcircle(1,true);//n为步进电机转动的圈数,position为正转或者反转

delay_ms(20);

motorNcircle(1,false);//n为步进电机转动的圈数,position为正转或者反转

}

}



//step.c(电机驱动函数)

#include "OLED.h"

#include "stdbool.h"

#include "sys.h"

#include "delay.h"

#include "step.h"

u8 phasecw[8] =

{0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};

// 逆时针

//1000,1100,0100,0110,0010,0011,0001,1001

u8 phaseccw[8]=

{0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};

// 顺时针

//1001,0001,0011,0010,0110,0100,1100,1000

//引脚初始化

void Step_Motor_GPIO_Init(void)

{

   GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_7|GPIO_Pin_6|GPIO_Pin_5;

   GPIO_Init(GPIOB,&GPIO_InitStructure);  

}

//引脚映射

void SetMotor(unsigned char InputData)

{

   if(InputData&0x01)

   {

       GPIO_SetBits(GPIOB,GPIO_Pin_5);

   }

   else

   {

       GPIO_ResetBits(GPIOB,GPIO_Pin_5);

   }

   if(InputData&0x02)

   {

       GPIO_SetBits(GPIOB,GPIO_Pin_6);

   }

   else

   {

       GPIO_ResetBits(GPIOB,GPIO_Pin_6);

   }

   if(InputData&0x04)

   {

       GPIO_SetBits(GPIOB,GPIO_Pin_7);

   }

   else

   {

       GPIO_ResetBits(GPIOB,GPIO_Pin_7);

   }

   if(InputData&0x08)

   {

       GPIO_SetBits(GPIOB,GPIO_Pin_8);

   }

   else

   {

       GPIO_ResetBits(GPIOB,GPIO_Pin_8);

   }

}

//步距角5.625 360/5.625=64 减速比1/64

//故64*64个脉冲转一圈

//n圈数

//position 方向

void motorNcircle(int n,bool position)//n为步进电机转动的圈数,position为正转或者反转

{

   int i,j,k=0;

   for(j=0;j<n;j++)

   {

      for(i=0;i<64*5.625;i++)

       {

for(k=0;k<8;k++)

           {

               if(1 == position)

               {

OLED_ShowString(2,1,"forward");

                   SetMotor(phasecw[k]);

               }

               else

               {

OLED_ShowString(2,1,"reverse");

                   SetMotor(phaseccw[k]);

               }

               delay_ms(1);

           }

       }

   }

}

工程文件请在前面vx处领取~

问题解答

Q

为什么stm32需要接ULN2003才能驱动?

A

因为stm32的电流还达不到步进电机所需的最小电流,而ULN2003可以增大stm32的电流,提高驱动能力

设计分享 | STM32F103RCT6利用ULN2003驱动步进电机正反转

 文章来源地址https://www.toymoban.com/news/detail-416178.html

到了这里,关于设计分享 | STM32F103RCT6利用ULN2003驱动步进电机正反转的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RFID课程设计--基于STM32F103RCT6的智能门禁系统,STM32RCT6+RC522+OLED+DHT11+4*4矩阵键盘

      本次课程设计要求如下,我们团队两人完成了90%的功能。   其中我们设置的是刷卡错误3次不报警,密码输入错3次报警(原理相同,大家根据需要自行修改)   然后暂时只能显示卡号和卡是第几个录入到系统中的,想到身份证号和电话(身份信息)输进去有点长就没

    2024年01月16日
    浏览(78)
  • stm32f103rct6引脚功能表格

    脚号 引脚名称 主功能 默认复用 重定义 备注 1             VBAT VBAT -- -- 说明1 2             PC13-TAMPER-RTC PC13 TAMPER-RTC -- 说明3 3             PC14-OSC32_IN PC14 OSC32_IN -- 说明3 4             PC15-OSC32_OUT PC15 OSC32_OUT -- 说明3 5             OSC_IN OSC_IN -- CAN_RX 晶振

    2024年02月06日
    浏览(44)
  • STM32F103RCT6——定时器简单用法

    STM32F10xx参考手册英文和中文版 百度网盘:https://pan.baidu.com/s/1Z2nB0WVJIxvm3VOI9MQiiw 提取码:lxlx STM32F103RCT6数据手册 链接:https://pan.baidu.com/s/1tRchgf-5C1MN4W58vQ9zPg 提取码:lxlx STM32F103RCT6包括,高级控制定时器TIM1和TIM8,通用定时器TIM2-5,基本定时器TIM6和TIM7. 高级控制定时器TIM1,TI

    2024年02月08日
    浏览(54)
  • 从零开始制作STM32F103RCT6小车(一)

            仅以此系列给实验室的学弟学妹作为小车制作教程来使用,后续的内容我会在这个暑假陆续更新出来,本篇的内容是新建一个适用于STM32F103RCT6的工程         接下来的操作几乎是基于STM32F1xx系列的固件库,这里我给大家列出链接 STM32F1xx系列固件库               

    2023年04月08日
    浏览(56)
  • stm32f103rct6使用内部晶振作为时钟源

    stm32f103rct6(库函数版例程)使用内部晶振8M,倍频64M 参考 https://blog.csdn.net/oHuanCheng/article/details/105112884 http://www.openedv.com/forum.php?mod=viewthreadtid=286233 https://blog.csdn.net/ll148305879/article/details/106138302 修改system_stm32f10x.c文件中的void SystemInit(void)函数 内部时钟用到了FLASH,需要添加s

    2024年02月07日
    浏览(149)
  • stm32F103RCT6使用FFT运算分析波形详解(细致教学)

    最近学校电赛队伍招新,出的招新题就是低频示波器的。之前一直没有弄懂FFT,借着这次机会实现了一下,做了一个小示波器 FFT原理简述 FFT,就是快速傅里叶变换,这个操作能够将时域信号转化成频域信号,然后对信号进行分析 这样说可能有点抽象。讲细点就是指能够直观

    2024年02月14日
    浏览(48)
  • STM32F103RCT6 -- 基于FreeRTOS 的USART1 串口通讯

    使用 FreeRTOS 提供的队列(Queue)机制来实现数据的接收和发送 TX - PA9 RX - PA10 波特率:9600 数据位:8bit 校验位:无 停止位:1bit 数据格式: RX: 55 AA 06 00 06 31 02 24 01 FC 80 TX: 55 AA 06 00 06 32 01 24 01 B8 70 55 AA – 帧头 06 - 数据字节数,不包括帧头,不包括校验位 00 06 – 模块 31 02 24

    2024年02月16日
    浏览(41)
  • STM32F103RCT6驱动SG90舵机-完成正反转角度控制

    SG90是一种微型舵机,也被称为伺服电机。它是一种小型、低成本的直流电机,通常用于模型和机器人控制等应用中。SG90舵机可以通过电子信号来控制其精确的位置和速度。它具有体积小、重量轻、响应快等特点,因此在各种小型机械设备上得到了广泛应用。 SG90舵机通常用于

    2024年02月03日
    浏览(61)
  • STM32F103RCT6开发板M3单片机教程06--定时器中断

    除非特别说明,本章节描述的模块应用于整个 STM32F103xx 微控制器系列,因为我们使用是 STM32F103RCT6开发板是mini最小系统板。 本教程使用是( 光明谷SUN_STM32mini开发板 )   首先了解一下是STM32F10X定时器(Timer)   注: 小容量产品是指闪存存储器容量在16K至32K字节之间的STM32F101

    2024年02月04日
    浏览(59)
  • 基于STM32F103RCT6之手把手教你写智能家居项目(2)

            上一节我们简述了智能家居项目,实现了点灯的相关代码编写,还有WIFI模块的固件烧录。 连接什么平台:         我们想要远程控制家具的开关和获取家中的状态,少不了一个可以传输数据的云平台。我认为易监控是一个简单好用的云平台。 怎么连接平台:

    2024年02月20日
    浏览(133)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包