stm32f407驱动20KG 270度舵机

这篇具有很好参考价值的文章主要介绍了stm32f407驱动20KG 270度舵机。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在学习的过程中发现,及时复习是一个好的学习习惯,本文记录使用STM32F407ZGT6控制20KG 270度舵机的学习过程,以便日后复习。

PWM概述

脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。广泛应用在从测量、通信到功率控制与变换的许多领域中。简单一点,就是对脉冲宽度的控制,PWM 原理如图:
270度舵机占空比,stm32,单片机,arm
“图一”

其中:
CNT:计数器

ARR:重装值寄存器

CCRx:比较寄存器

通过参考手册中可知,stm32f407出了定时器6,7没有产生PWM功能,其他定时器都有。我上网看了一些教程,发现大多都是利用PA0
的定时器2通道1产生PWM,但是我PA0使用了按键触发外部中断,所以换成了PA1定时器2通道2。
270度舵机占空比,stm32,单片机,arm
在配置PWM之前,再来说一个知识,占空比。
占空比:占空比是指在一个脉冲循环内,通电时间(可能是高电平也可能是低电平)相对于总时间所占的比例。
270度舵机占空比,stm32,单片机,arm
这里我上网找了一张图片,其实很简单,就是脉冲宽度占总时间的比例,就是占空比。

代码讲解

废话不多说,我们以便将代码,一边说,上代码:
首先初始化结构体,开启定时器2和端口A的时钟,这没什么好说的。

	GPIO_InitTypeDef 			GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  	TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  			TIM_OCInitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);  	//TIM2时钟使能  
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); 	//使能PORTA时钟

然后看stm32f407ZGT6的引脚定义,这小小的一步其实很关键,记得刚开始学习的时候没有看引脚定义,当时用到了PA14,但是PA14主功能并不是普通的GPIO,所以怎么都不能成功看到效果,我找到了PA1的引脚定义如下图
270度舵机占空比,stm32,单片机,arm
另外,我还找到了全面的STM32F407ZGT6引脚功能表,大家要使用请自动移步(好吧,只是我懒,懒得在搬过来了,见谅)https://blog.csdn.net/u011510016/article/details/100404880
通过图中可以看出PA1的主功能就是PA1,但是我们要使用它的定时器功能,所以要复用一下,关于复用的概念,我就不在此赘述了
直接上代码:

GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_TIM2); //GPIOA1复用为定时器2

这个函数很好理解啊,就是把A端口1号引脚复用为定时器2模式
270度舵机占空比,stm32,单片机,arm
这里我帮大家找到了这个函数的注释,大家英语水平都很好,咱也就不翻译了,直接看就好,是不是嘎嘎简单!
接下来就是引脚的配置了

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;           //GPIOA1
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //复用
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;	//速度100MHz
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //推挽复用输出
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        //上拉
	GPIO_Init(GPIOA,&GPIO_InitStructure);              //初始化PA1

下面关于定时器的配置还是有必要好好絮叨絮叨滴,我先把代码奉上,然后一点点讲解

	TIM_TimeBaseStructure.TIM_Prescaler=psc;  //定时器分频
	TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
	TIM_TimeBaseStructure.TIM_Period=arr;   //自动重装载值
	TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; 
	
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);//初始化定时器2
	
	//初始化TIM2 Channe2 PWM模式 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较使能输出
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
	TIM_OCInitStructure.TIM_Pulse = 0;//比较初始值
	TIM_OC2Init(TIM2, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM2 OC2

	TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);  //使能TIM2在CCR2是的预装载寄存器
 
    TIM_ARRPreloadConfig(TIM2,ENABLE);//ARPE使能
	
	TIM_Cmd(TIM2, ENABLE);  //使能TIM2										  

其实也不是很多,靓仔,听我一一道来:
我们先来看定时器分频和自动重装载值,这两句我觉得是最重要的了

TIM_TimeBaseStructure.TIM_Prescaler=psc;  //定时器分频
TIM_TimeBaseStructure.TIM_Period=arr;   //自动重装载值

这里我又为大家找来了一张图
270度舵机占空比,stm32,单片机,arm
大家不要看别的,直接看这
270度舵机占空比,stm32,单片机,arm

定时器2是普通定时器,它使能APB1硬件时钟,根据中文开发指南
270度舵机占空比,stm32,单片机,arm

APB1先是4分频,所以预分频要×2
定时器2时间计算方法: 频率=(168/4×2)/TIM_TimeBaseStructure.TIM_Prescaler
计数时间=TIM_TimeBaseStructure.TIM_Period /频率
就比如我的定时器分频TIM_TimeBaseStructure.TIM_Prescaler=psc;中psc为8399,那么它的频率就为84MHZ/8400=10000HZ,到此肯定会有靓仔有疑惑了——你他喵的psc定义的为8399,那么为什么你计算频率的时候除了8400呢,你小子框我
有问题很好,但是我没有骗你,为啥呢,因为我的计数初值为0,而0-8399为8400个数,所以是除8400!
好了,我们继续。
知道了我们的频率为10KHZ,那么就意味着计10000个数对应的时间为1秒,也就是说周期就为1/10000秒,也就是100ms。

好,分频值解释好了,我们再来说自动重装载值arr得定义意味着啥
看我文章的第一张图,也就是图一(好吧,这句话确实是句废花),自动重装载值,见名知意,就是自动重新装载的值(喵的,好像又是一句废花),就比如你设置从0开始计数,自动重装载值为100,那么计数就是0,1,2,3,…99,100,然后接下来自动又变为0,1,2,3,…99,100。(好吧,只可意会不可言传,受不了了,我就只能这么解释了)这两句解释完了,我们接着看。

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2

PWM模式也是一个细节,在手册中是这么解释的:
以通用定时器 (TIM2 到 TIM5)计数模式为例:
110:PWM 模式 1––在递增计数模式下,只要 TIMx_CNT<TIMx_CCR1,通道 1 便为有 效状态,否则为无效状态。在递减计数模式下,只要 TIMx_CNT>TIMx_CCR1,通道 1 便为 无效状态 (OC1REF=0),否则为有效状态 (OC1REF=1)。
111:PWM 模式 2––在递增计数模式下,只要 TIMx_CNT<TIMx_CCR1,通道 1 便为无 效状态,否则为有效状态。在递减计数模式下,只要 TIMx_CNT>TIMx_CCR1,通道 1 便为 有效状态,否则为无效状态
通道有效,则输出你设定的有效电平(极性电平)
通道无效,则输出你设定与有效电平相反电平(极性电平)
总结就是。
PWM模式1一只要TIMx_ CNT< TIMx_ CCR1,通道1便为有效状态,否则为无效状态。
PWM模式2-一只要 TIMx_ CNT < TIMx _CCR1,通道1便为无效状态,否则为有效状态。

TIM_OC2Init(TIM2, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM2 OC2
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);  //使能TIM2在CCR2是的预装载寄存器

TIM_OC2Init、TIM_OC2PreloadConfig这两个函数,其实就是指定是哪个通道的,之前都是配置定时器2,但是我们用到的是通道2,但是之前并没有配置通道2,这里配置,在这里我还专门为大家找了函数解释
270度舵机占空比,stm32,单片机,arm
看英文的第一句,就是Channel2,不用我多说,懂得都懂。
270度舵机占空比,stm32,单片机,arm
对比一下TIM_OC1Init的解释就是Channel1。
OK,最后再来看一下main函数,在main初始化中写

TIM2_PWM_Init(199,8399);
大家可以算一下,我这个PWM的周期,很简单为20ms。讲了半天PWM,终于要到舵机了。

舵机原理

舵机和PWM之间有啥关系呢?
对于一般的舵机来说,所对应的PWM波的周期为20ms,即舵机接收的PWM信号频率为50HZ。
其空占比与转动角度的关系。普通舵机的舵量是0~180°。脉冲宽度范围 0.5ms ~ 2.5ms,我又为大家找了张图,说明一下,这图是我引用的270度舵机占空比,stm32,单片机,arm
但是,我们使用的舵机为270度,并不是180度,所以我们还要重新映射一下,我去网上看了一下卖家给的信息,他是这么说的
270度舵机占空比,stm32,单片机,arm
就是0.5ms对应0度,2.5ms对应270度,1.5ms对应135度,我列了张表格,这个如果看懂了上面的计算方法,自己很容易就可以计算出来对应的数值

输入信号脉冲宽度 0.5 0.83 1.16 1.5 1.83 2.16 2.5
舵机输出角度 0 45 90 135 180 225 270
Compare2 5 8 12 15 18 22 25

其中Compare2我解释一下来自void TIM_SetCompare2(TIM_TypeDef* TIMx, uint32_t Compare2)这个函数
270度舵机占空比,stm32,单片机,arm
这个函数,可以改变指定定时器的CCRX值,这里所对应的时间大家可以自己计算。

在while(1)中就可以写

		Delay_ms(1000);	 
		TIM_SetCompare2(TIM2,5);	//修改比较值,修改占空比对应0度
		
		Delay_ms(1000);	 
		TIM_SetCompare2(TIM2,8);	//修改比较值,修改占空比对应45度
		
		Delay_ms(1000);	 
		TIM_SetCompare2(TIM2,12);	//修改比较值,修改占空比对应90度
		
		Delay_ms(1000);	 
		TIM_SetCompare2(TIM2,15);	//修改比较值,修改占空比对应135度
		
		Delay_ms(1000);	 
		TIM_SetCompare2(TIM2,18);	//修改比较值,修改占空比对应180度
		
		Delay_ms(1000);	 
		TIM_SetCompare2(TIM2,22);	//修改比较值,修改占空比对应225度
		
		Delay_ms(1000);	 
		TIM_SetCompare2(TIM2,25);	//修改比较值,修改占空比对应270度

来观察舵机的运动情况

270度舵机占空比,stm32,单片机,arm文章来源地址https://www.toymoban.com/news/detail-625495.html

到了这里,关于stm32f407驱动20KG 270度舵机的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • STM32F407驱动GC9A01+CST816D触摸显示屏

    STM32F407驱动GC9A01+CST816D触摸显示屏 GC9A01是一款spi接口的1.28寸圆形屏,分辨率240*240,3.3v供电。 CST816D是一款IIC接口的触摸屏,模块上有4根信号线RST-复位线,INT-触摸中断线,当触摸屏检测到触摸信号后会输出高电平,SCL-数据时钟线,SDA-数据线。如果只是简单的使用INT线可以不

    2024年01月17日
    浏览(61)
  • 从STM32F407到AT32F407(一)

    雅特力公司的MCU有着性能超群,价格优越的巨大优势,缺点是相关资料少一些,我们可以充分利用ST的现有资源来开发它。 我用雅特力的STM32F437开发板,使用原子 stm32f407的开发板自带程序,测试串口程序,原设定串口波特率为115200,但是输出乱码,波特率改成230400,串口输

    2024年02月02日
    浏览(61)
  • STM32F407——串口通信

    本文将对串口通信的分类和基于 stm32 的串口配置进行介绍,以及如何使用串口调试助手进行串口收发功能的调试,旨在帮助还不会使用 stm32 单片机串口资源进行通信的家人们快速学会如何使用串口来进行通信。 (纯干货、快速上手、零基础也能会!!!) (1)串口,即串

    2023年04月08日
    浏览(56)
  • STM32F407的时钟

    时钟源用来为环形脉冲发生器提供频率稳定且电平匹配的方波时钟脉冲信号。它通常由石英 晶体振荡器和与非门组成的正反馈振荡电路组成,其输出送至环形脉冲发生器。 F4开发指南P107 F4开发指南P108 HSI高速内部时钟源 High Speed Internal。RC 振荡器,频率为 16MHz。可以直接作为

    2024年02月10日
    浏览(55)
  • STM32F407的介绍

    内核 32位 高性能ARM Cortex-M4处理器 时钟: 高达168MHz,实际还可以超频一点点 stm32f407的主频通过PLL倍频后能够达到168MHz,而且芯片内置一个16MHz的晶振和一个32KHz的晶振,可以满足不同功耗的需求。 支持FPU(浮点运算)和DSP指令 144引脚 114个IO口 存储器容量: 1024K FLASH, 192K

    2024年02月10日
    浏览(58)
  • 初识 STM32和STM32F407简介

    2007 年 6 月,ST 在北京发布了全球第一款基于 ARM Cortex M3 内核的 32 位通用微控制 器芯片:STM32F103,以优异的性能,丰富的资源,超高的性价比,迅速占领市场,从此一鸣 惊人,一发不可收拾,截止到 2020 年 6 月,STM32 累计出货量超过 45 亿颗。 战舰开发板使用的 STM32F103ZET6

    2023年04月08日
    浏览(75)
  • STM32F407 --USART使用

    目录 1. 串口配置--普通模式 2. 实现数据的传输主函数 1)单引号双引号的应用数组传输 2)将调试信息用串口打印传送到电脑上 1. 串口配置--普通模式 F407使用的M4内核与F103使用的M3内核不一样,导致在使用配置上有区别。需要在F103配置的基础上专门将GPIO的PIN配置成复用功能

    2024年02月16日
    浏览(59)
  • STM32F407的PWM

    泉水 STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。 高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。 通用定时器也能同时产生多达 4路的 PWM 输出 STM32F407 最多可以同时产生 30 路 PWM 输出! 这里我们仅利用 TIM14的 CH1 产生一路 PWM 输出。 如上所

    2024年02月17日
    浏览(47)
  • STM32F407 移植 FreeRTOS

    本实验是基于正点原子 STM32F407ZG 探索者开发板完成的,所以需要一个STM32F407ZG 探索者开发板 用于移植的基础工程(下面会讲) FreeRTOS源码(下面会讲) 本实验所有用到的代码:基于正点原子STM32F407的FreeRTOS移植工程.zip 1.1 移植前准备 1.1.1 基础工程 由于后续需要用到 LED、

    2024年02月08日
    浏览(70)
  • STM32F407添加DSP库

    编译程序出现以下报错 出现 “error: #5: cannot open source input file “arm_const_structs.h”: No such file or directory” 错误的原因是编译器无法找到名为 “arm_const_structs.h” 的头文件。 头文件路径错误 头文件未安装或丢失 编译器配置问题 添加DSP库 添加DSP库可以参考这篇博客: STM32CubeMX关

    2024年02月05日
    浏览(65)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包