当前位置: 首页 > article >正文

uln2003驱动28BYJ-48步进电机

欢迎入群共同学习交流
时间记录:2024/11/2

一、模块解析

1.uln2003
uln2003
E脚:接GND
COM脚:接VCC外部电源
1-7B:输入引脚
1-7C:输出引脚,输入与输出反向
    无法输出高电平,外围电路需要接上拉电路输出高电平,是一种反向达林顿管,用于高电流高电压器件控制
2.28BYJ-48步进电机
四相五线步进电机
四相八步示意图,正为公共端接5V,然后A-D端低电平线圈会通电产生电磁推动转子转动,由于步进电机内部是由多个齿轮组成的,根据手册控制齿轮转1圈360°外部转子齿轮转动5.625°,8拍(步)减速比为64,即1步的步距角为5.625°/64。

电压A-B-C-D
10-1-1-1
20-0-1-1
31-0-1-1
41-0-0-1
51-1-0-1
61-1-0-0
71-1-1-0
80-1-1-0

转动顺序A->AB->B->BC->C->CD->D->DA
四步转动顺序A->B->C->D或者AB->BC->CD->DA,减速比为32

二、STM32单片机示例程序

头文件

#ifndef __STEPMOTOR_H__
#define __STEPMOTOR_H__

#include "stm32f10x.h"

typedef enum __STEPMOTOR_ROTATION
{
    STEPMOTORGO = 0,
    STEPMOTORBACK
}STEPMOTORDIR;

#define STEPMOTORMAXSPEED 0.9
#define STEPMOTORMINSPEED 4.5

void stepmotorInit(void);
void stepmotorRotate(float angle, STEPMOTORDIR dir, float speed);

#endif

源程序

#include "stepmotor.h"
#include "delay.h"
#include "math.h"

#define IN1A(bit) GPIO_WriteBit(GPIOA, GPIO_Pin_0, bit)
#define IN2B(bit) GPIO_WriteBit(GPIOA, GPIO_Pin_1, bit)
#define IN3C(bit) GPIO_WriteBit(GPIOA, GPIO_Pin_2, bit)
#define IN4D(bit) GPIO_WriteBit(GPIOA, GPIO_Pin_3, bit)

static void stepmotorSetDuty(u8 step, u8 direction); // A->AB->B->BC->C->CD->D->DA

void stepmotorInit(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

static void stepmotorSetDuty(u8 step, u8 direction)
{
    u8 tempStep = step; // 1个脉冲对应5.625/64°
    if(direction == STEPMOTORBACK)
        tempStep = 7-step;

    switch(tempStep)
    {
        case 0:
            IN1A(Bit_SET);IN2B(Bit_RESET);IN3C(Bit_RESET);IN4D(Bit_RESET);break;
        case 1:
            IN1A(Bit_SET);IN2B(Bit_SET);IN3C(Bit_RESET);IN4D(Bit_RESET);break;
        case 2:
            IN1A(Bit_RESET);IN2B(Bit_SET);IN3C(Bit_RESET);IN4D(Bit_RESET);break;
        case 3:
            IN1A(Bit_RESET);IN2B(Bit_SET);IN3C(Bit_SET);IN4D(Bit_RESET);break;
        case 4:
            IN1A(Bit_RESET);IN2B(Bit_RESET);IN3C(Bit_SET);IN4D(Bit_RESET);break;
        case 5:
            IN1A(Bit_RESET);IN2B(Bit_RESET);IN3C(Bit_SET);IN4D(Bit_SET);break;
        case 6:
            IN1A(Bit_RESET);IN2B(Bit_RESET);IN3C(Bit_RESET);IN4D(Bit_SET);break;
        case 7:
            IN1A(Bit_SET);IN2B(Bit_RESET);IN3C(Bit_RESET);IN4D(Bit_SET);break;
    }
}

void stepmotorRotate(float angle, STEPMOTORDIR dir, float speed)
{
    int stepNum = (int)round(angle*64/5.625);

    for(int i=0;i<stepNum;i++)
    {
        stepmotorSetDuty(i%8, dir);
        delayUs(speed*1000);
    }
}

主程序

#include "stm32f10x.h"
#include "delay.h"
#include "stepmotor.h"

int main()
{
    delayInit();
    stepmotorInit();
    stepmotorRotate(360.0f, STEPMOTORBACK, STEPMOTORMINSPEED);

    while(1)
    {
    }
}


http://www.kler.cn/a/377032.html

相关文章:

  • 《C++11》右值引用深度解析:性能优化的秘密武器
  • maven之插件调试
  • 数仓建模:如何判断一个数仓模型的好坏?
  • 【PPTist】批注、选择窗格
  • Kafka如何实现顺序消费?
  • springboot 集成 etcd
  • 图像识别基础认识
  • 网安学习之信息收集
  • [产品管理-55]:产品设计不仅仅完成功能,即可用性设计,还需要完成可生产性、可装配性、可维护性、可回收性、可服务性设计
  • npm入门教程4:npm基本操作
  • 什么是Web3D交互展示?有什么优势?
  • Linux docker 部署redis详解
  • js,ts控制流程
  • SAP ABAP开发学习——BADI增强操作步骤示例1
  • 《Baichuan-Omni》论文精读:第1个7B全模态模型 | 能够同时处理文本、图像、视频和音频输入
  • 【Python】深度剖析Python中的可迭代对象与迭代器——掌握高级迭代器实现与应用
  • Oracle视频基础1.3.8与1.4.1练习
  • FRIENDLYARM Tiny6410 superboot烧写进sd卡教程
  • C#-值类型、引用类型
  • ctfshow web文件上传 web166-170
  • elementUI table 多级表头隔行变背景颜色
  • 从零开始构建 ChatGPT
  • 2024 Rust现代实用教程 Trait特质
  • 15分钟学 Go 第 27 天:路由和处理请求
  • 实际案例说明用基于FPGA的原型来测试、验证和确认IP——如何做到鱼与熊掌兼得?
  • vue 禁用element-ui calendar 取消非本月日期的点击事件