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

2023-11-06 10:44

本文主要是介绍通过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舵机按角度正反转转动的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/356150

相关文章

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

浅析Spring如何控制Bean的加载顺序

《浅析Spring如何控制Bean的加载顺序》在大多数情况下,我们不需要手动控制Bean的加载顺序,因为Spring的IoC容器足够智能,但在某些特殊场景下,这种隐式的依赖关系可能不存在,下面我们就来... 目录核心原则:依赖驱动加载手动控制 Bean 加载顺序的方法方法 1:使用@DependsOn(最直

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

Spring如何使用注解@DependsOn控制Bean加载顺序

《Spring如何使用注解@DependsOn控制Bean加载顺序》:本文主要介绍Spring如何使用注解@DependsOn控制Bean加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录1.javascript 前言2. 代码实现总结1. 前言默认情况下,Spring加载Bean的顺

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

Python远程控制MySQL的完整指南

《Python远程控制MySQL的完整指南》MySQL是最流行的关系型数据库之一,Python通过多种方式可以与MySQL进行交互,下面小编就为大家详细介绍一下Python操作MySQL的常用方法和最... 目录1. 准备工作2. 连接mysql数据库使用mysql-connector使用PyMySQL3.

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

MySQL精准控制Binlog日志数量的三种方案

《MySQL精准控制Binlog日志数量的三种方案》作为数据库管理员,你是否经常为服务器磁盘爆满而抓狂?Binlog就像数据库的“黑匣子”,默默记录着每一次数据变动,但若放任不管,几天内这些日志文件就... 目录 一招修改配置文件:永久生效的控制术1.定位my.cnf文件2.添加核心参数不重启热更新:高手应

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置