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

STM32F103RCT6驱动SG90舵机-完成正反转角度控制

一、SG90舵机介绍

SG90是一种微型舵机,也被称为伺服电机。它是一种小型、低成本的直流电机,通常用于模型和机器人控制等应用中。SG90舵机可以通过电子信号来控制其精确的位置和速度。它具有体积小、重量轻、响应快等特点,因此在各种小型机械设备上得到了广泛应用。

SG90舵机通常用于各种小型机械设备中,例如:

模型控制:SG90舵机可以用于遥控汽车、飞机、船只和其他模型的转向、加速和刹车等控制。

机器人控制:SG90舵机也广泛应用于机器人领域,例如可以控制机器人的头部旋转、臂部移动等。

相机云台:SG90舵机可以用于控制相机的运动,例如实现云台的左右旋转和上下移动。

自动化系统:在一些自动化系统中,SG90舵机可以用来控制小型机械臂或手指的运动。

总之,SG90舵机适用于需要精确定位和紧凑设计的应用场景。

image-20230411101929057

img

二、普通IO口模拟PWM驱动SG90舵机

以下是一个简单的示例代码,用于通过PB5普通IO口产生模拟PWM信号来控制SG90舵机正向旋转和反向旋转:

#include "stm32f10x.h"#define PWM_FREQ 50  // 设置PWM信号频率为50Hz
#define SERVO_MIN_PULSE_WIDTH 500  // 舵机最小脉宽500us
#define SERVO_MAX_PULSE_WIDTH 2500  // 舵机最大脉宽2500usvoid delay_us(uint32_t us) {uint32_t count = us * (SystemCoreClock / 1000000) / 9;while(count--);
}void servo_rotate(uint16_t pulse_width) {GPIO_SetBits(GPIOB, GPIO_Pin_5);  // 设置PB5输出高电平delay_us(pulse_width);  // 延时等待脉宽结束GPIO_ResetBits(GPIOB, GPIO_Pin_5);  // 设置PB5输出低电平delay_us(20000 - pulse_width);  // 延时保持50Hz的PWM周期
}int main(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  // 使能GPIOB时钟GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;  // PB5口GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  // 推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  // 最大输出频率为50MhzGPIO_Init(GPIOB, &GPIO_InitStructure);while(1) {// 控制舵机正向旋转360°for (int i = SERVO_MIN_PULSE_WIDTH; i <= SERVO_MAX_PULSE_WIDTH; i += 10) {servo_rotate(i);}for (int i = SERVO_MAX_PULSE_WIDTH; i >= SERVO_MIN_PULSE_WIDTH; i -= 10) {servo_rotate(i);}// 控制舵机反向旋转360°for (int i = SERVO_MAX_PULSE_WIDTH; i >= SERVO_MIN_PULSE_WIDTH; i -= 10) {servo_rotate(i);}for (int i = SERVO_MIN_PULSE_WIDTH; i <= SERVO_MAX_PULSE_WIDTH; i += 10) {servo_rotate(i);}}
}

在这个代码中,我们首先定义了PWM频率以及舵机的最小和最大脉宽。然后,我们实现了一个延时函数delay_us(),用于产生指定微秒数的延时。接下来,我们实现了一个servo_rotate()函数,用于控制舵机的旋转。

servo_rotate()函数中,我们将PB5口设置为高电平,并延时等待一段时间,使得舵机旋转到相应的角度;然后将PB5口设置为低电平,延时保持PWM周期的长度,以达到模拟PWM信号的效果。

在主函数中,我们通过循环控制舵机旋转360度,并在正向和反向旋转之间进行切换。具体来说,我们通过循环执行servo_rotate()函数,并改变脉宽的值,实现舵机的旋转。

需要注意的是,这个示例代码只是一个简单的演示,实际使用中可能需要根据舵机的具体型号和应用场景进行调整。同时,由于使用的是延时产生模拟PWM信号,因此控制的精度可能会受到其他因素的影响,如果需要更高的控制精度,可以考虑使用硬件定时器来产生PWM信号。

三、通过定时器输出PWM控制SG90舵机

(1)配置定时器4的通道1为PWM模式,并且设置频率为50Hz,占空比为5%~10%。

代码如下:

// 开启TIM4时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);// 定时器4 PWM模式配置
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 1999;   // 72M / (2*2000) = 18KHz
TIM_TimeBaseStructure.TIM_Prescaler = 35;  // 分频系数36
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);// 定时器4通道1 PWM输出配置
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 100;           // 初始值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM4, &TIM_OCInitStructure);// 开启定时器4
TIM_Cmd(TIM4, ENABLE);

(2)使用定时器4的通道1输出PWM信号,使舵机正向旋转360°,即将占空比由5%10%逐渐增加至12.5%2.5%。代码如下:

for (int i = 100; i <= 250; i += 10) {TIM_SetCompare1(TIM4, i);delay_ms(50);
}

(3)使用定时器4的通道1输出PWM信号,使舵机反向旋转360°,即将占空比由12.5%2.5%逐渐减小至5%10%。代码如下:

for (int i = 250; i >= 100; i -= 10) {TIM_SetCompare1(TIM4, i);delay_ms(50);
}

在上面的代码中,delay_ms()函数是一个简单的延时函数,用于控制每次占空比变化后等待一段时间再进行下一步操作。需要自己实现这个函数。

另外,SG90舵机正向旋转和反向旋转的具体占空比可能有所不同,需要根据实际情况调整代码中的占空比值。

相关文章:

STM32F103RCT6驱动SG90舵机-完成正反转角度控制

一、SG90舵机介绍 SG90是一种微型舵机&#xff0c;也被称为伺服电机。它是一种小型、低成本的直流电机&#xff0c;通常用于模型和机器人控制等应用中。SG90舵机可以通过电子信号来控制其精确的位置和速度。它具有体积小、重量轻、响应快等特点&#xff0c;因此在各种小型机械…...

【4.13(补)】二叉搜索树的遍历、插入、删除

文章目录二叉搜索树的最近公共祖先二叉搜索树中的插入操作删除二叉搜索树中的节点二叉搜索树的最近公共祖先 235. 二叉搜索树的最近公共祖先 - 力扣&#xff08;LeetCode&#xff09; 因为二叉搜索树是有序的&#xff0c;第一次找到p和q中间的值&#xff0c;就是最近的公共祖先…...

Web 攻防之业务安全:Callback自定义测试(触发XSS漏洞)

Web 攻防之业务安全&#xff1a;Callback自定义测试 业务安全是指保护业务系统免受安全威胁的措施或手段。广义的业务安全应包括业务运行的软硬件平台&#xff08;操作系统、数据库&#xff0c;中间件等&#xff09;、业务系统自身&#xff08;软件或设备&#xff09;、业务所提…...

Java访问底层操作系统

native方法定义&#xff1a; 简单地讲&#xff0c;一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法&#xff1a;该方法的实现由非java语言实现&#xff0c;比如C。这个特征并非java所特有&#xff0c;很多其它的编程语言都有这一机…...

Python 进阶指南(编程轻松进阶):十六、面向对象编程和继承

原文&#xff1a;http://inventwithpython.com/beyond/chapter16.html 定义一个函数&#xff0c;并从几个地方调用它&#xff0c;可以省去复制和粘贴源代码的麻烦。不复制代码是一个很好的实践&#xff0c;因为如果你需要修改它&#xff08;无论是为了修复一个错误还是添加新特…...

【计算机系统结构】第一章 计算机系统结构基本概念

文章目录第一章 计算机系统结构基本概念1.1 计算机系统结构的概念1.2 计算机体系结构的发展1.3 系统结构中并行性的发展1.4 系统结构的设计1.5 定量分析技术基础第一章 计算机系统结构基本概念 课程内容 A I P S N 工业革命 1.1 计算机系统结构的概念 引言 第一台通用计算机 …...

e2fsprogs logsave Ubuntu 安装失败 unable to make backup link of ‘./usr/bin/chattr‘

最近给服务器从 Ubuntu 18.04 LTS 升级到 20.04 LTS&#xff0c;过程中崩溃&#xff0c;重新尝试执行&#xff0c;提示依赖错误。这时候 apt install 所有的东西都会报错&#xff0c;提示依赖不满足。&#xff08;这里的报错忘了复制了&#xff09;执行 apt upgrade 也是一样。…...

在排序数组中查找元素的第一个和最后一个位置(二分查找进阶)

在写这个题目之前需要大家自行看一下我之前写的博客有关二分查找思想,如何判断什么时候使用二分查找以及边界值的确定:二分查找思想力扣实例_徐憨憨&#xff01;的博客-CSDN博客 题目:给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定…...

1 Nginx跨域配置

跨域问题在之前的单体架构开发中&#xff0c;其实是比较少见的问题&#xff0c;除非是需要接入第三方SDK时&#xff0c;才需要处理此问题。但随着现在前后端分离、分布式架构的流行&#xff0c;跨域问题也成为了每个Java开发必须要懂得解决的一个问题。 跨域问题产生的原因 产…...

ChatGTP如此强大,我们普通人如何利用它来赚钱?

我从效率提升的角度&#xff0c;分享了我这段时间看到的、用到的&#xff0c;以及思考的一些内容。 最近这段时间&#xff0c;我算是密集的学习。不得不说&#xff0c;优质的资料在推特和油管上特别多&#xff0c;看科技大佬的分享真是一种享受。 很多大神也会录制各种详细的…...

常见的九种大数据分析模型

常见的9种大数据分析模型分别为&#xff1a; 事件分析、 属性分析、 渠道分析、 Session分析、 留存分析、 归因分析、 漏斗分析、 路径分析、 分布分析 1、【事件分析】 事件分析&#xff0c;是指用户在 APP、网站等应用上发生的行为&#xff0c;即何人&#xff0c;何时&…...

射频识别(RFID)技术的基本原理、特性、发展和应用

何谓射频识别 随着高科技的蓬勃发展&#xff0c;智能化管理已经走进了人们的社会生活&#xff0c;一些门禁卡、第二代身份证、公交卡、超市的物品标签等&#xff0c;这些卡片正在改变人们的生活方式。其实秘密就在这些卡片都使用了射频识别技术&#xff0c;可以说射频识别已成…...

3.3 二维随机变量条件分布

学习目标&#xff1a; 要学习二维随机变量的条件分布&#xff0c;我可能会采取以下步骤&#xff1a; 复习边缘分布和联合分布&#xff1a;首先需要了解二维随机变量的边缘分布和联合分布的概念以及相应的公式。 复习条件概率&#xff1a;学习条件概率的定义和计算公式&#x…...

Kafka——概述、安装及命令行操作

文章目录一、概述1.1、定义1.2、如何运作&#xff1f;1.3、传统消息队列的应用场景1.4、消息队列的两种模式1.5、Kafka的基础架构二、安装&#xff08;需要安装zookeeper&#xff09;三、常用命令行操作3.1、主题命令行操作3.2、生产者命令行操作3.3、消费者命令行操作一、概述…...

怎么控制ERP企业管理系统开发的价格

企业资源规划&#xff08;ERP&#xff09;是一种广泛使用的商业软件系统&#xff0c;用于管理企业的各个方面&#xff0c;包括财务、供应链、客户关系、人力资源等等。开发一个适合企业的ERP系统可能是一项昂贵的任务&#xff0c;但控制ERP企业管理系统开发的价格是可行的。以下…...

我在“Now In Android”中学到的 9 件事

我在“Now In Android”中学到的 9 件事 Now in Android是一款功能齐全的 Android 应用程序&#xff0c;完全使用 Kotlin 和 Jetpack Compose 构建。它遵循 Android 设计和开发最佳实践&#xff0c;旨在为开发人员提供有用的参考。 https://github.com/android/nowinandroid UI…...

ChatGPT宝藏插件丨装上之后,上网、语音聊天、一键分享对话……简直让你爽到起飞!

今天分享4个让你的 ChatGPT 功能更强大的浏览器插件&#xff0c;装上就能用&#xff0c;每一个都是精挑细选。 1. WebChatGPT 很多小伙伴在用 ChatGPT查阅信息时&#xff0c;发现它有一个致命的问题&#xff1a; ChatGPT的知识库全部截止到 2021年9月&#xff0c;正常情况下…...

私有句柄表

私有句柄表 实验环境 win7 x86 什么是私有句柄表&#xff1f; 私有句柄表是操作系统内部的一种数据结构&#xff0c;用于存储一个进程所拥有的句柄&#xff08;或称为句柄对象&#xff09;的信息。在操作系统中&#xff0c;句柄是一个标识符&#xff0c;用于唯一标识一个对…...

Vue——类与样式绑定

目录 Class 与 Style 绑定​ 绑定 HTML class​ 绑定对象​ 绑定数组​ 在组件上使用​ 绑定内联样式​ 绑定对象​ 绑定数组​ 自动前缀​ 样式多值​ Class 与 Style 绑定​ 数据绑定的一个常见需求场景是操纵元素的 CSS class 列表和内联样式。因为 class 和 styl…...

软考中项计算题总结

计算题在下午的考试属于重中之重&#xff0c;可以说得计算题得天下&#xff0c;先把计算题搞定&#xff0c;再看案例找错题&#xff0c;这2个是最容易得分的&#xff0c;所以对于进度、成本类的计算题一定要搞懂&#xff1a; 所属项目过程计算计算公式说明进度管理三点估算&am…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...

机器学习的数学基础:线性模型

线性模型 线性模型的基本形式为&#xff1a; f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法&#xff0c;得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...

EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势

一、WebRTC与智能硬件整合趋势​ 随着物联网和实时通信需求的爆发式增长&#xff0c;WebRTC作为开源实时通信技术&#xff0c;为浏览器与移动应用提供免插件的音视频通信能力&#xff0c;在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能&#xff0c;对实时…...

Java中HashMap底层原理深度解析:从数据结构到红黑树优化

一、HashMap概述与核心特性 HashMap作为Java集合框架中最常用的数据结构之一&#xff0c;是基于哈希表的Map接口非同步实现。它允许使用null键和null值&#xff08;但只能有一个null键&#xff09;&#xff0c;并且不保证映射顺序的恒久不变。与Hashtable相比&#xff0c;Hash…...