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

news2024/11/29 22:37:30

一、前言

本文介绍如何通过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;   // 启动定时器0
    ET0 = 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();   // 初始化定时器0

    while (1) {
        if (pwmWidth > PWM_RESOLUTION) {
            pwmWidth = 0;
        }
    }
}

代码中,使用P1^0引脚作为SG90舵机的控制引脚,并通过定时器0来产生PWM信号。

在Timer0Init函数中,设置定时器0为16位定时器工作方式1,计算并设置初始计数值,启动定时器0,并允许定时器0中断。

在Timer0Interrupt函数中,每次定时器0中断时调整舵机控制引脚的电平状态,并更新定时器0的计数值。

在主函数中,循环检测PWM脉宽是否达到设定的分辨率,如果超过则重新从0开始计数。

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

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

相关文章

公开IP属地信息如何保护用户的隐私?

公开IP属地信息通常涉及与用户或组织的隐私有关&#xff0c;因此在公开此类信息时需要非常小心&#xff0c;以避免侵犯他人的隐私权。以下是触碰底线的几种情况以及如何保护网络安全和用户隐私&#xff1a; 个人隐私保护&#xff1a; 公开IP属地信息可能泄露用户的物理位置&…

5虚拟局域网构建

前面简单介绍了使用交换机连接不同的服务器&#xff0c;这次我们看看怎么搞虚拟局域网。 虚拟局域网&#xff0c;也被称为VLAN&#xff08;Virtual Local Area Network&#xff09;&#xff0c;是一个网络的划分概念&#xff0c;使得一组网络设备可以表现得像在同一个物理网络…

大家都在用的数据安全运维管理系统是哪家?有什么功能?

随着数字化大力发展&#xff0c;越来越多的企业开始重视数据安全&#xff0c;开始采购数据安全运维管理系统。但面对市面上多个品牌的数据安全运维管理系统&#xff0c;企业采购时候往往是蒙圈的。因此不少负责人在问&#xff0c;大家都在用的数据安全运维管理系统是哪家&#…

时间序列预测模型实战案例(八)(Informer)个人数据集、详细参数、代码实战讲解

论文地址->Informer论文地址PDF点击即可阅读 代码地址-> 论文官方代码地址点击即可跳转下载GIthub链接 本文介绍 本篇博客带大家看的是Informer模型进行时间序列预测的实战案例&#xff0c;它是在2019年被提出并在ICLR 2020上被评为Best Paper&#xff0c;可以说Inform…

麒麟操作系统登录双因素认证方案 安当加密

麒麟操作系统安全登录方案可以采取以下几种方式&#xff1a; 账户密码认证&#xff1a;用户登录时需要输入正确的账户和密码&#xff0c;账户和密码是用户登录系统的必要条件。为了保证账户和密码的安全性&#xff0c;可以采用加密算法对密码进行加密存储&#xff0c;并且限制…

CTF工具音频隐写神器MP3stego安装和详细使用方法

音频隐写MP3stego安装和详细使用方法 1.MP3stego介绍&#xff1a;2.MP3stego下载安装&#xff1a;3.MP3stego使用教程&#xff1a;4.MP3stego使用案例&#xff1a;5.MP3stego总结&#xff1a; 1.MP3stego介绍&#xff1a; MP3stego是一个在通用的MP3音频文件中隐写的软件&…

1. Collection,List, Map, Queue

1. java集合框架体系结构图 2. Collection派生的子接口 其中最重要的子接口是&#xff1a; 1&#xff09;List 表示有序可重复列表&#xff0c;重要的实现类有&#xff1a;ArrayList, LinkedList ArrayList特点&#xff1a;底层数组实现&#xff0c;随机查找快&#xff0c;增删…

【FastCAE源码阅读4】VTK OrientationMarkerWidget方向标记组件的使用

FastCAE前处理窗口有个方向指示的组件&#xff0c;会跟踪场景进行旋转&#xff0c;这种设计在很多三维软件都有类似的设计&#xff0c;效果如下图&#xff1a; FastCAE采用的是VTK自带的vtkOrientationMarkerWidget实现的&#xff0c;具体代码如下&#xff1a; void Graph3D…

Springboot在线考试系统 毕业设计-附源码82626

Springboot在线考试系统 摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对在线考试等问题&am…

基于Pytorch框架的LSTM算法(一)——单维度单步滚动预测(2)

#项目说明&#xff1a; 说明&#xff1a;1time_steps滚动预测代码 y_norm scaler.fit_transform(y.reshape(-1, 1)) y_norm torch.FloatTensor(y_norm).view(-1)# 重新预测 window_size 12 future 12 L len(y)首先对模型进行训练&#xff1b; 然后选择所有数据的后wind…

“利用义乌购API揭秘跨境贸易商机:一键获取海量优质商品列表!“

义乌购API可以根据关键词取商品列表。通过调用义乌购API的item_search接口&#xff0c;传入关键词参数&#xff0c;可以获取到符合该关键词的商品列表。 以下是使用义乌购API根据关键词取商品列表的步骤&#xff1a; 注册义乌购开发者账号并获取授权码和密钥。在代码中导入义…

SAP-MM-定义计量单位组

业务场景&#xff1a; 有些物料的计量单位是相同的&#xff0c;为了快速维护物料的计量单位的转换关系&#xff0c;可以创建计量单位组&#xff0c;输入转换关系时&#xff0c;输入组就可以直接转换&#xff0c;不需要单个维护 SPRO-后勤常规-物料主数据-设置关键字段-定义计…

享搭低代码平台:快速构建符合需求的进销存管理系统应用

本文介绍了享搭低代码平台如何赋予用户快速构建进销存管理系统应用的能力。通过在应用商店安装费用进销存管理模板&#xff0c;并通过拖拽方式对模板进行自定义扩充&#xff0c;用户可以快速搭建符合自身需求的进销存管理系统&#xff0c;从而提高管理效率和优化运营。 介绍低代…

shopee、亚马逊卖家如何安全给自己店铺测评?稳定测评环境是关键

大家都知道通过测评可以提升产品的转化率&#xff0c;提升产品的销量&#xff0c;那么做跨境平台的卖家如何安全的给自己店铺测评呢&#xff1f; 无论是亚马逊、拼多多Temu、shopee、Lazada、wish、速卖通、敦煌网、Wayfair、雅虎、eBay、Newegg、乐天、美客多、阿里国际、沃尔…

进销存管理系统如何提高供应链效率?

供应链和进销存系统之间有着密切的联系。进销存系统是供应链管理的一部分&#xff0c;用于跟踪和管理产品的采购、库存和销售。进销存管理是供应链管理的核心流程之一&#xff0c;它有助于提高效率、降低成本、增加盈利&#xff0c;同时确保客户满意度&#xff0c;这对于企业的…

HackTheBox-Starting Point--Tier 1---Ignition

文章目录 一 题目二 实验过程 一 题目 Tags Web、Common Applications、Magento、Reconnaissance、Web Site Structure Discovery、Weak Credentials译文&#xff1a;Web、常见应用、Magento、侦察、网站结构发现、凭证薄弱Connect To attack the target machine, you must …

Docker安装Minio(稳定版)

1、安装 docker pull minio/minio:RELEASE.2021-06-17T00-10-46Z docker run -p 9000:9000 minio/minio:RELEASE.2021-06-17T00-10-46Z server /data 2、访问测试 3、MinIO自定义Access和Secret密钥 要覆盖MinIO的自动生成的密钥&#xff0c;您可以将Access和Secret密钥设为…

干货分享 | 3D WEB轻量化引擎HOOPS Communicator如何读取复杂大模型文件?

HOOPS Communicator是一款简单而强大的工业级高性能3D Web可视化开发包&#xff0c;其主要应用于Web领域&#xff0c;主要加载其专有的SCS、SC、SCZ格式文件&#xff1b;HOOPS还拥有另一个桌面端开发包HOOPS Visualize&#xff0c;主要加载HSF、HMF轻量化格式文件。 两者虽然同…

面向有连接型和面向无连接型

文章目录 面向有连接型和面向无连接型面向有连接型面向无连接型 面向有连接型和面向无连接型 通过网络发送数据&#xff0c;大致可以分为面向有连接与面向无连接两种类型&#xff0c;如下图&#xff1a; 面向有连接型 面向有连接型中&#xff0c;在发送数据之前&#xff0c…

Python Slice函数:数据处理利器详解

引言&#xff1a; 在Python编程中&#xff0c;处理数据是一个非常常见且重要的任务。为了更高效地处理数据&#xff0c;Python提供了许多内置函数和方法。其中&#xff0c;slice()函数是一个非常强大且常用的工具&#xff0c;它可以帮助我们轻松地提取、操作和处理数据。无论是…