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

news2025/6/26 20:59:20

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()
{
	// 关闭所有led
	led_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.coloradmin.cn/o/1584079.html

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

相关文章

python统计分析——一般线性回归模型

参考资料&#xff1a;python统计分析【托马斯】 当我想用一个或多个其他的变量预测一个变量的时候&#xff0c;我们可以用线性回归的方法。 例如&#xff0c;当我们寻找给定数据集的最佳拟合线的时候&#xff0c;我们是在寻找让下式的残差平方和最小的参数(k,d)&#xff1a; 其…

什么是容器安全,该怎么进行容器安全的检测防护

随着容器技术的迅速发展和普及&#xff0c;越来越多的企业开始采用容器化解决方案来优化应用部署、提高资源利用率和降低成本。然而&#xff0c;在对大规模部署和使用容器应用来提升业务系统开发速度的时候&#xff0c;大量的数据对象、多种安全风险都需要检测&#xff0c;容器…

头歌-机器学习 第11次实验 softmax回归

第1关&#xff1a;softmax回归原理 任务描述 本关任务&#xff1a;使用Python实现softmax函数。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.softmax回归原理&#xff0c;2.softmax函数。 softmax回归原理 与逻辑回归一样&#xff0c;softmax回归同样…

设计模式之迭代器模式(下)

3&#xff09;使用内部类实现迭代器 1.JDK中的迭代器示例 为了能够让迭代器可以访问到聚合对象中的数据&#xff0c;还可以将迭代器类设计为聚合类的内部类 package java.util;public abstract class AbstractList<E> extends AbstractCollection<E> implements…

Electron 桌面端应用的使用 ---前端开发

Electron是什么&#xff1f; Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需要本地开发 经验。 入门…

Adobe After Effects 2024 v24.3 macOS 视频合成及特效制作软件 兼容 M1/M2/M3

Adobe After Effects 是一款适用于视频合成及特效制作软件,是制作动态影像设计不可或缺的辅助工具,是视频后期合成处理的专业非线性编辑软件。 macOS 12.0及以上版本可用 应用介绍 Adobe After Effects简称 AE 是一款适用于视频合成及特效制作软件,是制作动态影像设计不可或缺…

Linux CentOS 安装 MySQL 服务教程

Linux CentOS 安装 MySQL 服务教程 1. 查看系统和GNU C库(glibc)版本信息 1.1 查询机器 glibc 版本信息 glibc&#xff0c;全名GNU C Library&#xff0c;是大多数Linux发行版中使用的C库&#xff0c;为系统和应用程序提供核心的API接口。在Linux系统中&#xff0c;特别是在…

Vue3 使用ElementUI 显示异常

element提供的样例不能正常显示&#xff0c;需要进行配置 1.npm install element-plus --save 2.main.js // main.ts import { createApp } from vue import ElementPlus from element-plus //全局引入 import element-plus/dist/index.css import App from ./App.vue const …

恶意软件现在扫描公司内部的网络是否存在严重漏洞

Palo Alto Networks 的专家发现 &#xff0c;攻击者最近越来越多地采用所谓的“扫描攻击”。此类攻击由恶意软件发起&#xff0c;旨在识别目标网络中的漏洞。 此外&#xff0c;大多数此类攻击的来源是安全网络中的合法设备。犯罪黑客是如何如此狡猾地欺骗计算机专家的呢&#…

Vue2(十五):replace属性、编程式路由导航、缓存路由组件、路由组件独有钩子、路由守卫、history与hash

一、router-link的replace属性 1、作用&#xff1a;控制路由跳转时操作浏览器历史记录的模式 2、浏览器的历史记录有两种写入方式&#xff1a;分别为push和replace&#xff0c;push是追加历史记录&#xff0c;replace是替换当前记录。路由跳转时候默认为push 3、如何开启repla…

Day20_学点儿JavaEE_Cookie、Session

0 会话技术简介 生活中会话 我&#xff1a; 小张&#xff0c;你会跳小苹果码&#xff1f; 小张&#xff1a; 会&#xff0c;怎么了&#xff1f; 我&#xff1a; 公司年会上要表演节目&#xff0c;你教教我把 小张&#xff1a;没问题&#xff0c;一顿饭而已。 我&#xff1a; …

面向对象设计原则实验之“迪米特法则”

每一个软件单位对其它单位都只有最少的知识&#xff0c;而且局限于那些与本单位密切相关的软件单位。 某软件公司所开发 CRM 系统包含很多业务操作窗口。在这些窗口中某些界面控件之间存在复杂的交互关系&#xff0c;一个控件事件的触发将导致多个其他界面控件产生响应。例如&…

社交网络的分布式治理:分析Facebook在区块链社区中的角色

随着区块链技术的快速发展&#xff0c;社交网络的治理模式也逐渐受到关注。传统的社交网络往往由中心化的平台掌控&#xff0c;用户的权力和参与度受到限制&#xff0c;而区块链技术为社交网络的分布式治理提供了新的解决方案。本文将深入探讨社交网络的分布式治理&#xff0c;…

MySQL-创建和管理表:基础知识、创建和管理数据库、创建表、修改表、重命名表、删除表、清空表、拓展

创建和管理表 1. 基础知识1.1 一条数据存储的过程1.2 标识符命名规则1.3 MySQL中的数据类型 2. 创建和管理数据库2.1 创建数据库2.2 使用数据库2.3 修改数据库2.4 删除数据库 3. 创建表3.1 创建方式13.2 创建方式23.3 查看数据表结构 4. 修改表4.1 追加一个列4.2 修改一个列4.3…

虚幻引擎启动报错记录

0x00007FFEF0C8917C (UnrealEditor-CoreUObject.dll)处(位于 UnrealEditor.exe 中)引发的异常: 0xC0000005: 写入位置 0x0000000000000030 时发生访问冲突。 解决办法&#xff1a;首先查看堆栈信息&#xff0c;我的项目启动是因为默认场景编译不过&#xff0c;进到编辑器配置文…

【bash】linux使用环境变量拼接字符串错误

有如下脚本init-env.sh #!/bin/bash export HADOOP_HOME/opt/hadoop export HADOOP_CONF$HADOOP_HOME/conf执行结果&#xff1a; source init-env.sh echo $HADOOP_CONF_DIR # 得到结果&#xff1a;conf/hadoop&#xff0c;预期因该是/opt/hadoop/conf原因就是linux下使用了w…

3.1 基本形式 机器学习

从本章本节开始就开始正式介绍机器学习的算法了&#xff01;我们首先登场的是---------线性模型。 w可以理解为权重&#xff0c;我们的x就是我们的样本点的各个特征数值&#xff0c;最后输出模型f&#xff08;x&#xff09;。其代表我们把样本点带入&#xff0c;以二分类为例&a…

头歌-机器学习 第10次实验 逻辑回归

第1关&#xff1a;逻辑回归核心思想 任务描述 本关任务&#xff1a;根据本节课所学知识完成本关所设置的编程题。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 什么是逻辑回归&#xff1b; sigmoid函数。 什么是逻辑回归 当一看到“回归”这两个字&a…

迷宫 — — 蓝桥杯(动态规划)

迷宫 题目&#xff1a; 输入样例&#xff1a; 3 1 1 1 2 3 4 5 6 7 8 9 2 2 1 3 1 R输出样例&#xff1a; 21思路&#xff1a; 题目大意&#xff1a;给定一个n x m的平面网格&#xff0c;并且每一个格子都有一定的代价&#xff0c;并且设有障碍物和陷阱&#xff0c;障碍物的意…

图书馆自习室|基于SSM的图书馆自习室座位预约小程序设计与实现(源码+数据库+文档)

图书馆自习室目录 基于SSM的图书馆自习室座位预约小程序设计与实现 一、前言 二、系统设计 三、系统功能设计 1、小程序端&#xff1a; 2、后台 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a…