登录/注册

stm32舵机控制pwm程序

更多

以下是基于STM32的标准外设库(如STM32F1系列)的舵机PWM控制示例程序:

#include "stm32f10x.h"

// 定义定时器和通道
#define SERVO_TIM        TIM3
#define SERVO_TIM_CLK    RCC_APB1Periph_TIM3
#define SERVO_GPIO       GPIOA
#define SERVO_GPIO_PIN   GPIO_Pin_6
#define SERVO_GPIO_CLK   RCC_APB2Periph_GPIOA
#define SERVO_TIM_CH     TIM_Channel_1

// PWM周期(20ms = 50Hz)
#define PWM_PERIOD 20000-1  // 定时器ARR值

void PWM_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;

    // 使能时钟
    RCC_APB2PeriphClockCmd(SERVO_GPIO_CLK, ENABLE);
    RCC_APB1PeriphClockCmd(SERVO_TIM_CLK, ENABLE);

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

    // 定时器基础配置
    TIM_TimeBaseStructure.TIM_Period = PWM_PERIOD;         // 自动重装载值
    TIM_TimeBaseStructure.TIM_Prescaler = 72-1;            // 预分频系数(72MHz/72 = 1MHz)
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(SERVO_TIM, &TIM_TimeBaseStructure);

    // PWM模式配置
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 1500;                  // 初始占空比(1.5ms)
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC1Init(SERVO_TIM, &TIM_OCInitStructure);

    // 使能定时器
    TIM_Cmd(SERVO_TIM, ENABLE);
    TIM_CtrlPWMOutputs(SERVO_TIM, ENABLE);  // 高级定时器需要此句
}

// 设置舵机角度(0.5ms-2.5ms)
void Set_Servo_Angle(uint16_t pulseWidth_us)
{
    // 限制脉冲宽度范围
    if(pulseWidth_us < 500) pulseWidth_us = 500;
    if(pulseWidth_us > 2500) pulseWidth_us = 2500;

    // 设置比较寄存器值
    TIM_SetCompare1(SERVO_TIM, pulseWidth_us);
}

int main(void)
{
    PWM_Init();

    while(1)
    {
        Set_Servo_Angle(500);   // 0度
        Delay_ms(1000);
        Set_Servo_Angle(1500);  // 90度
        Delay_ms(1000);
        Set_Servo_Angle(2500);  // 180度
        Delay_ms(1000);
    }
}

关键点说明:

  1. 时钟配置
    假设主频72MHz,预分频系数设为71(72-1),则定时器时钟为1MHz(1μs/计数)

  2. PWM参数

    • 周期:20ms → ARR = 20000-1
    • 脉宽范围:500-2500对应0.5ms-2.5ms
  3. 注意事项

    • 根据实际MCU型号调整时钟配置
    • 高级定时器(如TIM1)需要TIM_CtrlPWMOutputs(ENABLE)
    • 不同GPIO需要查表确认定时器通道映射
    • 确保舵机供电充足(建议单独供电)
  4. 扩展功能

    • 多通道控制:可复用同一定时器的不同通道
    • 角度转换:可添加函数将角度值(0-180°)转换为脉宽值

实际使用时需根据具体硬件连接修改GPIO和定时器配置,并注意舵机的工作电压和电流要求。

PWM信号是如何控制舵机的?

 PWM(脉冲宽度调制)信号控制舵机的核心原理是通过固定周期内高电平的持续时间(脉宽)对应

2025-09-29 10:48:51

舵机PWM信号介绍!

舵机 PWM 信号介绍 PWM(Pulse Width Modulation,脉冲宽度调制)信号是

2025-08-22 10:59:34

PWM 型号舵机控制方法!

一、PWM 舵机控制原理 PWM

2025-08-12 18:37:26

PWM信号控制舵机原理

PWM信号控制舵机原理

资料下载 jf_12881625 2023-09-21 09:32:37

STM32控制舵机的方法及实例

STM32控制SG90舵机 在这篇博客中,我讲解的是SG90的180°型号的

资料下载 佚名 2021-12-24 19:30:50

STM32—TIM3输出PWM信号驱动MG996R舵机(按键控制

文章目录**一、前言****二、MG996R舵机简介****三、通用定时器TIMx****四、TIM3输出PWM信号代码详解**一、前言利用STM32

资料下载 名士流 2021-11-23 18:21:47

stm32f4舵机控制代码

stm32f4舵机控制代码资料免费下载。

资料下载 姚小熊27 2021-04-26 09:33:24

使用STM32单片机实现16路PWM舵机驱动的程序和工程文件

本文档的主要内容详细介绍的是使用STM32单片机实现16路PWM舵机驱动的程序

资料下载 李le凡 2020-11-11 08:00:00

STM32 PWM驱动舵机实验

STM32 simulink驱动舵机效果如图5.1所示,本次实验用到的Simulink简易模型如图5.2所示,电路图接法如图5.3所示,YF-STM32

2023-11-29 16:30:12

德晟舵机PWM信号控制原理

现在常用的舵机控制信号主要有 PWM 信号和串口总线信号两种:其中 PWM

2023-10-16 15:51:23

编写Pwm控制舵机程序舵机无反应怎么解决

我都跟着做了的。以下为我所有的问题。问题1:编写Pwm控制舵机程序,

2022-02-16 06:16:55

STM32是如何控制舵机

PWM是什么?如何实现PWM信号输出?什么是舵机?STM32是如何

2021-10-19 06:19:36

STM32F407是如何控制舵机

述)]舵机需要信号的周期为20ms,即频率为50Hz。接下来正式操作:步骤一:STM32F4程序(本次

2021-08-19 08:33:18

STM32控制舵机

STM32控制舵机文章目录STM32

2021-08-04 06:26:51

STM32PWM控制舵机

摘自:STM32 PWM控制舵机作者:三速何时sub20发布时间: 20

2021-06-30 07:02:52
7天热门专题 换一换
相关标签