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;将高铁站内部和外部的结构、设施、流线等以更加直观、生动的形式呈现出来。乘客们只需通过手…

幸运的彩票

题目描述 彩票的号码有 6 位数字&#xff0c;若一张彩票的前 3 位上的数之和等于后 3 位上的数之和&#xff0c;则称这张彩票是幸运的。本题就请你判断给定的彩票是不是幸运的。 输入格式 输入在第一行中给出一个正整数 N&#xff08;≤ 100&#xff09;。随后 N 行&#xff0…

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 模块和热插…

LangChain - Output Parsers

文章目录 一、输出解析器 (Output Parsers)快速入门 二、列表解析器三、datetime 日期时间解析器四、枚举解析器五、自动修复解析器六、Pydantic&#xff08;JSON&#xff09;解析器七、重试解析器八、结构化输出解析器 structured 转载改编自&#xff1a; https://python.lang…

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…

【LeetCode热题100】【二叉树】对称二叉树

题目链接&#xff1a;101. 对称二叉树 - 力扣&#xff08;LeetCode&#xff09; 递归解决&#xff0c;如果都空那么相等&#xff0c;否则有一个为空那么不相等&#xff0c;剩下就是都不为空&#xff0c;判断元素是否相等&#xff0c;接着递归判断左边的左子树是否等于右边的右…

安卓的认证测试

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

软件工程、微服务架构风格的概念以及实际应用

微服务架构风格的概念 微服务架构是一种将一个应用程序作为一套小的服务的开发风格&#xff0c;每个服务运行在其自己的进程中&#xff0c;并通常围绕着业务能力组织。这些服务可以通过轻量级的通信机制&#xff08;通常是HTTP RESTful API&#xff09;相互独立部署、扩展和维…

Accuracy准确率,Precision精确率,Recall召回率,F1 score

真正例和真反例是被正确预测的数据&#xff0c;假正例和假反例是被错误预测的数据。然后我们需要理解这四个值的具体含义&#xff1a; TP&#xff08;True Positive&#xff09;&#xff1a;被正确预测的正例。即该数据的真实值为正例&#xff0c;预测值也为正例的情况&#xf…

python-pytorch使用日志0.5.007

python-pytorch使用日志 1. optimizer.zero_grad()和model.zero_grad()的区别2. cbow和skip-gram的训练数据格式3. 获取cbow和skip-gram训练后的中文词向量4. 获取到词向量后可以做什么5. 余弦相似度结果的解释 1. optimizer.zero_grad()和model.zero_grad()的区别 都是清空模…

学习笔记:解决拖延

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;负…

UML 架构图入门介绍 starUML

拓展阅读 常见免费开源绘图工具 OmniGraffle 创建精确、美观图形的工具 UML-架构图入门介绍 starUML UML 绘制工具 starUML 入门介绍 PlantUML 是绘制 uml 的一个开源项目 UML 等常见图绘制工具 绘图工具 draw.io / diagrams.net 免费在线图表编辑器 绘图工具 excalidr…

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;成功搭建起连接物理世界与数字世界的…

从零到精通:JavaScript编程全攻略

目录 前言 JavaScript简介 函数 事件处理 DOM操作 异步编程 错误处理机制 代码性能优化 总结 前言 JavaScript&#xff0c;作为网络时代的产物&#xff0c;自1995年由布兰登艾克&#xff08;Brendan Eich&#xff09;在Netscape Communications Corporation的辉煌岁月…