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

这篇具有很好参考价值的文章主要介绍了一文读懂舵机工作原理并运用(附代码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

杂谈

自己拿到这一模块是也挺迷茫的,后来看了一些资料,也渐渐积累了些自己的理解,很多博文并没有将舵机讲明白,至少你待把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输出引脚上就可以。

有帮助的不妨点个赞,哈哈。文章来源地址https://www.toymoban.com/news/detail-402644.html

到了这里,关于一文读懂舵机工作原理并运用(附代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 单片机——SG90舵机工作原理

    前言: 舵机控制的另一个专业名字叫伺服控制。 经过百度,伺服”—词源于希腊语“奴隶”的意思。人们想把“伺服机构”当个得心应手的驯服工具,服从控制信号的要求而动作。在讯号来到之前,转子静止不动;讯号来到之后,转子立即转动;当讯号消失,转子能即时自

    2023年04月08日
    浏览(28)
  • 一文读懂Docker原理

    说起Docker,基本上就是指容器。许多同学熟悉Docker的操作,却搞不懂到底什么是容器。本文就来讲讲Docker容器到底是个啥。 容器被称为轻量级的虚拟化技术,实际上是不准确的。确切地说,容器是一种对进程进行隔离的运行环境。 由于生产环境的容器几乎都是运行在Linux上的

    2024年01月17日
    浏览(30)
  • 一文读懂Llama 2(从原理到实战)

    Llama 2,是Meta AI正式发布的最新一代开源大模型。 Llama 2训练所用的token翻了一倍至2万亿,同时对于使用大模型最重要的上下文长度限制,Llama 2也翻了一倍。Llama 2包含了70亿、130亿和700亿参数的模型。Meta宣布将与微软Azure进行合作,向其全球开发者提供基于Llama 2模型的云服务

    2024年02月05日
    浏览(35)
  • 小白入门STM32(2)---控制SG90舵机---基础工作原理详解

    本人一枚软件编程人员,有一定C语言基础,目前自学STM32单片机,写下此篇一巩固所学二交流分享。 按照惯例,先介绍理论再实战上手,穿插习题,最后给出我的愚见。 SG90属于一种舵机,最适合小白入门,可直接由单片机驱动。另外,单片机中给我们封装了很多东西,所以

    2023年04月10日
    浏览(32)
  • 【Linux】一文读懂HTTP协议:从原理到应用

    ​🌠 作者:@阿亮joy. 🎆 专栏: 《学会Linux》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 在网络版计算器一文中,我们通过手动地定制协议来加深对协议的认识。虽然我说应用层协议是由程序猿自己

    2023年04月25日
    浏览(31)
  • 一文读懂:区块链的原理、技术、应用领域

    引言 在当今数字化时代,区块链技术已经成为全球范围内备受瞩目的话题。从金融到供应链,从物联网到数字身份,区块链正在以惊人的速度渗透到各个行业,并在重塑着我们的社会和经济格局。 区块链最初因其作为比特币背后技术的而引起人们的关注。但现在,它已经远

    2024年04月23日
    浏览(55)
  • 深入浅出——零基础一文读懂DeepSORT(原理篇)

    本文是笔者对DeepSORT算法学习的阶段性总结,基于笔者接触到的所有开源学习资料,辅以个人理解进行重新编排而成,力求清晰,使非专业的读者也能迅速对该算法原理有较为透彻的理解,便于后续代码学习。 笔者本人为非cs相关专业,论述不当之处欢迎指出。文中引用的博

    2023年04月09日
    浏览(35)
  • MATLAB :【11】一文带你读懂serialport串口收发原理与实现

    碎碎念: 这周的主要工作还是集中于FOC中,因为羡慕稚晖君做出的漂亮Qt面板,因此在利用MATLAB复刻过程中,学习了一下serialport的使用。FOC的GUI部分就在加班加点写作中啦,同时最近打算开一个新坑,大家可以期待一下哈哈哈。 欢迎大佬们点赞+收藏+关注~ o(* ̄▽ ̄*)ブ 目录

    2023年04月18日
    浏览(40)
  • 自动弹性,QPS线性提升|一文读懂云原生数仓AnalyticDB弹性技术原理

    在全球经济增长放缓的大背景之下,企业在加强数字化建设的过程中,实现效益最大化成为一个绕不开的话题。阿里云瑶池旗下的 云原生数仓AnalyticDB MySQL湖仓版 (以下简称AnalyticDB MySQL)在发布之初提供了定时弹性功能,帮助业务有规律的客户定时升降配计算资源以节省成

    2024年02月19日
    浏览(33)
  • 一文读懂异步和同步——async/await在运行时和普通代码的执行顺序的问题

    一、执行顺序问题 JavaScript中的await语句是异步编程中用于等待Promise对象执行结果的,它通常与async函数一起使用。在使用await时,程序的执行将暂停,直到该后面的Promise对象完成执行并返回结果。 函数代码执行顺序通常情况下按照代码所在文件从上至下

    2024年02月03日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包