舵机

理论

 PWM(脉冲宽度调制)信号 来控制旋转角度

通过PWM向伺服器发送一个控制信号时,输出轴就可以转到特定的位置。只在控制信号持续不变,伺服机构就会保持相对的角度位置不变。如果控制信号发生变化,输出轴的位置也会相应发生变化。(摘抄,图也是

  1. 舵机控制信号:

    • 舵机期望一个周期性的 PWM 信号,标准周期通常为 20ms (50Hz)

    • 周期计算

    • 控制旋转角度的是 PWM 信号中的 高电平脉冲宽度

    • 典型的脉冲宽度范围是:

      • 0.5ms - 对应舵机的最小角度 (通常为 0°)

      • 1.5ms - 对应舵机的中间角度 (通常为 90°)

      • 2.5ms - 对应舵机的最大角度 (通常为 180°)

    • 对于 180° 舵机,脉冲宽度范围通常是 0.5ms - 2.5ms。有些舵机范围可能略有不同 (如 0.6ms-2.4ms),需要查阅其数据手册。

  1. STM32 实现:

    • STM32 使用其内置的 高级定时器 (TIM1, TIM8) 或 通用定时器 (TIM2, TIM3, TIM4, TIM5 等) 来产生精确的 PWM 信号。

    • 需要配置定时器:

      • 时钟源: 内部时钟 (APB 总线时钟)。

      • 预分频器 (Prescaler): 降低定时器时钟频率。

      • 计数器周期 (Auto-Reload Register - ARR): 决定 PWM 信号的周期。

      • 捕获/比较寄存器 (Capture/Compare Register - CCRx): 决定 PWM 信号的高电平脉冲宽度 (与 ARR 值比较)。

    • 使用定时器的 PWM 模式 (通常是 PWM 模式 1 或 2)。

    • 将定时器的某个通道 (如 CH1, CH2, CH3, CH4) 映射到特定的 GPIO 引脚上。

初始0,计算出来500

接线

  • 红色/棕色: VCC (电源正极) - 通常需要 5V 电源 (注意:STM32 开发板的 5V 输出电流有限,驱动多个舵机或大扭力舵机时务必使用独立电源供电)。

  • 黑色/棕色: GND (电源负极) - 必须与 STM32 的 GND 共地

  • 黄色/橙色/白色: SIG (信号线) - 连接到 STM32 配置为 PWM 输出的 GPIO 引脚。

    舵机 颜色 STM32
    红色 VCC 5V
    棕色 GND GND
    黄色 信号线 PWM输出引脚

代码

STM32CubeMX 配置

  1. 选择芯片/开发板。

  2. 配置时钟: 确保系统时钟 (HCLK) 和 APB 总线时钟 (APB1 或 APB2,取决于你使用的定时器挂在哪个总线上) 正确设置。

  3. 配置定时器:

    • 选择你要使用的定时器 。

    • 时钟源: Internal Clock

    • 通道: 选择一个通道 (例如 Channel 1),模式设置为 PWM Generation CHx

    • 参数设置:

      • Prescaler (PSC - 预分频器): 计算值使定时器计数频率达到所需精度。例如,如果 APB 时钟是 72MHz,目标 PWM 频率是 50Hz (周期 20ms),则:

        • 定时器计数频率 = APB时钟 / (PSC + 1)

        • 目标计数器值 ARR 应接近 定时器计数频率 * 0.02 (20ms)。

        • 假设我们选择 PSC = 71:定时器计数频率 = 72MHz / (71 + 1) = 72MHz / 72 = 1MHz (1,000,000 Hz),即每个计数周期 1us

      • Counter Period (ARR - 自动重装载值): 设置为 20000 - 1。因为计数频率是 1MHz (1us/计数),所以 20000 个计数对应 20,000 us = 20ms (符合 50Hz)。ARR = Period - 1

      • Pulse (CCR1 - 初始脉冲宽度): 可以先设置为 1500 - 1 (对应 1.5ms 中间位置)。实际控制时在代码中动态修改这个值。

    • 其他设置: 保持默认 (计数方向向上,对齐模式 Edge)。

  4. 配置 GPIO: 确认 CubeMX 自动为你选择的定时器通道配置了正确的 GPIO 引脚。

  5. 生成代码: 设置好项目名称、路径、IDE ,然后生成代码

keil代码

1.打开定时器pwm通道

HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);//开启定时器3的通道一

if(pulse<2500)
		{
			__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,pulse);//0-2.5%
			pulse=pulse+500;
		}
		else
		{
			pulse=500;
		}
    HAL_Delay(1000);

代码实现效果:从0°转到45到90到135

错误解决

1.注意打开的定时器的通道是几

2.计算非常重要,定时器设置的参数什么意思

b站截图计算

​​​​​​电赛:二维云台控制_二维云台寻迹控制-CSDN博客

因为想准备电赛的云台,所以查到了好文章,分享一下~

接下来的文章是我参考过的文章,补充了我的匮乏

STM32使用PWM控制舵机_舵机pwm控制-CSDN博客

stm32cubeMX智能小车舵机模块-CSDN博客

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐