通过51单片机控制SG90舵机按角度正反转转动
一、前言
本文介绍如何通过51单片机控制SG90舵机实现角度的正反转转动。SG90舵机是一种常用的微型舵机,具有体积小、重量轻、结构简单等特点,被广泛应用于机器人、遥控模型和各种自动控制系统中。
使用51单片机(STC89C52)作为控制器,利用其强大的IO口和定时器功能来实现对SG90舵机的控制。通过编程控制,可以精确地控制舵机按指定的角度进行正转或反转运动。
舵机的控制是通过脉冲宽度调制(PWM)来实现的。在控制舵机时,需要向舵机发送一系列的脉冲信号,脉冲的宽度决定了舵机的角度位置。通常情况下,SG90舵机的控制脉冲周期为20毫秒,脉冲宽度在0.5毫秒到2.5毫秒之间,对应的角度范围为0度到180度。
为了实现舵机的正反转转动,需要控制脉冲的宽度在不同的范围内,以达到不同的角度位置。通过调整脉冲的宽度和周期,我们可以控制舵机按照我们的要求进行旋转。
下面将介绍如何通过51单片机的IO口和定时器来生成适用于SG90舵机的PWM信号。编写相应的程序,通过调整脉冲宽度来实现舵机的正反转转动,并提供示例代码。


二、SG90电机介绍
SG90电机是一种微型舵机,常用于模型、机器人和其他小型机械装置中。
1. 工作原理: SG90电机基于直流电机的原理,通过PWM(脉宽调制)信号控制舵机转动角度。它由一个电机、减速齿轮组和一个位置反馈电路组成。该反馈电路使用了一个电位器来检测舵机的当前位置并将其反馈给控制电路。
2. 特点:
- 尺寸小巧:SG90电机非常小巧,体积轻盈,适合于空间有限的应用。
- 转动角度范围广:通常情况下,SG90电机可以转动约180度左右,但具体转动范围可以通过控制信号调整。
- 高精度:SG90电机具有较高的转动精度和稳定性,适用于需要精确控制的应用。
- 低功耗:SG90电机功耗较低,可以在低电压下工作。
- 相对经济:相比大型舵机或步进电机,SG90电机价格相对较低,适合在预算有限的项目中使用。
3. 控制方式: 控制SG90电机需要提供PWM信号。以下是控制SG90电机的基本步骤:
- 将SG90电机的VCC引脚连接到正电源(通常为5V),将GND引脚连接到地。
- 将信号线(例如,控制舵机角度的引脚)连接到微控制器或其他控制设备的数字输出引脚。
- 在控制设备上设置指定的PWM输出引脚,并使用相应的编程语言或库发送PWM信号。PWM的工作周期通常为20ms,并且脉宽的范围可以在0.5ms到2.5ms之间调整。
- 根据所发送的PWM信号,SG90电机会转动到相应的角度位置。一般来说,0.5ms的脉宽对应最左端角度,2.5ms的脉宽对应最右端角度,1.5ms的脉宽对应中间位置。具体的脉宽范围和对应的角度可以根据电机型号和要求进行调整。
SG90电机的额定工作电压为4.8V-6V,超过这个范围可能会损坏电机。舵机在运行时会产生一定的电流峰值,在使用时应确保电源能够提供足够的电流。
三、实现代码
3.1 正反转实现-模拟延时
以下是通过51单片机控制SG90舵机按角度正反转转动的实现代码,封装子函数调用:
#include <reg51.h>// 定义IO口连接舵机的引脚
sbit servoPin = P1^0;// 延时函数
void delay(unsigned int time) {unsigned int i, j;for(i = 0; i < time; i++) {for(j = 0; j < 1000; j++);}
}// 控制舵机按指定角度进行正转
void rotateClockwise(unsigned int angle) {unsigned int pulseWidth = 500 + angle * 11.11;unsigned int i;for(i = 0; i < 50; i++) {servoPin = 1; // 输出高电平delay(pulseWidth);servoPin = 0; // 输出低电平delay(20000 - pulseWidth);}
}// 控制舵机按指定角度进行反转
void rotateCounterclockwise(unsigned int angle) {unsigned int pulseWidth = 2500 - angle * 11.11;unsigned int i;for(i = 0; i < 50; i++) {servoPin = 1; // 输出高电平delay(pulseWidth);servoPin = 0; // 输出低电平delay(20000 - pulseWidth);}
}void main() {while(1) {// 正转90度rotateClockwise(90);delay(2000); // 停留2秒// 反转90度rotateCounterclockwise(90);delay(2000); // 停留2秒}
}
3.2 正反转角度控制-PWM控制
下面是使用STC89C52的定时器0和GPIO口来模拟产生PWM信号的实现代码:
#include <reg52.h>#define FREQ_OSC 11059200UL // 单片机工作频率
#define PWM_FREQ 50 // PWM信号频率
#define PWM_RESOLUTION 100 // PWM信号分辨率sbit Servo = P1^0; // SG90舵机控制引脚unsigned int pwmWidth = 0; // PWM脉宽// 定时器0初始化函数
void Timer0Init() {EA = 0; // 关闭总中断TMOD &= 0xF0; // 清除T0控制位TMOD |= 0x01; // 设置T0为工作方式1(16位定时器)TH0 = (65536 - (FREQ_OSC / 12 / PWM_FREQ)) / 256; // 计算并设置初始计数值高8位TL0 = (65536 - (FREQ_OSC / 12 / PWM_FREQ)) % 256; // 计算并设置初始计数值低8位TR0 = 1; // 启动定时器0ET0 = 1; // 允许定时器0中断EA = 1; // 开启总中断
}// 定时器0中断服务函数
void Timer0Interrupt() interrupt 1 {if (pwmWidth > PWM_RESOLUTION) {Servo = 0; // 舵机复位} else {Servo = 1; // 舵机置位}TH0 = (65536 - (FREQ_OSC / 12 / PWM_FREQ)) / 256; // 重新设置计数值高8位TL0 = (65536 - (FREQ_OSC / 12 / PWM_FREQ)) % 256; // 重新设置计数值低8位pwmWidth++; // 每次中断增加PWM脉宽
}// 主函数
void main() {Timer0Init(); // 初始化定时器0while (1) {if (pwmWidth > PWM_RESOLUTION) {pwmWidth = 0;}}
}
代码中,使用P1^0引脚作为SG90舵机的控制引脚,并通过定时器0来产生PWM信号。
在Timer0Init函数中,设置定时器0为16位定时器工作方式1,计算并设置初始计数值,启动定时器0,并允许定时器0中断。
在Timer0Interrupt函数中,每次定时器0中断时调整舵机控制引脚的电平状态,并更新定时器0的计数值。
在主函数中,循环检测PWM脉宽是否达到设定的分辨率,如果超过则重新从0开始计数。
相关文章:
通过51单片机控制SG90舵机按角度正反转转动
一、前言 本文介绍如何通过51单片机控制SG90舵机实现角度的正反转转动。SG90舵机是一种常用的微型舵机,具有体积小、重量轻、结构简单等特点,被广泛应用于机器人、遥控模型和各种自动控制系统中。 使用51单片机(STC89C52)作为控…...
uniapp写一个计算器用于记账(微信小程序,APP)
提要:自己用uniapp写了一个记账小程序(目前是小程序),写到计算器部分,在网上找了别人写的计算器,大多数逻辑都是最简单的,都不能满足一个记账计算器的基本逻辑。与其在网上找来找去,…...
前端的几种网络请求方式
网络请求 node编写接口 这里用到的几个包的作用 express:基于 Node.js 平台,快速、开放、极简的 Web 开发框架,官网:https://www.expressjs.com.cn/cors:用来解决跨域问题body-parser:可以通过 req.body…...
Kubernetes技术与架构-存储 4
如上所示,Kubernetes集群支持动态申请存储资源,即集群管理员可以按照实际的需求动态地申请存储资源,集群管理员需要事先定义一个或者多个StorageClass存储类型的资源,Pod中的容器实例直接引用事先定义的StorageClass存储类型的资源…...
jbase编译与部署的优化
上一篇的演示只是涉及自动编译业务脚本。演示时候工程编译是超级慢的。因为把静态资源放在了Web工程下,每次编译都要拷贝,运行起码是1分钟,不能忍受,为此思考工程结构改解决这个问题,顺带方便开发的发布。运行WebLoade…...
Filter 和 Listener
Filter 表示过滤器。是JavaWeb三大组件(Servlet、Filter、Listener)之一。 过滤器可以把对资源的请求 拦截 下来。浏览器可以访问服务器上所有的资源,而在访问到这些资源之前可以使用过滤器拦截下来,也就是说在访问资源之前会先经…...
【正则表达式】中的“\b“
正则表达式是一种用于匹配字符串的强大工具,它可以用于各种编程语言中,可以用来在文本中查找、替换或验证符合某种规则的内容。 正则表达式中有很多特殊的符号,称为元字符,它们有着特殊的含义和作用。其中,“\b” 是其…...
FPGA高端项目:图像采集+GTP+UDP架构,高速接口以太网视频传输,提供2套工程源码加QT上位机源码和技术支持
目录 1、前言免责声明本项目特点 2、相关方案推荐我这里已有的 GT 高速接口解决方案我这里已有的以太网方案 3、设计思路框架设计框图视频源选择OV5640摄像头配置及采集动态彩条视频数据组包GTP 全网最细解读GTP 基本结构GTP 发送和接收处理流程GTP 的参考时钟GTP 发送接口GTP …...
数据库系统原理与实践 笔记 #7
文章目录 数据库系统原理与实践 笔记 #7数据库设计和E-R模型(续)转换为关系模式具有简单属性的实体集的表示复合属性多值属性联系集的表示模式的冗余—合并 实体-联系设计问题设计问题联系属性的布局 扩展的E-R特性特化概化属性继承特化/概化的设计约束聚集E-R图表示方法总结E-…...
【CesiumJS】(1)Hello world
介绍 Cesium 起源于2011年,初衷是航空软件公司(Analytical Graphics, Inc.)的一个团队要制作世界上最准确、性能最高且具有时间动态性的虚拟地球。取名"Cesium"是因为元素铯Cesium让原子钟非常准确(1967年,人们依据铯原子的振动而对…...
Docker 学习路线 5:在 Docker 中实现数据持久化
Docker 可以运行隔离的容器,包括应用程序和其依赖项,与主机操作系统分离。默认情况下,容器是临时的,这意味着容器中存储的任何数据在终止后都将丢失。为了解决这个问题并在容器生命周期内保留数据,Docker 提供了各种数…...
linux下使用vscode对C++项目进行编译
项目的目录结构 头文件swap.h 在自定义的头文件中写函数的声明。 // 函数的声明 void swap(int a,int b);swap.cpp 导入函数的声明,写函数的定义 #include "swap.h" // 双引号表示自定义的头文件 #include <iostream> using namespace std;// 函…...
LangChain+LLM实战---ChatGPT的即时插件套件制作
英文原文:Instant Plugins for ChatGPT: Introducing the Wolfram ChatGPT Plugin Kit 在一分钟内构建一个新插件 几周前,我们与OpenAI合作发布了Wolfram插件,使ChatGPT可以使用Wolfram语言和Wolfram|Alpha作为工具,在ChatGPT内部…...
包装印刷行业万界星空科技云MES解决方案
印刷业的机械化程度在国内制造行业内算是比较高的,不算是劳动密集型企业。如书本的装订、包装的模切、烫金、糊盒等都已经有了全自动设备。印刷厂除了部分手工必须采用人工外,大部分都可以采用机器,也就意味着可以由少量工人生产出大量产品。…...
Python教程---计算机语言简介
1.计算机编程语言的发展历程 计算机语言发展经历了三个阶段: 机器语言 - 机器语言通过二进制编码来编写程序,打孔织带机。 - 执行效率好,编写起来太麻烦 符号语言(汇编) - 使用符号来代替机器码 - 编写程序时…...
rhcsa-文件内容显示
浏览普通文件内容 浏览文件的命令 命令常用选项说明cat -n 对输出内容中的所有行标注行号 -b 对输出内容中的非空行标注行号 查看文件的内容head-num 指定需要显示文件num行的内容默认查看文前十行的内容tail -num 指定需要显示文件num行的内容 -f 使tail不停的去读取显示文…...
宠物养成猫狗商城门店问诊档案流量主小程序开发
宠物养成猫狗商城门店问诊档案流量主小程序开发 猫狗宠物养成商城门店问诊档案流量主小程序开发,这是一个充满趣味性和创新性的项目。通过将宠物养成游戏与商城、问诊服务、社交功能等相结合,为用户提供一站式的宠物养育体验。 在宠物养成方面&#x…...
应用安全四十二:SSO安全
一、什么是SSO SSO是单点登录(Single Sign On)的缩写,是指在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。这种方式减少了由登录产生的时间消耗,辅助了用户管理,是比较流行的企业业务整合的解决方案之一。 身份验证过程依赖于双方之间的信任关…...
【行云流水线实践】基于“OneBuild”方法对镜像进行快速装箱 | 京东云技术团队
在云原生领域,无论使用哪种编排调度平台,Kubernetes,DockerSwarm,OpenShift等,业务都需要基于镜像进行交付,我们在内部实践“Source-to-image”和链式构建,总而总结出“OneBuild”模式。 其核心…...
软件开发必备神器!一文读懂10款热门看板工具推荐!
看板(Kanban)是一种流行的框架,用于实施敏捷和DevOps软件开发。它要求实时沟通每个人的能力,并全面透明地展示正在进行的工作。工作项目在看板上以可视化方式表示,使项目经理和所有团队成员可以随时查看每个工作的状态…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
