stm32Cubemx实用篇(一):PWM控制SG90舵机

stm32Cubemx(一):PWM控制SG90舵机

本章将介绍使用stm32Cubemx软件配置PWM来控制SG90舵机角度。
硬件平台:Stm32H743IIT6 舵机:SG90(0°~180°旋转范围,网购5元一个) 软件:StmcubemxV6.0.1 、MDK5 cubemx下载地址: https://www.st.com/stm32cubemx


提示:以下是本篇文章正文内容,下面案例可供参考

一、SG90角度与PWM转换关系

舵机参数:f=50hz,t=20ms 根据选用的SG90参数,我们需要给出周期为20ms,其中高电平时间为 0.5ms-2.5ms的信号

0.5ms-------------0度; 2.5%
1.0ms------------45度; 5.0%
1.5ms------------90度; 7.5%
2.0ms-----------135度; 10.0%
2.5ms-----------180度; 12.5%

二、Cubemx参数配置

1、时钟配置
在这里插入图片描述

2、定时器配置PWM输出设置

根据SG90的参数,我们需要设置PWM输出一个周期时间为20ms,初始值为0.5ms高电平的信号。

计算方法:Timer定时器时钟我们设置为240Mhz,这里我们将预分频设置为239,则一个周期为240Mhz/(239+1)=1Mhz(即1us),所以20ms的周期我们需要计数20000-1=19999个填入Counter Period参数中。
另外,我们还需要一个默认脉冲宽度为0.5ms的,0.5/20*20000=500

其他设置如下图所示:

在这里插入图片描述

三、MDK代码修改与运行

1.PWM与SG90转换角度转换函数

方便实验我们将所需要的角度与PWM计数值对应关系封装成一个函数。只需要输入我们所需要的角度和相关定时器参数即可。

代码如下(示例):

//设置SG90为参数范围内(0~180°)任意度数
/*
* htim:要设置的定时器句柄
* Channel:PWM输出通道
* countPeriod:pWM一个周期计数值,这里为20000
* CycleTime:一个周期多少ms,这里为20
*
*/
void Set_SG90_angle(TIM_HandleTypeDef * htim,uint32_t Channel,uint8_t angle,uint32_t countPeriod,uint32_t CycleTime)
{
	uint16_t compare_value=0;
	if(angle<=180)
	{
		//角度转化为数值
		compare_value=0.5*countPeriod/CycleTime+angle*countPeriod/CycleTime/90;
		__HAL_TIM_SET_COMPARE(htim, Channel, compare_value);
	}

}

2.实验现象

这里在主函数增加了按键扫描通过按键控制SG90正反转180°。
另外还增加了串口printf函数,打印SG90旋转时的角度变化。

代码如下(示例):

	key=KEYPRESS();    //按键
	if(key==1)//按键1按下SG90从0°旋转到180°
	{
			for(u8 i=0;i<180;i++)//从0到180°递增
			{
				Set_SG90_angle(&htim5,TIM_CHANNEL_1,i,20000,20);
				printf("SG90角度:%d°",i);
				HAL_Delay(5);
			}	
	}
	if(key==2)//按键2按下SG90从180°旋转到0°
	{
			for(u8 j=180;j>0;j--)//从180°到0°递减
			{
				Set_SG90_angle(&htim5,TIM_CHANNEL_1,j,20000,20);
				printf("SG90角度:%d°",j);
				HAL_Delay(5);
			}
	}			

可以看到按键按下SG90按照我们预期的动作变化。实验成功。
在这里插入图片描述


STM32G431RBT6是一款基于ARM Cortex-M4F内核的微控制器,它属于STM32Cube系列的一部分,提供了丰富的GPIO、ADC等外设资源。SG90舵机是一种常见的微型伺服电机,常用于各种机器人项目。 要在STM32CubeMX控制SG90舵机转动,你需要完成以下几个步骤: 1. **配置GPIO**:首先,在STM32CubeMX中,选择你的STM32G431RBT6板子并配置GPIOA或GPIOB作为舵机的输出口,通常舵机信号线连接到PWM(脉冲宽度调制)引脚。 2. **设置PWM模式**:将选定的GPIO配置为PWM输出模式,设置合适的频率(例如50Hz),这对于精确控制舵机的速度至关重要。 3. **编写代码**:使用Keil MDK或STMCubeIDE等集成开发环境编写C代码,通过调整PWM周期和占空比来改变舵机的角度。对于SG90,一般半波(50% duty cycle)对应90度,全波(100% duty cycle)对应180度。 ```c #include "stm32f4xx_hal.h" // ...其他头文件 void setup() { GPIO_InitTypeDef GPIO_InitStruct; // 初始化GPIO GPIO_InitStruct.Pin = GPIO_PIN_1; // 替换为你配置的GPIO引脚 GPIO_InitStruct.Mode = GPIO_MODE_AF_HYSTERESIS; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF1_TIM2; // 如果使用TIM2进行PWM HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化TIM2 TIM_HandleTypeDef htim2; TIM_ClockConfigTypeDef sClockSourceConfig; TIM_MasterConfigTypeDef sMasterConfig; htim2.Instance = TIM2; htim2.Init.Prescaler = (uint16_t) (SystemCoreClock / (1000 * 50) - 1); // 设置频率为50Hz htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 2000; // 2000us周期,这取决于你的实际频率和需要的最大角度 if (HAL_TIM_PWM_Init(&htim2) != HAL_OK) { // 处理错误... } // 配置PWM通道1 HAL_TIM_PWM_ConfigChannel(&htim2, &htim2.Init.PulseWidthCycle, TIM_CHANNEL_1); // 设置TIM2为master模式 sMasterConfig.MasterOutputTrigger = TIM_TRGOarrivaltigger; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfiguration(&htim2, &sMasterConfig); // 开启定时器 HAL_TIM_Base_Start_IT(&htim2); } void loop() { float angle = map(analogRead(PIN_X), 0, 1023, 0, 180); // 替换PIN_X为你的ADC输入引脚 uint16_t pulse_width = map(angle, 0, 180, 0, 2000); // 转换为PWM周期 TIM_OC1_SetCompare(&htim2, pulse_width); // 更新比较值,控制舵机的角度 } ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

YZW0123

谢谢大家的支持,请关注我哦!!

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

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

打赏作者

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

抵扣说明:

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

余额充值