STM32外设系列—sg90(舵机)

2023-11-15

一、sg90简介

首先介绍说一下什么是舵机。舵机是一种位置(角度)伺服的驱动器。适用于一些需要角度不断变化的,可以保持的控制系统。sg90就是舵机的一种。

sg90

舵机的工作原理比较简单。舵机内部有一个基准电压,单片机产生的PWM信号通过信号线进入舵机,与舵机内部的基准电压作比较,获得电压差输出。电压差的正负输出到电机驱动芯片上,从而决定正反转。开始旋转的时候,舵机内部通过级联减速齿轮带动电位器旋转,使得电压差为零,电机停止转动。

二、引脚连接

sg90有三个引脚,分别是红线(VCC),棕线(GND)和橙线(信号线)。通常使用5V供电,信号线接单片机引脚,用老来接收单片机发送的PWM。

三、控制方法

控制sg90舵机旋转也比较简单,只需要给它输出PWM波,修改占空比就可以调整角度。sg90的控制一般需要一个20ms 左右的时基脉冲,脉冲的高电平部分一般在0.5ms~2.5ms。高电平持续时间与旋转角度的对应关系如下

高电平持续时间/ms 舵机角度/°
0.5 0
1.0 45
1.5 90
2.0 135
2.5 180

四、程序设计

这里以180°的sg90,来展示一下程序设计

4.1 配置定时器

要使用sg90,首先要配置定时器,产生PWM。关于定时器和PWM相关知识,可以看博主STM32速成笔记定时器篇,这里就不再做详细介绍了。上面说,控制sg90需要一个20ms左右的脉冲,也就是说PWM的周期为20ms左右。计算一下可以知道,配置定时器时,预分频系数设置为7199,自动重装载值设置为200。我们初始化TIM3的通道1来控制sg90。PWM引输出脚映射到PC6。初始化程序如下

/*
 *==============================================================================
 *函数名称:TIM3_CH1_PWM_Init
 *函数功能:初始化定时器3的PWM通道1
 *输入参数:per:自动重装载值;psc:预分频系数
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void TIM3_CH1_PWM_Init (u16 per,u16 psc)
{
	// 结构体定义
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_OCInitTypeDef TIM_OCInitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	
	// 开启时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	
	// 初始化GPIO
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   // 复用推挽输出
	GPIO_Init(GPIOC,&GPIO_InitStructure);
	
	GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);   // 改变指定管脚的映射	
	
	// 初始化定时器参数
	TIM_TimeBaseInitStructure.TIM_Period = per;   // 自动装载值
	TIM_TimeBaseInitStructure.TIM_Prescaler = psc;   // 分频系数
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;   // 设置向上计数模式
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);	
	
	// 初始化PWM参数
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;   // 比较输出模式
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;   // 输出极性
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   // 输出使能
	TIM_OC1Init(TIM3,&TIM_OCInitStructure);   // 输出比较通道1初始化
	
	TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);   // 使能TIMx在 CCR1 上的预装载寄存器
	TIM_ARRPreloadConfig(TIM3,ENABLE);   // 使能预装载寄存器
	
	TIM_Cmd(TIM3,ENABLE);   // 使能定时器
}

初始化时,程序如下

TIM3_CH1_PWM_Init(200,7199);   // 初始化TIM3 PWM1

4.2 编写控制程序

根据高电平持续时间与角度关系对应表格来编写sg90的控制程序

  while(1)
  {
		TIM_SetCompare1(TIM3,195);   // 旋转到0°
		delay_ms(500);
		TIM_SetCompare1(TIM3,190);   // 旋转到45°
		delay_ms(500);
		TIM_SetCompare1(TIM3,185);   // 旋转到90°
		delay_ms(500);
		TIM_SetCompare1(TIM3,180);   // 旋转到135°
		delay_ms(500);
		TIM_SetCompare1(TIM3,175);   // 旋转到180°
		delay_ms(500);
	}

五、360°舵机

除了上面介绍的180°舵机之外,还有一种360°舵机。与180°舵机不同的是,360°舵机是无法控制角度的,它只能控制旋转方向和旋转速度。360°的舵机也是由脉冲宽度为20ms的PWM控制。高电平持续时间与舵机转向和转速的对应关系如下

高电平持续时间/ms 舵机转向和转速
0.5~1.5 正转,速度越来越慢
1.5 停止
1.5~2.5 反转,速度越来越快
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32外设系列—sg90(舵机) 的相关文章

  • C++的模板特例化template<>

    C 的模板特例化是指当我们定义了一个通用的模板类或模板函数时 如果特定输入参数类型或值需要进行不同的处理 我们可以为这些特定情况提供单独的实现 这就是模板特例化 下面我们将详细介绍C 的模板特例化 假设我们有以下的一个模板类 templat
  • java自学笔记12:java中的集合框架(下)List

    一 学生选课 判断List中课程是否存在 思考 在课程序列中 如何判断是否包含某门或者某几门课程 如果课程序列包含某门课程 如何判断该课程的索引位置 在学生映射表中 如何判断是否包含某个学生ID 又该如何判断是否包含某个学生对象 如果想把课
  • 解读随着教育改革的深入steam教育

    STEAM鼓励孩子勇于创新和探索 打破思维的第三面墙 自古以来 大家都是教育孩子纠正错误 而STEAM可以让孩子们通过与小组实践学习 探索讨论 交流思想和相互帮助 来发现自己的缺点和不足 通过团队合作来弥补自己的劣势 可以说 STEAM是一
  • Pandas 返回Nan值的行索

    Pandas 返回Nan值的行索 通过np where函数查找 gt gt gt df Out 1 0 1 0 0 450319 0 062595 1 0 673058 0 156073 2 0 871179 0 118575 3 0 59

随机推荐

  • Mysql大小写敏感设置(Docker版)

    应用场景 本人由于项目前期使用windows版国产数据库开发 默认就是大小写不敏感的 加上代码规范约束不够 导致代码中SQL大小写不统一 后期有需求要更换数据库 改用Mysql 因为在Linux系统中Mysql默认是大小写敏感的 所以需要对
  • java多线程同步的实现方式

    java多线程同步的实现方式 1 什么时候会出现线程安全问题 2 使用synchronized关键字 2 1修饰方法 2 2 修饰代码块 3 使用重入锁实现线程同步 4 wait与notify方法 5 使用原子变量实现线程同步 关于vola
  • vmospro启动黑屏_VMOS Pro,安卓手机上的虚拟机

    应用名称 VMOS Pro 应用包名 com vmos pro 应用版本 1 1 26 应用大小 28 0MB 适用平台 Android 5 1 版本说明 1 优化电量同步问题 2 优化游戏断触问题 3 设备信息修改加入随机按钮 4 增加横
  • Docker导入导出镜像(镜像迁移)

    打包现有镜像 docker images 命令查看已有镜像列表 docker save命令打包镜像 docker save使用说明 o 选项 用来指定输出文件 将alpine ffmpeg 3 15打包 docker save o alpi
  • Linux定时任务

    Linux定时任务 at命令 语法 at 选项 日期时间 选项 f 指定包含具体指令的任务文件 q 指定新任务的队列名称 l 显示待执行任务的列表 d 删除指定的待执行任务 m 任务执行完成后向用户发送 E mail 日期时间 指定任务执行
  • 通过XSD文件生成JAVA对象

    c Program Files Java jdk1 8 0 101 bin gt xjc exe p io xsd xml encoding UTF 8 xsdTOxml MyField xsd d xsdTOxml Picked up J
  • 如何在uni中实现一个路由守卫

    在uni app中实现路由守卫 可以使用全局的router beforeEach方法来拦截路由导航 以下是一个简单的示例 展示了如何在uni app中实现路由守卫 在上述代码中 我们通过监听beforeRouterEnter事件来实现路由守
  • java.util.LinkedHashMap cannot be cast to Entity

    前后端数据传输转换问题 java util LinkedHashMap cannot be cast to Entity 问题场景 项目前端使用json传输方式 后台接收后对象变成了LinkedHashMap ResponseBody Re
  • 方向包围盒OBB(oriented bounding box)

    制造几何仿真中的碰撞检测通常视为针对刚体对象间的碰撞检测 这样的话可以把非刚体即软体的建模和变形算法对碰撞检测的影响减少到最小 常见成熟的基于包围盒的碰撞检测 box intersection test 算法如 1 沿坐标轴的包围盒AABB
  • Unity3D关于ComputeShader

    由于最近在实验中需要大量循环计算产生网格 所以可能需要GPU的加速 对于compute shader学习下 可能对于做GPU加速有帮助 以下补充修改了转载文章的内容 原文链接 https blog csdn net csharpupdown
  • HTML怎么建立两行四列的li,关于CSS如何实现多行多列布局的方法

    这篇文章主要介绍了CSS实现多行多列的布局的实例代码 需要的朋友可以参考下 1 两列多行 HTML box1 实现两列多行布局 111 222 333 CSS box1 width 500px background EEEEEE box1
  • fortran求解雷诺方程_方程的计算机处理96(5)_C++vs

    计算机语言运用 数值计算9 方程的计算机处理96 5 C vs 计算机 电子线路组成的计算机器 人与计算机则是通过计算机语言 符号系统说给计算机听而交流 计算机语言有低级语言 机器语言 汇编 高级语言 C C C VB PASCAL LIS
  • 使用yarn搭建Vue,ElementUI,axios环境

    1 搭建vue ElementUI axios环境 1 1 安装yarn 安装yarn npm install g yarn 查看是否安装版本 yarn version yarn切换为国内源 yarn config set registry
  • OSI以及TCP参考模型

    一 网络发展历史 1 1946年第一代计算机网络是以单个计算机为中心的远程联机系统 2 1970年第二代计算机网络是以多个主机通过通信线路互联起来 3 1980年第三代计算机网络是以IOS 国际标准化组织 提出的OSI参考模型为中心的互联网
  • 图像匹配几种常见算法与实践

    奇技 指南 本文主要内容 1 模版匹配 2 特征匹配 3 深度学习去找目标 图像匹配的应用及背景 图像匹配是指通过一定的匹配算法在两幅或多幅图像之间识别同名点 应用 遥感 制图更新 计算机视觉应用程序 医疗用图像注册 图像匹配主要可分为以灰
  • 【STM32 x VScode】如何在vscode上编写stm32程序(固件库函数)

    本人使用keil5也算比较长时间了 但是keil5有个比较大的缺陷就是补全速度太慢 老是用的不太顺手 于是就想着使用万能的vscode来代替一下keil5的编写程序功能 注意 这里使用vscode并不是说可以把keil5给卸载了 它还是要借
  • 使用ADB指令永久隐藏或禁用状态栏和虚拟按键

    原理是强大的ADB命令 1 手机开启开发者模式 允许ADB调试 2 电脑上下载ADB包 adb rar 529 77 KB 下载次数 7681 3 解压到任意位置 比如c adb 4 cmd命令定位到adb目录 比如 cd c adb 5
  • 用于回归问题的异常鲁棒极限学习机(ORELM)(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 文献来源 极限学习机 ELM 作为机器学习中最有用的技术
  • 加密算法中的加盐值

    在应用中 出于到安全的考虑和数据的保密 需要使用到加密算法 有时候为了让加密的的结果更加扑朔迷离神鬼莫测一些 常常会给被加密的数据加点 盐 说白了 盐就是一串数字 完全是自己定义的 不多说 上实例 获取当前用户盐 param string
  • STM32外设系列—sg90(舵机)

    文章目录 一 sg90简介 二 引脚连接 三 控制方法 四 程序设计 4 1 配置定时器 4 2 编写控制程序 五 360 舵机 一 sg90简介 首先介绍说一下什么是舵机 舵机是一种位置 角度 伺服的驱动器 适用于一些需要角度不断变化的