STM32F103RCT6驱动SG90舵机-完成正反转角度控制
一、SG90舵机介绍
SG90是一种微型舵机,也被称为伺服电机。它是一种小型、低成本的直流电机,通常用于模型和机器人控制等应用中。SG90舵机可以通过电子信号来控制其精确的位置和速度。它具有体积小、重量轻、响应快等特点,因此在各种小型机械设备上得到了广泛应用。
SG90舵机通常用于各种小型机械设备中,例如:
模型控制:SG90舵机可以用于遥控汽车、飞机、船只和其他模型的转向、加速和刹车等控制。
机器人控制:SG90舵机也广泛应用于机器人领域,例如可以控制机器人的头部旋转、臂部移动等。
相机云台:SG90舵机可以用于控制相机的运动,例如实现云台的左右旋转和上下移动。
自动化系统:在一些自动化系统中,SG90舵机可以用来控制小型机械臂或手指的运动。
总之,SG90舵机适用于需要精确定位和紧凑设计的应用场景。


二、普通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是一种微型舵机,也被称为伺服电机。它是一种小型、低成本的直流电机,通常用于模型和机器人控制等应用中。SG90舵机可以通过电子信号来控制其精确的位置和速度。它具有体积小、重量轻、响应快等特点,因此在各种小型机械…...
【4.13(补)】二叉搜索树的遍历、插入、删除
文章目录二叉搜索树的最近公共祖先二叉搜索树中的插入操作删除二叉搜索树中的节点二叉搜索树的最近公共祖先 235. 二叉搜索树的最近公共祖先 - 力扣(LeetCode) 因为二叉搜索树是有序的,第一次找到p和q中间的值,就是最近的公共祖先…...
Web 攻防之业务安全:Callback自定义测试(触发XSS漏洞)
Web 攻防之业务安全:Callback自定义测试 业务安全是指保护业务系统免受安全威胁的措施或手段。广义的业务安全应包括业务运行的软硬件平台(操作系统、数据库,中间件等)、业务系统自身(软件或设备)、业务所提…...
Java访问底层操作系统
native方法定义: 简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机…...
Python 进阶指南(编程轻松进阶):十六、面向对象编程和继承
原文:http://inventwithpython.com/beyond/chapter16.html 定义一个函数,并从几个地方调用它,可以省去复制和粘贴源代码的麻烦。不复制代码是一个很好的实践,因为如果你需要修改它(无论是为了修复一个错误还是添加新特…...
【计算机系统结构】第一章 计算机系统结构基本概念
文章目录第一章 计算机系统结构基本概念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,过程中崩溃,重新尝试执行,提示依赖错误。这时候 apt install 所有的东西都会报错,提示依赖不满足。(这里的报错忘了复制了)执行 apt upgrade 也是一样。…...
在排序数组中查找元素的第一个和最后一个位置(二分查找进阶)
在写这个题目之前需要大家自行看一下我之前写的博客有关二分查找思想,如何判断什么时候使用二分查找以及边界值的确定:二分查找思想力扣实例_徐憨憨!的博客-CSDN博客 题目:给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定…...
1 Nginx跨域配置
跨域问题在之前的单体架构开发中,其实是比较少见的问题,除非是需要接入第三方SDK时,才需要处理此问题。但随着现在前后端分离、分布式架构的流行,跨域问题也成为了每个Java开发必须要懂得解决的一个问题。 跨域问题产生的原因 产…...
ChatGTP如此强大,我们普通人如何利用它来赚钱?
我从效率提升的角度,分享了我这段时间看到的、用到的,以及思考的一些内容。 最近这段时间,我算是密集的学习。不得不说,优质的资料在推特和油管上特别多,看科技大佬的分享真是一种享受。 很多大神也会录制各种详细的…...
常见的九种大数据分析模型
常见的9种大数据分析模型分别为: 事件分析、 属性分析、 渠道分析、 Session分析、 留存分析、 归因分析、 漏斗分析、 路径分析、 分布分析 1、【事件分析】 事件分析,是指用户在 APP、网站等应用上发生的行为,即何人,何时&…...
射频识别(RFID)技术的基本原理、特性、发展和应用
何谓射频识别 随着高科技的蓬勃发展,智能化管理已经走进了人们的社会生活,一些门禁卡、第二代身份证、公交卡、超市的物品标签等,这些卡片正在改变人们的生活方式。其实秘密就在这些卡片都使用了射频识别技术,可以说射频识别已成…...
3.3 二维随机变量条件分布
学习目标: 要学习二维随机变量的条件分布,我可能会采取以下步骤: 复习边缘分布和联合分布:首先需要了解二维随机变量的边缘分布和联合分布的概念以及相应的公式。 复习条件概率:学习条件概率的定义和计算公式&#x…...
Kafka——概述、安装及命令行操作
文章目录一、概述1.1、定义1.2、如何运作?1.3、传统消息队列的应用场景1.4、消息队列的两种模式1.5、Kafka的基础架构二、安装(需要安装zookeeper)三、常用命令行操作3.1、主题命令行操作3.2、生产者命令行操作3.3、消费者命令行操作一、概述…...
怎么控制ERP企业管理系统开发的价格
企业资源规划(ERP)是一种广泛使用的商业软件系统,用于管理企业的各个方面,包括财务、供应链、客户关系、人力资源等等。开发一个适合企业的ERP系统可能是一项昂贵的任务,但控制ERP企业管理系统开发的价格是可行的。以下…...
我在“Now In Android”中学到的 9 件事
我在“Now In Android”中学到的 9 件事 Now in Android是一款功能齐全的 Android 应用程序,完全使用 Kotlin 和 Jetpack Compose 构建。它遵循 Android 设计和开发最佳实践,旨在为开发人员提供有用的参考。 https://github.com/android/nowinandroid UI…...
ChatGPT宝藏插件丨装上之后,上网、语音聊天、一键分享对话……简直让你爽到起飞!
今天分享4个让你的 ChatGPT 功能更强大的浏览器插件,装上就能用,每一个都是精挑细选。 1. WebChatGPT 很多小伙伴在用 ChatGPT查阅信息时,发现它有一个致命的问题: ChatGPT的知识库全部截止到 2021年9月,正常情况下…...
私有句柄表
私有句柄表 实验环境 win7 x86 什么是私有句柄表? 私有句柄表是操作系统内部的一种数据结构,用于存储一个进程所拥有的句柄(或称为句柄对象)的信息。在操作系统中,句柄是一个标识符,用于唯一标识一个对…...
Vue——类与样式绑定
目录 Class 与 Style 绑定 绑定 HTML class 绑定对象 绑定数组 在组件上使用 绑定内联样式 绑定对象 绑定数组 自动前缀 样式多值 Class 与 Style 绑定 数据绑定的一个常见需求场景是操纵元素的 CSS class 列表和内联样式。因为 class 和 styl…...
软考中项计算题总结
计算题在下午的考试属于重中之重,可以说得计算题得天下,先把计算题搞定,再看案例找错题,这2个是最容易得分的,所以对于进度、成本类的计算题一定要搞懂: 所属项目过程计算计算公式说明进度管理三点估算&am…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...
