一文读懂舵机工作原理并运用(附代码)

2023-11-04

杂谈

自己拿到这一模块是也挺迷茫的,后来看了一些资料,也渐渐积累了些自己的理解,很多博文并没有将舵机讲明白,至少你待把PWM与角度如何换算讲清楚吧,所以笔者写这篇博文供大家学习掌握。

如果你拿到一个舵机,该咋办?莫慌,往下看

第一步先要区分这个舵机是数字舵机还是模拟舵机。

以为两者的控制方式有些许不同,模拟舵机需要给它不停的发送PWM信号,才能让它保持在规定的位置或者让它按照某个速度转动,数字舵机则只需要发送一次PWM信号就能保持在规定的某个位置。

换句话说,模拟舵机想要它转到某一位置,程序上就要放在while等循环中,数字舵机只要给一次PWM值就能以一定速度转到某一位置。

第二步是看清自己的需要

大多数舵机都是180度的舵机,顾名思义就是旋转的范围就是0-180度,这类舵机是控制舵机转到某一角度的。

而有的舵机是360度的舵机,这类舵机则是而一个PWM信号,舵机会以一个特定的速度转动,类似与电机。但与电机不同的是,360舵机是闭环控制,速度控制稳定。

第三步是了解舵机的内部结构

舵机内部长啥样?不如自己拆一个来的直接。

在这里插入图片描述主要是有一个电机、角度传感器,驱动电路、传动齿轮组成,四者形成一个闭环系统,实现角度(或者称作位置)的精准控制(见下图)。这些有些了解就好,不必深究。
在这里插入图片描述第四步是弄清舵机的工作原理

这一步很是关键!!!

首先舵机是用PWM波来驱动的,有PWM信号大哥的地方,就有周期占空比两个小弟跟着。

接下来以数字舵机为例,毕竟用的最多。

舵机的控制原理就是向控制端(就是信号线,一般是黄色或者白色)输入一个PWM值,舵机就会转到某一个角度,所以,给定的PWM值与角度是对应关系。

那么,如何确定这个关系就是关键所在!

既然是输出一路PWM波,那么就需要先确定PWM的频率(一般为50HZ),进而就确定了PWM的输出周期(一般为20ms)。对于这点不清楚的可以见我以前的博文。PWM相关要点

一般舵机都会给出下面几个参数:

高电平0.5-2.5ms对应0-180度。(2.5%<占空比<12.5%)
也就是这张图
在这里插入图片描述如何确定呢?来个公式

设高电平时间为t,那对应的角度angle=(t-0.5)*180/(2.5-0.5),(0.5<=t<=2.5)。这应该很好理解了。
举例如下:高电平t=0.5ms,带入公式,angle=0度。

第五步掌握PWM输出舵机的定时器配置

假如使用的系统主频为72M,得到50HZ的PWM,则有下面一个公式

50=72000 000/(arr+1)/(psc+1)

设arr=9999,则psc=143,写程序时输出比较配置好这两个参数,从而确定计时器计一个数时间为0.002ms,0.002*(arr+1)=20ms,刚好是PWM波的周期。

接下来要确定舵机转动角度与PWM值之间的关系。

一般我们直接使用TIM_SetCompare1(TIM1,PWM);这个函数修改输出的PWM值,也就是直接写值到CCR寄存器。

在这里插入图片描述
根据上图公式,我们就确定了PWM值的范围[250,1250]对应舵机[0,180]。

第六步编写驱动程序

void TIM2_PWM_Init(u16 arr, u16 psc)
{
	GPIO_InitTypeDef GPIO_InitStructure; //定义一个引脚初始化的结构体
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue; //定义一个定时中断的结构体	
	TIM_OCInitTypeDef TIM_OCInitTypeStrue; //定义一个PWM输出的结构体
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA时钟,在STM32中使用IO口前都要使能对应时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能通用定时器2时钟,A0引脚对应TIM2CHN1
	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//引脚0
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出模式,定时器功能为A0引脚复用功能
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //定义该引脚输出速度为50MHZ
  GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化引脚GPIOA0
	 
	TIM_TimeBaseInitStrue.TIM_Period=arr; //计数模式为向上计数时,定时器从0开始计数,计数超过到arr时触发定时中断服务函数
	TIM_TimeBaseInitStrue.TIM_Prescaler=psc; //预分频系数,决定每一个计数的时长
	TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up; //计数模式:向上计数
	TIM_TimeBaseInitStrue.TIM_ClockDivision=0; //一般不使用,默认TIM_CKD_DIV1
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStrue); //根据TIM_TimeBaseInitStrue的参数初始化定时器TIM2
	
	TIM_OCInitTypeStrue.TIM_OCMode=TIM_OCMode_PWM1; //PWM模式1,当定时器计数小于TIM_Pulse时,定时器对应IO输出有效电平
	TIM_OCInitTypeStrue.TIM_OCPolarity=TIM_OCNPolarity_High; //输出有效电平为高电平
	TIM_OCInitTypeStrue.TIM_OutputState=TIM_OutputState_Enable; //使能PWM输出
	TIM_OCInitTypeStrue.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
	TIM_OC1Init(TIM2, &TIM_OCInitTypeStrue); //根TIM_OCInitTypeStrue参数初始化定时器2通道1

	TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable); //CH1预装载使能
	
	TIM_ARRPreloadConfig(TIM2, ENABLE); //CH1预装载使能
	
	TIM_Cmd(TIM2, ENABLE); //使能定时器TIM2
}

//main文件调用方式

int main(void)
{
	delay_init();
  TIM2_PWM_Init(9999, 143); //TIM2_Int_Init(u16 arr, u16 psc),初始化定时器TIM2
	                       
	u16 PWM=750;
	u8  Direction=1;
  while(1)
	{
		delay_ms(100);
		if(Direction)PWM=PWM+50;
		else PWM=PWM-50;
		if (PWM>1250) Direction=0;  //PWM值1250代表舵机位置接近180度
		if (PWM<250)    Direction=1; //PWM值250代表舵机位置接近0度
		TIM_SetCompare1(TIM2, PWM); //设置待装入捕获比较寄存器的脉冲值,相当于不断设置TIM_Pulse
		                      
	}
}



到此,舵机基本的控制方式就应该掌握了。

注意事项:舵机可别直接接在32等核心板上,容易烧,需要外部供电,只要把信号线接到对应PWM输出引脚上就可以。

有帮助的不妨点个赞,哈哈。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一文读懂舵机工作原理并运用(附代码) 的相关文章

  • Python——queue

    Queue Queue是python标准库中的线程安全的队列 FIFO 实现 提供了一个适用于多线程编程的先进先出的数据结构 即队列 用来在生产者和消费者线程之间的信息传递 基本FIFO队列 class Queue Queue maxsiz

随机推荐

  • C#设计模式——单例模式(Singleton Pattern)

    目录 一 概述 1 基础 二 实现 1 单线程 2 解决 多线程情况下 解决方案一 Sleep 解决方案二 加锁 三 扩展 一 概述 单例模式 gt 创建型设计模式 定义 保证一个类只有一个实例 并提供一个访问它的全局访问点 在第一个使用者
  • CentOS 6.5开启DHCP服务

    CentOS 6 5开启DHCP服务 安装dhcp yum install dhcp 配置Vmware虚拟网络编辑器 选择VMnet1网卡 选择 仅主机模式 取消使用本地DHCP服务 并设置子网IP与子网掩码 设置完点击 应用 设置Cent
  • 互联网未来30年发展的大趋势,专家:竞争会更激烈!

    未来互联网发展肯定是越来越快 越来越与各行业紧密融合 因此我们必须跟上趋势 顺着风向前行 互联网大佬马云曾说过 在互联网上失败一定是自己造成的 要不是脑子发热 要不就是脑子不热了 太冷了 专家分析互联网未来30年发展的10大趋势 1 政府推
  • Win11 21H2 22000.2124

    Win11 21H2 22000 2124是最新推出的非安全发布预览版更新 主要解决了一个影响桌面虚拟键盘的问题 该问题导致在锁定电脑后无法打开桌面虚拟键盘 改进 这一非安全性更新包括质量改进 当你安装这个kb时 新的 这一更新为微软维护者
  • VMware 下的CentOS6.7 虚拟机与Windows7通信

    在有网络的情况下 VMware 虚拟机使用桥接模式 Bridged 和NAT方式 会自动通信 但是在没有网络的情况下怎么办呢 对 是的 使用host only模式 如何设置呢 注 将Windows上的虚拟网卡改成跟Linux上的网卡在同一网
  • 将本地jar包打包到本地仓库和上传到私服

    1 本地jar打包到本地仓库 mvn install install file DgroupId 自定义的groupID DartifactId 自定义的artifactid Dversion 自定义版本号 Dpackaging jar D
  • 【网络编程】深入理解TCP协议一(三次握手四次挥手、标记位、确认应答机制、超时重传机制)

    TCP协议 1 三次握手四次挥手 2 TCP协议段格式 3 标记位介绍 4 确认应答机制 5 超时重传机制 1 三次握手四次挥手 当客户端发起连接请求时 SYN需要被设置位1 告诉服务器客户端希望建立一个链接 服务器收到响应之后会回复 SY
  • VUE项目中引入JS文件的几种方法

    在开发Vue项目的时候 有时需要使用一些非ES6格式的没有export的js库 可以有如下方法实现 1 在index html页面使用script标签引入 当然也可以使用cdn的地址 这样引入后的内容是全局的 可以在所有地方使用
  • 《区块链助力粤港澳大湾区一体化发展报告(2022)》发布

    7月19日 中国 深圳 综合开发研究院主办的 数 链 大湾区 区块链助力粤港澳大湾区一体化发展报告 2022 发布会在深圳举行 报告提出 以区块链为代表的数字技术在破解粤港澳大湾区制度差异坚冰 支撑实体经济跨越和赋能社会治理创新等方面能够发
  • Mybatis对数据库数据的查询

    简单类型的映射 返回的是简单基本类型 接口中的定义 int getAdminCount 返回数据库总共还几条数据 xml中具体的实现
  • 解决Android App启动页背景图片拉伸变形问题

    为什么80 的码农都做不了架构师 gt gt gt 最近在开发的时候 在个别手机上遇到APP启动页背景图片被拉伸的情况 不多说 直接上图 然而我设置的背景图片是长这样 解决方法很简单 就是将主题中的单一背景图片以drawable的方式实现
  • SpringBoot世上最简洁的概况说明

    转自 SpringBoot世上最简洁的概况说明 下文笔者讲述SpringBoot的简介说明 如下所示 SpringBoot简介 SpringBoot是一个基于Spring框架开发的一个服务框架 使用SpringBoot可简化配置 达到开箱即
  • 从视频中提取音频数据,然后应用傅里叶对音频降噪(python)

    视频准备 QQ有热键 然后随便打开一个视频网站进行录屏 我选择B站 从视频中提取音频 需要安装包moviepy pip install moviepy 提取代码 from moviepy editor import video VideoF
  • Tomcat 目录列表···webloigc 目录列表···Weblogic修改端口号

    Tomcat web xml
  • PyCharm专业版破解

    0x01 下载JetbrainsCrack的jar包 下载链接 链接 百度云链接 提取码 8u4c 0x02 把JetbrainsCrack的jar包放入pycharm文件下的bin目录中 0x03 加上必要的文件代码 在bin目录下使用记
  • 题11:最短摘要的生成

    题目 Alibaba笔试题 给定一段产品的英文描述 包含M个英文单词 每个英文单词以空格分隔 无其他标点符号 再给定N个英文单词关键字 请说明思路并编程实现方法 String extractSurmary String descriptio
  • crout分解计算例题_化学方程式计算你真学会了吗?

    先看看视频 听听姚老师教的计算步骤吧 例题1 加热分解6 3g高锰酸钾 可以得到多少克氧气 分析 这道题是已知反应物的质量来求生成物的质量 即已知原料的质量求产品的质量 我们一起来看课本中的解题步骤 解 设加热分解6 3g高锰酸钾 可以得到
  • Java学习——String

    在上一篇我们讲到了一个必要重要的知识点 那就是Java中的类和对象 我们可以点击下面的链接来进行复习 CSDNJava学习 类和对象 上 AlwaysBeMyself的博客 CSDN博客CSDN 今天我们来讲下一个知识点 那就是Java中的
  • shift+空格,英文字母间距变大,半角全角转换

    shift 空格半角全角快捷键
  • 一文读懂舵机工作原理并运用(附代码)

    杂谈 自己拿到这一模块是也挺迷茫的 后来看了一些资料 也渐渐积累了些自己的理解 很多博文并没有将舵机讲明白 至少你待把PWM与角度如何换算讲清楚吧 所以笔者写这篇博文供大家学习掌握 如果你拿到一个舵机 该咋办 莫慌 往下看 第一步先要区分这