当前位置: 首页 > backend >正文

STM32CubeMX使用SG90舵机角度0-180°

1. 配置步骤

1.1 硬件连接

  • 舵机信号线 → STM32的PWM输出引脚(如 PA2,对应定时器 TIM2_CH3)。

  • 电源和地 → 外接5V电源(确保共地)。

1.2 定时器配置(以TIM2为例)

  1. 在STM32CubeMX中:
    选择定时器(如 TIM2)的PWM模式。

设置预分频器(PSC)和自动重载值(ARR),生成 50Hz PWM

使能TIM2和配置对应引脚(如 PA2)。

参数计算
  1. 主频为 72MHz(STM32F1系列):
    • 预分频器 PSC:根据主频调整,例如 72-1,使得分频后频率为 1MHz(每计数1次 = 1us)。

    • 自动重载值 ARR:决定PWM周期,例如 20000-1(对应20ms)。

    • 定时器时钟分频后频率:72MHz / (PSC + 1)

    • 目标频率:50Hz → 周期 20ms = 20,000us


2. 代码实现

2.1 定时器初始化

 在 main.c 中添加
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3);//PA2

2.2 设置舵机角度

 舵机控制基础

标准舵机通过PWM信号控制,一般要求:

  • 周期为20ms (50Hz)
  • 脉冲宽度0.5ms-2.5ms对应0°-180°
    • 0.5ms脉宽 → 0°
    • 1.5ms脉宽 → 90°
    • 2.5ms脉宽 → 180°
代码实现步骤
  1. 角度限制:确保输入角度在0-180度范围内
  2. 脉宽计算:将角度转换为对应的脉冲宽度(微秒)
    • pulse_width = 500 + (angle / 180.0) * 2000
    • 当angle=0时,脉宽=500μs
    • 当angle=180时,脉宽=2500μs
  3. 占空比计算:将脉宽转换为定时器的比较值
    • ccr = (pulse_width / 20000.0) * (htim->Instance->ARR + 1)
    • 其中ARR是定时器的自动重装载值,决定PWM周期
  4. 设置比较值:通过HAL库函数设置定时器的比较寄存器值 
/*** @description: * @param {float} angle:0-180* @return {*}*/
void Servo_SetAngle(float angle)
{// 角度限制if (angle < 0)angle = 0;if (angle > 180)angle = 180;// 计算脉冲宽度(0.5ms–2.5ms)float pulse_width = 500 + (angle / 180.0) * 2000; // 单位:us// 计算占空比(ARR=19999对应20ms周期)uint32_t ccr = (pulse_width / 20000.0) * (Servo_SetAngle_TIM->ARR + 1);// 写入比较寄存器Servo_SetAngle_TIM_CCR = ccr;
}
/* 舵机============================================================================ */
#define Servo_SetAngle_htim htim2          // 定义舵机定时器句柄
#define Servo_SetAngle_TIM TIM2            // 定义舵机定时器
#define Servo_SetAngle_TIM_CCR TIM2->CCR3  // 定义舵机定时器通道TIMx-ch3
void Servo_SetAngle(float angle);          // 舵机角度设置函数0-180度

2.3 主函数调用

  while (1){Servo_SetAngle(0);HAL_Delay(1000);Servo_SetAngle(90);HAL_Delay(1000);Servo_SetAngle(180);HAL_Delay(1000);}

 


4. 注意事项

  1. 频率校准
    如果舵机抖动,检查PWM频率是否为 50Hz(示波器测量信号周期)。

  2. 电压匹配
    舵机供电需稳定(5V),避免直接从STM32的3.3V取电。

http://www.xdnf.cn/news/6579.html

相关文章:

  • Rust 学习笔记:关于 String 的练习题
  • python中集合的操作
  • MySQL 与 FastAPI 交互教程
  • 在 Ubuntu 系统中,将 JAR 包安装为服务
  • LongRefiner:解决长文档检索增强生成的新思路
  • Redis + ABP vNext 构建分布式高可用缓存架构
  • IntelliJ IDEA克隆项目失败的解决方法
  • Tomcat发布websocket
  • 笔试强训:Day5
  • FPGA: UltraScale+ bitslip实现(方案+代码)
  • 【递归、搜索和回溯】穷举vs暴搜vs深搜vs回溯vs剪枝
  • 【向量模型 + HNSW 参数如何选择】
  • 用栈实现+-*/计算器
  • GPU八卡A100使用INT4-W4A16量化大模型实验
  • Manus AI 原理深度解析第三篇:Tools
  • 什么是DHCP?
  • JavaScript零基础入门笔记:狂神版
  • C# Try Catch Finally 执行顺序是什么?有返回值呢?
  • Openlayers:如何注册一个新的坐标系统
  • web第二次课后作业--设计一个注册登录系统
  • MyBatis:从入门到深度理解
  • 从入门到实战:时序图核心知识与高效绘制全解析(附模板)
  • 如何利用芯片模型提升终端PCB的SIPI热仿真精度
  • 如何让open-mpi在不同版本的OS上运行
  • shell常用语法
  • 晶振的核心参数
  • 会计要素+借贷分录+会计科目+账户,几个银行会计的重要概念
  • 从 Vue3 回望 Vue2:组件设计升级——Options API vs Composition API
  • OpenResty Manager 介绍与部署(Docker部署)
  • C++算法(22):二维数组参数传递,从内存模型到高效实践