【51单片机】程序实验910.直流电机-步进电机

主要参考学习资料:B站【普中官方】51单片机手把手教学视频

前置知识:C语言

单片机套装:普中STC51单片机开发板A4标准版套餐7

码字不易,求点赞收藏加关注(´•ω•̥`)

有问题欢迎评论区讨论~

目录

  • 程序实验9&10.直流电机-步进电机
    • 直流电机
      • 直流电机介绍
      • ULN2003芯片介绍
      • 硬件设计
      • 实验9 直流电机
    • 步进电机
      • 步进电机介绍
        • 步进电机的工作原理
        • 步进电机的极性
          • 双极性步进电机驱动原理
          • 单极性步进电机驱动原理
          • 细分驱动原理
        • 步进电机的技术指标
        • 28BYJ-48步进电机简介
      • 硬件设计
      • 实验10 步进电机

程序实验9&10.直流电机-步进电机

直流电机

直流电机介绍

直流电机是指能将直流电能转换成机械能(直流电动机)或将机械能转换成直流电能(直流发电机)的旋转电机。

直流电机没有正负极之分,在电机两端加上直流电即可工作,不同的正负极接法决定电机的旋转方向。直流电机有额定电压和额定功率,无法长时间超额工作。

ULN2003芯片介绍

ULN2003是一种用于驱动大功率器件的芯片,如果直接用单片机的GPIO管脚驱动大功率器件则芯片会烧坏或无法驱动。

ULN2003芯片是高耐压、大电流复合晶体管阵列,由七对npn的达林顿管组成,可以驱动电机、继电器、灯等器件。单个独立达林顿管的集电极电流为500mA,在关态时能承受50V的电压,输出可以在高负载电流并行运行。

ULN2003芯片有七对输入输出引脚,GND脚接地,COM脚接达林顿管的公共端电源。由于ULN2003为漏极开路电路,在没有上拉电阻的情况下输出端处于高阻态无法输出高电平,因此电机需通过一端接在VCC电源,另一端接在低电平输出端实现驱动。如果有上拉电阻则可以通过一端输出高电平一端输出低电平驱动电机。

硬件设计

普中A2-A4开发板中ULN2003芯片前五个输入管脚与单片机连接,一个输出管脚控制蜂鸣器,四个输出管脚和电源管脚通过排针引出,以便于连接电机。电机接线如下:

实验9 直流电机

实现功能:直流电机工作约5s后停止

#include "reg52.h"typedef unsigned char u8;
typedef unsigned int u16;//电机连接哪个输出脚则定义哪个为电机控制口
sbit DC_Motor = P1^0;//以毫秒为单位的延时函数
void delay_ms(u16 ms)
{u16 i, j;for(i = ms;i > 0;i--)for(j = 110;j > 0;j--);
}void main()
{//ULN2003芯片内部相当于非门,输入高电平则输出低电平DC_Motor = 1;//延时5秒delay_ms(5000);//输入低电平,输出高阻态DC_Motor = 0;
}

冷启动烧录程序时,先烧录再连接外接设备。

步进电机

步进电机介绍

步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件,电机的转速和停止位置取决于脉冲信号的频率和脉冲数,一个脉冲信号使步进电机旋转一个步距角。

步进电机的工作原理

步进电机的转子通常为永磁体,当电流流过定子会产生矢量磁场带动转子旋转一定的角度使转子的方向与磁场的方向保持一致,电流的方向决定旋转的方向。

步进电机的极性

上图左侧为单极性步进电机,右侧为双极性步进电机。单双极性是指一个步进电机里面有几种电流流向

双极性步进电机驱动原理

上图中,A+A-、B+B-各自控制两个方向的磁极。根据右手螺旋定定则可得,高电平一端为S极,低电平一端为N极。左侧1234通过单相激励(一对磁极工作另一对磁极不工作)实现水平和竖直的四个方向的旋转,右侧1234通过双相激励(两对磁极同时工作)实现四个45°斜方向的旋转。两者结合后可以实现步距角45°的控制。

单极性步进电机驱动原理

单极性有一个公共端VCC和四根相线,电流方向是固定的。公共端是一直通电的,四根相线对每一根通电都可以得到该方向上的S极磁场。左侧为单向激励,右侧为双向激励,两者结合后可以实现步距角45°的控制。公共端为高电平,对哪一相通电则将哪一相输入低电平,其余相输入高电平。

细分驱动原理

如果要进一步缩小步距角,可以在双相激励时分别控制两相的电流大小进而实现磁场的细微变化,哪一相电流更强则转子更偏向哪一相。该方面控制由电机中的一种专门的驱动器执行。

步进电机的技术指标

静态技术指标

相数:步进电机线圈的组数。

拍数:完成一个磁场周期变化所需要的脉冲数。

步距角:一个脉冲信号引起电机旋转的角度。

定位转矩:电机在不通电状态下转轴的锁定力矩。

静转矩:电机在额定静态电压工作下不作旋转运动时转轴的锁定力矩。

动态技术指标

步距角精度:步距角实际值和理论值之间的误差百分比。

失步:电机旋转步数小于理论步数,一般由负载过大或频率过快引起。

失调角:转子磁轴与定子磁轴之间的角度。

最大空载起动频率:电机在不加负载的条件下能够直接起动的最大频率。

最大空载运行频率:电机在不加负载的条件下最高的转速频率。

运行转矩特性:电机运行转矩取决于平均电流而不是静态电流,平均电流越大运行转矩越大。

电机正反转控制:通过改变线圈通电方向改变电机的正反转。

28BYJ-48步进电机简介

本实验用到的步进电机为28BYJ-48步进电机,为五线四相单极性步进电机。

工作通电顺序(GND即设为低电平):

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

电机指标:

电机型号电压(V)相数相电阻(Ω)步进角度减速比100PPS起动转矩(g·cm)起动频率(PPS)定位转矩(g·cm)绝缘耐压(VAC/s)
28BYJ48543005.625/641:64≥300≥500≥300600

硬件设计

步进电机硬件控制部分与直流电机相同,红线接在VCC针,其余四线接在四个输出针。

实验10 步进电机

实现功能:通过ULN2003驱动模块控制28BYJ48步进电机运行方向及速度,当按下KEY1键可调节电机旋转方向,当按下KEY2键电机加速,当按下KEY3键电机减速。

#include "reg52.h"typedef unsigned char u8;
typedef unsigned int u16;//定义步进电机的四个输入端口
sbit IN1_D = P1^0;
sbit IN1_C = P1^1;
sbit IN1_B = P1^2;
sbit IN1_A = P1^3;//定义四个独立按键
sbit KEY1 = P3^1;
sbit KEY2 = P3^0;
sbit KEY3 = P3^2;
sbit KEY4 = P3^3;//宏定义步进电机的速度范围(速度实际为脉冲延时长度,故值越大越慢)
#define STEPMOTOR_MAXSPEED 1
#define STEPMOTOR_MINSPEED 5//毫秒延时函数
void delay_ms(u16 ms)
{u16 i, j;for(i = ms;i > 0;i--)for(j = 110;j > 0;j--);
}//按键扫描函数(见实验3)
u8 key_scan(u8 mode)
{static u8 key = 1;if(mode)key = 1;if(key == 1 && (KEY1 == 0 || KEY2 == 0 || KEY3 == 0 || KEY4 == 0)){key = 0;delay_ms(20);if(KEY1 == 0)return 1;else if(KEY2 == 0)return 2;else if(KEY3 == 0)return 3;else if(KEY4 == 0)return 4;}else if(KEY1 == 1 && KEY2 == 1 && KEY3 == 1 && KEY4 == 1){key = 1;}return 0;
}//步进电机脉冲发送函数,第一个参数为步数序号,第二个参数控制旋转方向,1顺时针0逆时针
void step_motor_28BYJ48_send_pulse(u8 step, u8 dir)
{//存储步数序号的变量u8 temp = step;//如果为逆时针则if(dir == 0)temp = 7 - step;//根据步数序号控制相应端口的电平(参照工作通电顺序表),由于ULN芯片非门作用故取反switch(temp){case 0: IN1_A = 0;IN1_B = 0;IN1_C = 0;IN1_D = 1;break;case 1: IN1_A = 0;IN1_B = 0;IN1_C = 1;IN1_D = 1;break;case 2: IN1_A = 0;IN1_B = 0;IN1_C = 1;IN1_D = 0;break;case 3: IN1_A = 0;IN1_B = 1;IN1_C = 1;IN1_D = 0;break;case 4: IN1_A = 0;IN1_B = 1;IN1_C = 0;IN1_D = 0;break;case 5: IN1_A = 1;IN1_B = 1;IN1_C = 0;IN1_D = 0;break;case 6: IN1_A = 1;IN1_B = 0;IN1_C = 0;IN1_D = 0;break;case 7: IN1_A = 1;IN1_B = 0;IN1_C = 0;IN1_D = 1;break;}
}void main()
{u8 key = 0; //存储按键值变量u8 dir = 0; //转动方向控制变量u8 step = 0; //步数序号控制变量u8 speed = 1; //速度控制变量while(1){key = key_scan(0); //扫描按键if(key == 1){dir = !dir; //KEY1对转动方向取反}else if(key == 2){//KEY2加速if(speed > STEPMOTOR_MAXSPEED)speed--;}else if(key == 3){//KEY3减速if(speed < STEPMOTOR_MINSPEED)speed++;}//输出脉冲信号,step++先传入step参数再对step加一step_motor_28BYJ48_send_pulse(step++, dir);//执行一个周期后重置步数序号if(step == 8)step = 0;//延时控制转速delay_ms(speed);}
}

本篇完

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

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

相关文章

Linux——自定义简单shell

shell 自定义shell目标普通命令和内建命令&#xff08;补充&#xff09; shell实现实现原理实现代码 自定义shell 目标 能处理普通命令能处理内建命令要能帮助我们理解内建命令/本地变量/环境变量这些概念理解shell的运行 普通命令和内建命令&#xff08;补充&#xff09; …

如何把Qt exe文件发送给其他人使用

如何把Qt exe文件发送给其他人使用 1、先把 Debug改成Release2、重新构建项目3、运行项目4、找到release文件夹5、新建文件夹&#xff0c;存放exe文件6、打开qt控制台串口7、下载各种文件8、压缩&#xff0c;发送压缩包给别人 1、先把 Debug改成Release 2、重新构建项目 3、运行…

Kafka的消费消息是如何传递的?

大家好&#xff0c;我是锋哥。今天分享关于【Kafka的消费消息是如何传递的&#xff1f;】面试题。希望对大家有帮助&#xff1b; Kafka的消费消息是如何传递的&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在Kafka中&#xff0c;消息的消费是通过消费…

el-drawer如何实现增加resize拖曳改变宽度大小,通过小图标进行拖拽

请先看效果图 我主要是通过这个按钮来进行拖拽的&#xff0c;记住自行添加按钮图片 第一步 新建一个myDrawerDrag.js文件 import Vue from vueVue.directive(drawerDrag, {bind(el, binding, vnode, oldVnode) {const minWidth 400const dragDom el.querySelector(.el-drawe…

C#窗体简单登录

创建一个Windows登录程序&#xff0c;创建两个窗体&#xff0c;一个用来登录&#xff0c;一个为欢迎窗体&#xff0c;要求输入用户名和密码&#xff08;以个人的姓名和学号分别作为用户名和密码&#xff09;&#xff0c;点击【登录】按钮登录&#xff0c;登录成功后显示欢迎窗体…

【大数据学习 | Spark-SQL】定义UDF和DUAF,UDTF函数

1. UDF函数&#xff08;用户自定义函数&#xff09; 一般指的是用户自己定义的单行函数。一进一出&#xff0c;函数接受的是一行中的一个或者多个字段值&#xff0c;返回一个值。比如MySQL中的&#xff0c;日期相关的dateDiff函数&#xff0c;字符串相关的substring函数。 先…

linux——进程间通信及管道的应用场景

linux进程的控制-CSDN博客 liunx——进程间通信&#xff08;管道通信&#xff09;-CSDN博客 文章目录 文章目录 前言 二、管道的应用 1.创建子进程 1、描述&#xff1a; 2.创建进程及管理 3、子进程接受任务 4、控制子进程 总结 前言 上篇博客我们学习了进程间通信&…

FPGA实现串口升级及MultiBoot(十)串口升级SPI FLASH实现

本文目录索引 工程架构example9工程设计Vivado设计Vitis设计example9工程验证1、读取FLASH ID2、擦除整个FLASH3、Blank-Check4、烧写Golden区位流5、读取FLASH内容6、烧写MultiBoot区位流(升级位流)7、MultiBoot区位流(升级位流)启动example10工程设计Vivado设计Vitis设计exam…

AIGC引领金融大模型革命:未来已来

文章目录 金融大模型的应用场景1. **金融风险管理**2. **量化交易**3. **个性化投资建议**4. **金融欺诈检测和预防**5. **智能客户服务** 金融大模型开发面临的挑战应对策略《金融大模型开发基础与实践》亮点内容简介作者简介获取方式 在AIGC&#xff08;Artificial Intellige…

设计模式学习[10]---迪米特法则+外观模式

文章目录 前言1. 迪米特法则2. 外观模式2.1 原理阐述2.2 举例说明 总结 前言 之前有写到过 依赖倒置原则&#xff0c;这篇博客中涉及到的迪米特法则和外观模式更像是这个依赖倒置原则的一个拓展。 设计模式的原则嘛&#xff0c;总归还是高内聚低耦合&#xff0c;下面就来阐述…

BWO-CNN-BiGRU-Attention白鲸优化算法优化卷积神经网络结合双向门控循环单元时间序列预测,含优化前后对比

BWO-CNN-BiGRU-Attention白鲸优化算法优化卷积神经网络结合双向门控循环单元时间序列预测&#xff0c;含优化前后对比 目录 BWO-CNN-BiGRU-Attention白鲸优化算法优化卷积神经网络结合双向门控循环单元时间序列预测&#xff0c;含优化前后对比预测效果基本介绍模型描述程序设计…

【Linux】死锁、读写锁、自旋锁

文章目录 1. 死锁1.1 概念1.2 死锁形成的四个必要条件1.3 避免死锁 2. 读者写者问题与读写锁2.1 读者写者问题2.2 读写锁的使用2.3 读写策略 3. 自旋锁3.1 概念3.2 原理3.3 自旋锁的使用3.4 优点与缺点 1. 死锁 1.1 概念 死锁是指在⼀组进程中的各个进程均占有不会释放的资源…

Vue3之弹窗

文章目录 第一步、引入JS第二步、弹框 在前端开发语言Vue3&#xff0c;在管理端如何进行弹窗&#xff1f;下面根据API实现效果。 Element API文档&#xff1a; Element-plus文档 搭建环境可参考博客【 初探Vue3环境搭建与nvm使用】 第一步、引入JS <script lang"ts&…

2、Three.js初步认识场景Scene、相机Camera、渲染器Renderer三要素

三要素之间关系&#xff1a; 有了虚拟场景Scene&#xff0c;相机录像Camera&#xff0c;在相机小屏幕上看到的Renderer Scene当前空间 Mesh人在场景 Camera相机录像 Renderer显示器上 首先先描述下Scene&#xff1a; 这个场景为三要素之一&#xff0c;一切需要展示的东西都需…

cin/cout的性能优化和缓冲区同步问题

目录 背景导入 问题 1.1ios::sync_with_stdio(false) 1.2为什么要解除C/C IO流同步? 1.3使用场景 2.1cin和cout的绑定关系 2.2为什么要解除绑定关系? 2.3注意事项 背景导入 大家可以先看一下这段背景知识;后面我会谈谈自己的理解; 1.在C中&#xff0c;标准输⼊输出流…

node.js基础学习-url模块-url地址处理(二)

前言 前面我们创建了一个HTTP服务器&#xff0c;如果只是简单的http://localhost:3000/about这种链接我们是可以处理的&#xff0c;但是实际运用中一般链接都会带参数&#xff0c;这样的话如果我们只是简单的判断链接来分配数据&#xff0c;就会报404找不到链接。为了解决这个问…

基于springboot中小型制造企业质量管理系统源码和论文

信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古以来的…

服务器密码错误被锁定怎么解决?

当服务器密码错误多次导致账号被锁定时&#xff0c;解决方法需要根据服务器的操作系统&#xff08;如 Linux 或 Windows &#xff09;和具体服务器环境来处理。以下是常见的解决办法&#xff1a; 一、Linux 服务器被锁定的解决方法 1. 使用其他用户账号登录 如果有其他未被…

Java基础——(四)继承

1. 类、超类和子类 在Java中&#xff0c;通过关键字extends表示继承。extends表明正在构造的新类派生与一个已存在的类&#xff0c;已存在的类称为超类&#xff08;superclass&#xff09;、基类&#xff08;base class&#xff09;或父类&#xff08;parent class&#xff09…

Python语法基础(四)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 高阶函数之map 高阶函数就是说&#xff0c;A函数作为B函数的参数&#xff0c;B函数就是高阶函数 map&#xff1a;映射 map(func,iterable) 这个是map的基本语法&#xff0c;…