当前位置: 首页 > news >正文

通过51单片机控制SG90舵机按角度正反转转动

一、前言

本文介绍如何通过51单片机控制SG90舵机实现角度的正反转转动。SG90舵机是一种常用的微型舵机,具有体积小、重量轻、结构简单等特点,被广泛应用于机器人、遥控模型和各种自动控制系统中。

使用51单片机(STC89C52)作为控制器,利用其强大的IO口和定时器功能来实现对SG90舵机的控制。通过编程控制,可以精确地控制舵机按指定的角度进行正转或反转运动。

舵机的控制是通过脉冲宽度调制(PWM)来实现的。在控制舵机时,需要向舵机发送一系列的脉冲信号,脉冲的宽度决定了舵机的角度位置。通常情况下,SG90舵机的控制脉冲周期为20毫秒,脉冲宽度在0.5毫秒到2.5毫秒之间,对应的角度范围为0度到180度。

为了实现舵机的正反转转动,需要控制脉冲的宽度在不同的范围内,以达到不同的角度位置。通过调整脉冲的宽度和周期,我们可以控制舵机按照我们的要求进行旋转。

下面将介绍如何通过51单片机的IO口和定时器来生成适用于SG90舵机的PWM信号。编写相应的程序,通过调整脉冲宽度来实现舵机的正反转转动,并提供示例代码。

image-20230810162124895

image-20230810162054785

二、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舵机是一种常用的微型舵机&#xff0c;具有体积小、重量轻、结构简单等特点&#xff0c;被广泛应用于机器人、遥控模型和各种自动控制系统中。 使用51单片机&#xff08;STC89C52&#xff09;作为控…...

uniapp写一个计算器用于记账(微信小程序,APP)

提要&#xff1a;自己用uniapp写了一个记账小程序&#xff08;目前是小程序&#xff09;&#xff0c;写到计算器部分&#xff0c;在网上找了别人写的计算器&#xff0c;大多数逻辑都是最简单的&#xff0c;都不能满足一个记账计算器的基本逻辑。与其在网上找来找去&#xff0c;…...

前端的几种网络请求方式

网络请求 node编写接口 这里用到的几个包的作用 express&#xff1a;基于 Node.js 平台&#xff0c;快速、开放、极简的 Web 开发框架&#xff0c;官网&#xff1a;https://www.expressjs.com.cn/cors&#xff1a;用来解决跨域问题body-parser&#xff1a;可以通过 req.body…...

Kubernetes技术与架构-存储 4

如上所示&#xff0c;Kubernetes集群支持动态申请存储资源&#xff0c;即集群管理员可以按照实际的需求动态地申请存储资源&#xff0c;集群管理员需要事先定义一个或者多个StorageClass存储类型的资源&#xff0c;Pod中的容器实例直接引用事先定义的StorageClass存储类型的资源…...

jbase编译与部署的优化

上一篇的演示只是涉及自动编译业务脚本。演示时候工程编译是超级慢的。因为把静态资源放在了Web工程下&#xff0c;每次编译都要拷贝&#xff0c;运行起码是1分钟&#xff0c;不能忍受&#xff0c;为此思考工程结构改解决这个问题&#xff0c;顺带方便开发的发布。运行WebLoade…...

Filter 和 Listener

Filter 表示过滤器。是JavaWeb三大组件&#xff08;Servlet、Filter、Listener&#xff09;之一。 过滤器可以把对资源的请求 拦截 下来。浏览器可以访问服务器上所有的资源&#xff0c;而在访问到这些资源之前可以使用过滤器拦截下来&#xff0c;也就是说在访问资源之前会先经…...

【正则表达式】中的“\b“

正则表达式是一种用于匹配字符串的强大工具&#xff0c;它可以用于各种编程语言中&#xff0c;可以用来在文本中查找、替换或验证符合某种规则的内容。 正则表达式中有很多特殊的符号&#xff0c;称为元字符&#xff0c;它们有着特殊的含义和作用。其中&#xff0c;“\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年&#xff0c;初衷是航空软件公司(Analytical Graphics, Inc.)的一个团队要制作世界上最准确、性能最高且具有时间动态性的虚拟地球。取名"Cesium"是因为元素铯Cesium让原子钟非常准确&#xff08;1967年&#xff0c;人们依据铯原子的振动而对…...

Docker 学习路线 5:在 Docker 中实现数据持久化

Docker 可以运行隔离的容器&#xff0c;包括应用程序和其依赖项&#xff0c;与主机操作系统分离。默认情况下&#xff0c;容器是临时的&#xff0c;这意味着容器中存储的任何数据在终止后都将丢失。为了解决这个问题并在容器生命周期内保留数据&#xff0c;Docker 提供了各种数…...

linux下使用vscode对C++项目进行编译

项目的目录结构 头文件swap.h 在自定义的头文件中写函数的声明。 // 函数的声明 void swap(int a,int b);swap.cpp 导入函数的声明&#xff0c;写函数的定义 #include "swap.h" // 双引号表示自定义的头文件 #include <iostream> using namespace std;// 函…...

LangChain+LLM实战---ChatGPT的即时插件套件制作

英文原文&#xff1a;Instant Plugins for ChatGPT: Introducing the Wolfram ChatGPT Plugin Kit 在一分钟内构建一个新插件 几周前&#xff0c;我们与OpenAI合作发布了Wolfram插件&#xff0c;使ChatGPT可以使用Wolfram语言和Wolfram|Alpha作为工具&#xff0c;在ChatGPT内部…...

包装印刷行业万界星空科技云MES解决方案

印刷业的机械化程度在国内制造行业内算是比较高的&#xff0c;不算是劳动密集型企业。如书本的装订、包装的模切、烫金、糊盒等都已经有了全自动设备。印刷厂除了部分手工必须采用人工外&#xff0c;大部分都可以采用机器&#xff0c;也就意味着可以由少量工人生产出大量产品。…...

Python教程---计算机语言简介

1.计算机编程语言的发展历程 计算机语言发展经历了三个阶段&#xff1a; 机器语言 - 机器语言通过二进制编码来编写程序&#xff0c;打孔织带机。 - 执行效率好&#xff0c;编写起来太麻烦 符号语言&#xff08;汇编&#xff09; - 使用符号来代替机器码 - 编写程序时&#xf…...

rhcsa-文件内容显示

浏览普通文件内容 浏览文件的命令 命令常用选项说明cat -n 对输出内容中的所有行标注行号 -b 对输出内容中的非空行标注行号 查看文件的内容head-num 指定需要显示文件num行的内容默认查看文前十行的内容tail -num 指定需要显示文件num行的内容 -f 使tail不停的去读取显示文…...

宠物养成猫狗商城门店问诊档案流量主小程序开发

宠物养成猫狗商城门店问诊档案流量主小程序开发 猫狗宠物养成商城门店问诊档案流量主小程序开发&#xff0c;这是一个充满趣味性和创新性的项目。通过将宠物养成游戏与商城、问诊服务、社交功能等相结合&#xff0c;为用户提供一站式的宠物养育体验。 在宠物养成方面&#x…...

应用安全四十二:SSO安全

一、什么是SSO SSO是单点登录(Single Sign On)的缩写,是指在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。这种方式减少了由登录产生的时间消耗,辅助了用户管理,是比较流行的企业业务整合的解决方案之一。 身份验证过程依赖于双方之间的信任关…...

【行云流水线实践】基于“OneBuild”方法对镜像进行快速装箱 | 京东云技术团队

在云原生领域&#xff0c;无论使用哪种编排调度平台&#xff0c;Kubernetes&#xff0c;DockerSwarm&#xff0c;OpenShift等&#xff0c;业务都需要基于镜像进行交付&#xff0c;我们在内部实践“Source-to-image”和链式构建&#xff0c;总而总结出“OneBuild”模式。 其核心…...

软件开发必备神器!一文读懂10款热门看板工具推荐!

看板&#xff08;Kanban&#xff09;是一种流行的框架&#xff0c;用于实施敏捷和DevOps软件开发。它要求实时沟通每个人的能力&#xff0c;并全面透明地展示正在进行的工作。工作项目在看板上以可视化方式表示&#xff0c;使项目经理和所有团队成员可以随时查看每个工作的状态…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

《Docker》架构

文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器&#xff0c;docker&#xff0c;镜像&#xff0c;k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...