【STM32】HAL库 PWM驱动舵机

本文介绍了如何使用STM32的HAL库进行舵机控制,包括设置定时器中断以生成20ms时基脉冲,以及通过PWM驱动LED实现LED灯的呼吸效果。详细讲解了舵机控制原理和代码实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系列文章目录

【STM32】HAL库 新建MDK工程
【STM32】HAL库 定时器中断
【STM32】HAL库 PWM驱动LED呼吸灯


前言

使用按键控制PWM,驱动舵机

一、SG90舵机

舵机的控制一般需要一个20ms左右的时基脉冲,脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度伺服为例,那么对应的控制关系是这样的:

高电平时间旋转角度
0.5ms0度
1.0ms45度
1.5ms90度
2.0ms135度
2.5ms180度

计数器自动重装值为ARR,0.5ms的计数次数为h。
ARR/ 20 = h / 0.5,h = ARR /40。

1ms旋转45度,1ms的计数次数为0.5ms的两倍 ,求系数k
ARR/ 40 * 2 = 45 *k + ARR/40,k = ARR/ 1800。

1ms的占空比为1 / 20
CCR = 占空比 * ARR = ARR / 20 = ARR/ 40 * 2
CCR = 角度 * ARR / 1800 + ARR /40

二、STM32CubeMX设置

舵机的控制一般需要一个20ms左右的时基脉冲,所以一个周期的时间为20ms,50Hz。舵机的死区时间为5us,所以重装载值需要小于4000 = 20ms/5us。重装载值取2000,50Hz = 72MHz / 分频系数/2000 ,分频系数为720。

在这里插入图片描述

按键引脚

三、代码

  HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
   if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) == GPIO_PIN_RESET)
	 {
			HAL_Delay(20);
			while (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == GPIO_PIN_RESET);
			HAL_Delay(20);
		 	Angle += 30;
			if (Angle > 180)
			{
				Angle = 0;
			}
	 }
	 __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2,Angle  * (htim2.Init.Period + 1) / 1800 + (htim2.Init.Period + 1) / 40);
  }
  /* USER CODE END 3 */
### 使用 STM32 HAL 实现 PWM 控制舵机 为了使用 STM32 HAL 来控制舵机,可以按照以下方法配置定时器并生成所需的 PWM 信号。具体来说,对于 SG90 舵机而言,其需要一个周期为 20 ms 的 PWM 波形,其中高电平的时间范围在 0.5 到 2.5 ms 来表示不同的角度位置[^2]。 下面是一个简单的 C 语言程序片段用于初始化 TIMx 定时器以产生这样的波形: ```c #include "main.h" TIM_HandleTypeDef htimX; void MX_TIMX_Init(void) { __HAL_RCC_TIMX_CLK_ENABLE(); // 初始化结构体设置默认参数 htimX.Instance = TIMX; // 设置自动重装载寄存器的值 (ARR),即计数的最大值加一 uint16_t period = (uint16_t)((SystemCoreClock / ((htimX.Init.Prescaler + 1U) * 1000)) - 1); htimX.Init.Period = period; // 设定预分频系数 (PSC), 这里假设系统核心时钟速度为72MHz,则psc设为71得到大约1us分辨率 htimX.Init.Prescaler = 71; // 向上计数模式 htimX.Init.CounterMode = TIM_COUNTERMODE_UP; // 配置通道作为PWM输出 TIM_OC_InitTypeDef sConfigOC; sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; } // 函数用来更新占空比从而改变PWM宽度进而调整舵机的角度 void SetServoAngle(uint8_t angle) { float pulse_width_ms = ((float)(angle) / 180.0f) * 2.0f + 0.5f; // 计算所需脉宽(ms) int compare_value = (int)(pulse_width_ms * SystemCoreClock / 1000); // 将毫秒转换成比较匹配值 __HAL_TIM_SET_COMPARE(&htimX, TIM_CHANNEL_1, compare_value); } ``` 上述代码中 `MX_TIMX_Init` 函数负责初始化指定编号的定时器(例如 TIM2 或者其他可用资源)。而 `SetServoAngle` 接受一个介于 0 和 180 之间的整数值,并据此计算出相应的 PWM 占空比,最终调用 HAL 提供的功能函数修改对应的比较寄存器中的值达到调节目的的效果[^4]。 需要注意的是,在实际应用过程中可能还需要考虑硬件连接方式以及具体的引脚分配情况等因素的影响。此外,如果遇到舵机响应异常的情况,应该检查定时器的时钟源频率是否正确配置,因为这可能会引起脉冲宽度与预期不符的问题[^3]。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

youuuuvvu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值