输出pwm控制舵机
时间: 2025-07-01 19:43:21 浏览: 11
### 使用PWM信号控制舵机的实现方法
#### 舵机的工作原理
舵机是一种能够精确控制角度的小型电机设备,其内部集成了减速齿轮组、位置传感器以及控制电路。通过输入特定宽度的脉冲信号(通常为周期20ms的PWM信号),可以驱动舵机转至指定的角度[^1]。
#### PWM信号参数
标准舵机接受的PWM信号具有固定的周期(T=20ms)。不同占空比对应不同的旋转角度:
- 占空比为 **0.5ms** 对应 0°;
- 占空比为 **1.5ms** 对应 90°;
- 占空比为 **2.5ms** 对应 180°;
具体计算公式如下:
\[ \text{占空比时间} = (\frac{\text{目标角度}}{180}) * (2.5 - 0.5) + 0.5 \]
对于 STM32 微控制器而言,可以通过 TIM 配置生成所需的 PWM 波形。
---
#### 硬件连接
假设使用的是 STM32 Nucleo 开发板和 SG90 型号舵机,则硬件连接方式如下:
- VCC 连接到 5V 或 3.3V;
- GND 接地;
- 控制信号线(通常是橙色)连接到 GPIO 引脚(例如 PA5)[^1]。
---
#### STM32CubeIDE 的配置过程
在 STM32CubeMX 中完成以下操作:
1. 启用定时器模块(TIMx),并将其模式设置为 PWM 输出。
2. 设置定时器参数以满足 20ms 的周期需求。例如:
- APB1/APB2 时钟频率设为 72MHz;
- 自动重装载寄存器(ARR)值 \( ARR = \frac{f_{\text{clock}}}{f_{\text{desired}}} - 1\);
- 捕获/比较寄存器(CCR)用于调整占空比。
以下是具体的数值设定示例:
- 如果期望频率为 50Hz (即 T=20ms),则 \( f_{\text{desired}} = 50 \),因此 \( ARR = \frac{72,000,000}{50} - 1 = 1,439,999 \)。
---
#### 代码实现
##### 1. 初始化函数
初始化定时器以生成 PWM 信号:
```c
#include "stm32f4xx_hal.h"
void MX_TIM2_Init(void)
{
__HAL_RCC_TIM2_CLK_ENABLE();
TIM_HandleTypeDef htim;
htim.Instance = TIM2;
// 定义计数器自动重载值(ARR)
uint32_t prescalerValue = (uint32_t)(SystemCoreClock / 72000000);
htim.Init.Prescaler = prescalerValue - 1; // 分频系数
htim.Init.CounterMode = TIM_COUNTERMODE_UP; // 计数方向向上
htim.Init.Period = 19999; // 自动重装值,决定周期长度
HAL_TIM_PWM_Init(&htim);
TIM_OC_InitTypeDef sConfigOC;
sConfigOC.OCMode = TIM_OCMODE_PWM1; // PWM 模式1
sConfigOC.Pulse = 1500; // 初始占空比,默认指向中间位置
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; // 输出极性高电平有效
HAL_TIM_PWM_ConfigChannel(&htim, &sConfigOC, TIM_CHANNEL_1); // 配置通道1
}
```
##### 2. 动态调节角度
动态改变 CCR 寄存器中的值即可更改占空比,从而达到控制舵机的目的:
```c
void SetServoAngle(TIM_HandleTypeDef* htim, int angle)
{
float pulseWidthMs = ((float)angle / 180.0) * 2.0 + 0.5; // 将角度转换成毫秒级脉宽
uint32_t compareValue = (pulseWidthMs / 20.0) * htim->Init.Period; // 转换成计数值
__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_1, compareValue); // 更新比较寄存器
}
// 示例调用
SetServoAngle(&htim2, 90); // 设定舵机转向90度
```
---
#### Linux 下模拟 PWM 信号
如果是在嵌入式 Linux 平台上运行程序,可利用 `sysfs` 文件接口或者直接编写字符设备驱动来生成 PWM 信号。然而需要注意的是,不建议采用传统的 `init_timer` 和 `hrtimer_init` 方法,因为这些机制难以提供足够的精度[^2]。
推荐的方式是借助专用的 PWM 子系统框架,在 `/dev/pwmchipX` 上创建文件节点,并通过写入相应的占空比比例值来进行控制[^2]。
---
### 总结
无论是基于裸机环境还是操作系统平台下开发,核心思路均围绕着正确配置 PWM 参数展开。STM32 提供了灵活易用的外设资源支持高效编程实践,而针对更高层次抽象场景下的解决方案也需兼顾实时性和稳定性考量因素。
阅读全文
相关推荐


















