STM32的PWM引脚与定时器PWM控制舵机指南

一、前言

在嵌入式系统设计中,舵机控制是常见的需求,尤其在机器人、无人机和自动化设备等领域。STM32微控制器凭借其强大的功能和灵活性,成为实现舵机控制的理想选择。本文将详细介绍如何通过STM32的PWM引脚和定时器模拟PWM两种方式精确控制舵机。如果觉得这篇文章对您有所帮助,请点赞关注,您的支持是我坚持的动力

墨小羽ovo个人主页

二、背景

  1. 项目背景

最近我接手了一个立体智能车库系统项目,该项目需要用到12个舵机。然而,我接手时发现,前任同事已经将大部分PWM引脚用于其他功能,仅留下2个可用的PWM引脚。因此,我需要重新设计程序,使用定时器模拟PWM来控制剩余的舵机。
2. 解决方案

1.PWM引脚控制:对于可用的PWM引脚,直接使用硬件PWM控制舵机。
2.定时器模拟PWM:对于不足的PWM引脚,通过定时器中断和GPIO输出来模拟PWM信号,控制舵机。

资料链接

本节教程一共提供三个程序
1.STM32PWM引脚控制舵机转动
2.STM32定时器模拟PWM控制舵机转动
3.51单片机呼吸灯程序(我之前的程序,拿这个参考的)
本项目用到的资料已经全部放到QQ群,需要的可以自行下载
在这里插入图片描述

三、舵机知识(以SG90舵机为例)

1. 舵机概述

以SG90舵机为例,它通常需要一个20ms左右的时基脉冲,其中高电平部分在0.5ms到2.5ms之间变化,以控制舵机的转动角度。

2.舵机外观图

在这里插入图片描述

四. 舵机线序

在这里插入图片描述

红色 --------->VCC+5V

棕色 --------->GND

黄色---------->信号线

五.舵机控制信号

0.5ms对应0度

1.0ms对应约45度

1.5ms对应90度

2.0ms对应约135度

2.5ms对应180度

在这里插入图片描述在这里插入图片描述

六、STM32 PWM引脚控制舵机

  1. 初始化PWM

使用STM32的硬件PWM功能,首先需要配置定时器和GPIO引脚。以下是一个简化的配置过程:

c

void TIM3_PWM_Init(uint16_t arr, uint16_t psc) {  
	    GPIO_InitTypeDef GPIO_InitStructure;  
	    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  
	    TIM_OCInitTypeDef TIM_OCInitStructure;  
// 使能定时器3和GPIOA时钟  
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);  
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  

// 配置GPIOA.2为复用推挽输出  
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;  
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
GPIO_Init(GPIOA, &GPIO_InitStructure);  

// 初始化定时器3  
TIM_TimeBaseStructure.TIM_Period = arr; // 自动重装载值  
TIM_TimeBaseStructure.TIM_Prescaler = psc; // 预分频值  
TIM_TimeBaseStructure.TIM_ClockDivision = 0;  
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);  

// 配置TIM3的OC2为PWM模式  
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;  
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  
TIM_OC2Init(TIM3, &TIM_OCInitStructure);  
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  

// 使能定时器3  
TIM_Cmd(TIM3, ENABLE);  

}

2.定义一个频率为50HZ,周期为20MS的波形这里以STM32F103C8T6为例

3.TIM3_PWM_Init(20000-1,72-1)频率为50HZ的波形

4. 设置PWM占空比

通过修改TIM_SetCompare2(TIM3, pwm_value)中的pwm_value,可以设置PWM的高电平时间,从而控制舵机的角度。

七 定时器模拟PWM驱动舵机工作

这里以STM32F407ZGT6为例(由于公司电脑加密过了,没办法提供示例代码)

思路:

1.周期是20ms,频率为50hz的波形
0.5ms是0度

2.我们定义一个0.1ms的定时器中断
定义一个变量timer_cnt进行累加

3.当timer_cnt<=5(这里相当于就是0.5ms),舵机的引脚输出高电平,其余时间输出低电平

4.当timer_cnt累加到200时候,清零重新累加,这就相当于周期为20ms了

5.外部定义一个变量进行5,10,15,20,25这几个数据的切换即可

实现效果

这里是定义了2.5ms,占空比为12.5%的波形,达到了自己预期的结果
在这里插入图片描述

两种方法的比较

优势与局限

PWM引脚控制:配置简单,直接使用硬件PWM,响应速度快,但可用的PWM通道数量有限。
定时器模拟PWM:灵活性高,可以自定义更多的控制引脚,但需要更多的CPU资源和编程工作量。

八.应用场景

1.选择PWM引脚控制,当你需要快速简单地实现舵机控制,并且使用的舵机数量较少。
2. 选择定时器模拟PWM,当你的项目中有多个舵机需要控制,或者需要与其它定时器中断任务协同工作。

九总结

本教程介绍STM32使用PWM引脚进行舵机的控制,以及也介绍了使用定时器模拟PWM信号进行舵机的控制.同时也了解了一些舵机的相关知识.为编程提供了一定的基础.本次实践不仅加深了舵机控制的理解,也为后续项目提供了宝贵经验。最后呢,在编写博客的过程中,我尽量保持内容的准确性和完整性,但也难免会有疏漏或错误之处。欢迎各位读者指出其中的问题,帮助我不断进步。谢谢大家的阅读,希望这篇博客能够帮助到大家。点点关注,不迷路哦!
墨小羽ovo个人主页

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨小羽ovo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值