51单片机学习笔记16 小型直流电机和五线四相电机控制

51单片机学习笔记16 小型直流电机和五线四相电机控制

  • 一、电机分类
  • 二、小型直流电机控制
    • 1. 简介
    • 2. 驱动芯片ULN2003D
    • 3. 代码实现
      • dc_motor_utils.c
      • main.c
  • 三、五线四相步进电机控制
    • 1. 步进电机工作原理
    • 2. 构造
    • 3. 极性区分
    • 4. 驱动方式
    • 5. 28BYJ-48步进电机
      • (1)硬件电路
      • (2)驱动控制
      • (3)代码实现
        • dc_motor_5_wire_4_phase_utils.h
        • main.c

一、电机分类

电机可以按不同的标准进行分类,包括其工作原理、结构、用途等,如按工作原理分为直流电机、交流电机; 按结构分有刷电机、无刷电机等。

本文将介绍普通的小型直流电机、五线四相步进电机的控制。

二、小型直流电机控制

1. 简介

本文使用的小型直流电机常用于玩具,两根导线,改变电流强度时改变转速、改变电流方向时改变转向。

2. 驱动芯片ULN2003D

单片机IO口一般无法用来直接驱动直流电机,开发板上可以使用ULN2003D作为直流电机的驱动。该芯片基本规格前文已有介绍:
https://xundh.blog.csdn.net/article/details/128106835

引脚图:
在这里插入图片描述

在这里插入图片描述

电机接在VCC和OUT1引脚。

在这里插入图片描述

3. 代码实现

下面代码实现直流马达转5秒、停5秒,循环重复。

dc_motor_utils.c

#include "dc_motor_utils.h"
#include <reg52.h>// DC Motor 引脚
sbit DC_motor = P1^0;
/**
* @brief DC Motor 启动
*/
void dc_motor_start(void){DC_motor = 1;
}
/**
* @brief DC Motor 停止
*/
void dc_motor_stop(void){DC_motor = 0;
}

main.c

#include "led_utils.h"
#include "dc_motor_utils.h"
#include "common_utils.h"/**
* @brief 主函数
*/
void main()
{// 关闭所有ledled_all_off();while(1){dc_motor_start();delay_ms(1000*5);dc_motor_stop();delay_ms(1000*5);}
}

三、五线四相步进电机控制

1. 步进电机工作原理

步进电机通过逐步地激活内部的线圈来实现精确的旋转运动。五线四相步进电机通过四个独立的线圈(相)来实现控制。当电流通过每个线圈时,它们会产生磁场,与电机内部的永磁体相互作用,从而驱动电机旋转。

2. 构造

五线四相步进电机通常包含两个磁极,每个磁极上有两个线圈,总共四个线圈。这四个线圈可以按照不同的顺序激活,以产生旋转运动。此外,步进电机通常还包含一个中心引脚(共阳或共阴),用于提供电源。
在这里插入图片描述

3. 极性区分

在这里插入图片描述
五线四相步进电机具有五根电路线,其中四根用于控制四个线圈(相),而另一根是共阳或共阴线,用于提供电源。

五线四相步进电机的线圈通常是两个两个连接在一起的,形成四个线圈,每个线圈都与一个相应的控制线相连。

4. 驱动方式

五线四相步进电机通常需要使用四个独立的控制信号来激活每个线圈,以实现步进运动。

5. 28BYJ-48步进电机

28BYJ-48步进电机通常由一个固定的外壳和一个转子组成。外壳内含有四个线圈,而转子上有一个永磁体。转子通过电流激活线圈的方式来旋转。
在这里插入图片描述
28BYJ-48基本参数:

  • 电压: 5V
  • 相数: 4
  • 步进角度:5.625/64
  • 减速比:1:64
    减速比计算:
    在这里插入图片描述

(1)硬件电路

与直流电机驱动使用相同硬件电路。
在这里插入图片描述

(2)驱动控制

驱动28BYJ-48步进电机需要按照正确的顺序激活线圈,并控制电流的方向来实现旋转。

8拍信号与运动节拍表如下:

导线颜色第1步第2步第3步第4步第5步第6步第7步第8步
VCC 红5V5V5V5V5V5V5V5V
D 橙GNDGNDGND
C 黄GNDGNDGND
B 粉GNDGNDGND
A 蓝GNDGNDGND

由于板载芯片可能有问题,我这里外接了ULN2003APC驱动步进电机。
在这里插入图片描述
在这里插入图片描述

(3)代码实现

下面代码实现步进电机的驱动运行,按key3转方向 ,按key5增加速度,增加到最大时速度降为最低。(其实增大速度就是减少延时)

dc_motor_5_wire_4_phase_utils.h
#include "dc_motor_5_wire_4_phase_utils.h"
#include "common_utils.h"// 默认逆时针方向
static u8 dir=0;
// 默认最大速度旋转
static u8 speed=STEPMOTOR_MAXSPEED;
static u8 step=0;
// 1运行中 0停止运行
static u8 run_flag=0;/**
* @brief 向步进电机发送一个脉冲
* @param step 指定步进序号,可选值0~7
* @param dir 方向选择,1:顺时针,0:逆时针
*/
void step_motor_28BYJ48_send_pulse(void){u8 temp=step;if(dir==0)	//如果为逆时针旋转temp=7-step;//调换节拍信号switch(temp)//8个节拍控制:A->AB->B->BC->C->CD->D->DA{case 0: IN1_A=1;IN2_B=0;IN3_C=0;IN4_D=0;break;case 1: IN1_A=1;IN2_B=1;IN3_C=0;IN4_D=0;break;case 2: IN1_A=0;IN2_B=1;IN3_C=0;IN4_D=0;break;case 3: IN1_A=0;IN2_B=1;IN3_C=1;IN4_D=0;break;case 4: IN1_A=0;IN2_B=0;IN3_C=1;IN4_D=0;break;case 5: IN1_A=0;IN2_B=0;IN3_C=1;IN4_D=1;break;case 6: IN1_A=0;IN2_B=0;IN3_C=0;IN4_D=1;break;case 7: IN1_A=1;IN2_B=0;IN3_C=0;IN4_D=1;break;default: IN1_A=0;IN2_B=0;IN3_C=0;IN4_D=0;break;//停止相序	}			
}
/**
* @brief 设置步进电机速度
* @param s 速度值,可选值1~STEPMOTOR_MAXSPEED
*/
void step_motor_28BYJ48_set_speed(u8 s){speed=s;
}
/**
* @brief 增加步进电机速度,加到最头0开始
*/
void step_motor_28BYJ48_increase_speed(void){if(speed>STEPMOTOR_MAXSPEED)speed--;else{speed = STEPMOTOR_MINSPEED;}
}
/**
* @brief 设置步进电机方向
* @param d 方向选择,1:顺时针,0:逆时针
*/
void step_motor_28BYJ48_set_dir(u8 d){dir=d;
}
/**
* @brief 反转步进电机方向
*/
void step_motor_28BYJ48_revert_dir(void){dir=!dir;
}/**
* @brief 启动步进电机
*/
void step_motor_28BYJ48_start(void){run_flag=1;
}
/**
* @brief 运行步进电机
*/
void step_motor_28BYJ48_run(void){if(run_flag==0)return;step_motor_28BYJ48_send_pulse();step++;if(step>7)step=0;delay_ms(speed);
}
/**
* @brief 停止步进电机
*/
void step_motor_28BYJ48_stop(void){run_flag=0;
}
main.c
/**
* @brief 按键3_4回调函数
*/
void key3_4Callback(int keyNum){// key3 转方向 if(keyNum == 3){step_motor_28BYJ48_revert_dir();}else{// key4 增加速度step_motor_28BYJ48_increase_speed();}
}/**
* @brief 主函数
*/
void main()
{step_motor_28BYJ48_set_speed(2);// 顺时针旋转step_motor_28BYJ48_set_dir(1);// 启动步进电机step_motor_28BYJ48_start();key3_init();key4_init();setCallback(key3_4Callback);while(1){// 运行步进电机step_motor_28BYJ48_run();}		
}

本文代码开源地址:
https://gitee.com/xundh/learn51

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/804440.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3D可视化技术亮相高铁站,引领智慧出行新潮流

在科技飞速发展的今天&#xff0c;我们的生活正经历着前所未有的变革。高铁站作为现代交通的重要枢纽&#xff0c;也在不断地创新和进步。 3D可视化技术通过三维立体的方式&#xff0c;将高铁站内部和外部的结构、设施、流线等以更加直观、生动的形式呈现出来。乘客们只需通过手…

Docker容器嵌入式开发:MySQL表的外键约束及其解决方法

本文内容涵盖了使用MySQL创建数据库和表、添加数据、处理字符集错误、解决外键约束问题以及使用SQL查询数据的过程。通过创建表、插入数据和调整字符集等操作&#xff0c;成功解决了数据库表中的字符集问题&#xff0c;并使用INSERT语句向各个表中添加了示例数据。同时&#xf…

MySQL - MySQL的RR隔离级别是如何基于ReadView机制实现的?

RR级别下,这个事务读取一条数据,无论读多少次,都是一个值,别的事务修改数据之后,哪怕提交了,你也是看不到人家修改的值的,这就避免了不可重复读的问题。 同时如果别的事务插入了一些新的数据,你也是读不到的,这样就可以避免幻读问题。这到底是如何实现的呢? 首先我…

《深入Linux内核架构》第1章 简洁和概述

目录 1.1 内核的任务 1.2 实现策略 1.3 内核的组成部分 ​1.3.1 进程、进程切换、调度 1.3.2 UNIX 进程 1.3.3 地址空间和特权级别 1.3.4 页表 1.3.5 物理内存的分配 1.3.6 计时 1.3.7 系统调用 1.3.8 设备驱动程序 1.3.9 网络 1.3.10 文件系统 1.3.11 模块和热插…

AIGC实战——StyleGAN(Style-Based Generative Adversarial Network)

AIGC实战——StyleGAN 0. 前言1. StyleGAN1.1 映射网络1.2 合成网络1.3 自适应实例归一化层1.4 风格混合1.5 随机变化 2. StyleGAN 生成样本3. StyleGAN23.1 权重调制与解调3.2 路径长度正则化3.3 非渐进式增长 4. StyleGAN2 生成样本小结系列链接 0. 前言 StyleGAN (Style-Ba…

安卓的认证测试

1 CTS CTS 是 Android 兼容性测试套件&#xff0c;用于验证设备是否符合 Android 平台的兼容性标准。它包含一系列测试用例&#xff0c;涵盖了设备的各个方面&#xff0c;如硬件功能、软件功能、API 的正确实现等。通过 CTS 测试&#xff0c;设备厂商可以确保其设备符合 Andro…

学习笔记:解决拖延

1 解决拖延&#xff0c;减轻压力的关键心态和方法 1.1 要点梳理 拖延是因为自己一直在逃避&#xff0c;重点是要有效突破逃避圈&#xff0c;进入学习圈&#xff0c;扩展成长圈。 毒蛇曲线&#xff08;见思维导图&#xff09;中越是临近截止期限&#xff0c;拖延的焦虑越上升…

VRRP虚拟路由实验(思科)

一&#xff0c;技术简介 VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;是一种网络协议&#xff0c;用于实现路由器冗余&#xff0c;提高网络可靠性和容错能力。VRRP允许多台路由器共享一个虚拟IP地址&#xff0c;其中一台路由器被选为Master&#xff0c;负…

C++初阶:6.string类

string类 string不属于STL,早于STL出现 看文档 C非官网(建议用这个) C官网 文章目录 string类一.为什么学习string类&#xff1f;1.C语言中的字符串2. 两个面试题(暂不做讲解) 二.标准库中的string类1. string类(了解)2. string类的常用接口说明&#xff08;注意下面我只讲解…

设计模式总结-装饰者模式

模式动机 一般有两种方式可以实现给一个类或对象增加行为&#xff1a; 继承机制&#xff0c;使用继承机制是给现有类添加功能的一种有效途径&#xff0c;通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法。但是这种方法是静态的&#xff0c;用户不能控制增…

Golang-Gin 框架写的免杀平台,内置分离、捆绑等多种BypassAV方式

Golang-Gin 框架写的免杀平台&#xff0c;内置分离、捆绑等多种BypassAV方式 Golang-Gin 框架写的免杀平台&#xff0c;内置分离、捆绑等多种BypassAV方式。 cool 时间线&#xff1a; Golang Gin 框架写的免杀平台- (2021.11.12)Golang Gin 框架写的免杀平台&#xff0c;更…

环境监测站升级选择ARM网关驱动精准数据采集

物联网技术的深入发展和环保需求的不断攀升&#xff0c;API调用网关在环境监测领域的应用正成为科技创新的重要推手。其中&#xff0c;集成了API调用功能的ARM工控机/网关&#xff0c;以其出色的计算性能、节能特性及高度稳定性&#xff0c;成功搭建起连接物理世界与数字世界的…

【教程】App打包成IPA文件类型的四种方法

摘要 本教程总结了将App应用程序打包为IPA包的四种常用方法&#xff0c;包括Apple推荐的方式、iTunes拖入方法、自动编译脚本和解压改后缀名方法。每种方法都有其特点和适用场景&#xff0c;在实际开发中可以根据需求选择合适的方式进行打包。通过本教程&#xff0c;您将了解到…

微服务(狂神)

什么是微服务&#xff1a; 微服务方案&#xff1a; 1. SpringCloud NetFlix 2. Dubbo 3. SpringCloud Alibaba 解决了什么问题&#xff1a; 1. 服务过多&#xff0c;客户端怎么访问 2. 服务过多&#xff0c;服务间怎么传值 3. 服务过多&#xff0c;如何治理 4. 服务过多…

美团一面4/9

面的时候自我感觉良好&#xff0c;复盘感觉答的一坨。。 0怎么比较两个对象 0Integer 不使用new会自动装箱&#xff0c;返回提前创建的。使用new就创建新对象。 1.Object类有什么方法 java中Object类中有哪些常用方法以及作用_java中object的方法有什么用-CSDN博客 2.hash…

基于JSP的网上订餐系统

第一章 绪论 1.1课题背景与意义 自新世纪以来&#xff0c;我国经济发生翻天覆地的变化。中国经济发展迎来空前巨大的机遇与挑战&#xff0c;世界性的发展交流在这三十年较近四十年的时间中整体性上升发展&#xff0c;东西文化的碰撞&#xff0c;不断为国民经济的发展注入新鲜…

大话设计模式——19.责任链模式(Chain of Responsibility Pattern)

简介 使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链&#xff0c;并沿着这条链传递该请求&#xff0c;直到有一个对象处理它为止。 主要有两个核心行为&#xff1a;1.处理请求&#xff1b;2.将请求传递到下一节点 U…

“AI”科普丨Transformer架构图解最强教程!

今天给大家分享一篇关于深度学习模型Transformer的文章。我愿称之为讲解Transformer模型最好的文章。 文章内容主要介绍 Transformer 模型的具体实现&#xff1a; Transformer整体架构 Transformer概览 引入张量 自注意力机制Self-Attention 多头注意力机制Mutil-Head Att…

算法四十天-删除排序链表中的重复元素

删除排序链表中的重复元素 题目要求 解题思路 一次遍历 由于给定的链表是排好序的&#xff0c;因此重复的元素在链表中的出现的位置是连续的&#xff0c;因此我们只需要对链表进行一次遍历&#xff0c;就可以删除重复的元素。 具体地&#xff0c;我们从指针cur指向链表的头节…

光子学,能否催生下一代计算革命?

研究和技术开发在光子计算领域正迅猛增长&#xff0c;其产品也逐渐融入市场。这一新兴的计算技术革命预计将对科学家和工程师的研究能力产生深远影响。 光子技术在加速大规模计算基础设施的数据处理速度方面展现出巨大的潜力&#xff0c;同时有可能显著降低网络及通讯的能耗。该…