首页 > 行业资讯 >无刷电机
TECHNICAL SUPPORT

ESP32如何让舵机按设定时间转到指定角度?完整代码和接线指南

发布时间: 2026-05-31

使得 ESP32 去操控舵机, 于规定的时间范围之内, 精确地转动到所指定的角度, 这是诸多自动化项目, 像是机械臂、云台、定时开关等的基础要求, 然而不少开发者会碰到“舵机抖动”“转不到位”或者“时间控制不准确”这样的问题, 本文会从硬件接线、核心代码一直到时间控制逻辑, 给你提供一套能够直接应用的标准方案。

01常见问题与核心原理

寻常示例: 你得让舵机于三秒之内从零度转向九十度, 接着停留两秒, 随后在一秒内返回零度。好多新手径直运用delay()去操控角度变换, 结果发觉舵机要不跳变、要不卡顿, 甚而失控。

核心原因在于, ESP32的PWM信号生成, 和舵机的角度响应, 这二者需要协调, 舵机是依据PWM脉冲宽度也就是占空比来定位的, 而非直接接受“角度”指令本身, 所以, 要达成“按规定时间旋转角度”这件事, 本质的理解该是: 要在指定的时间范围之内, 把PWM占空比从起始角度所对应的值, 平缓地变化到目标角度所对应的值。

核心公式

每步延时时间 = 总时间 / 步数

角度增量 = (目标角度 起始角度) / 步数

02硬件接线(必备材料)

被称作ESP32的开发板, 举例来说像ESP32WROOM32这种类型的。

标准舵机, 像SG90、这类, 其角度范围一般是0到180°。

电源为5V, 建议单独供电, 不要直接从ESP32的3.3V引脚那里取电, 不然舵机就会出现抖动现象

杜邦线(母对母)

接线图

舵机红线(电源) → 5V+(外部电源正极)
舵机棕线(地线) → GND(ESP32 GND,与外部电源共地)
舵机橙线(信号) → ESP32 GPIO 13(可任意选择PWM引脚)

旋转定时开关使用方法_定时旋转装置_esp32控制舵机按规定时间旋转角度

重要提示: 舵机启动的刹那间电流能够达到1A往上, 如果利用经USB供电的ESP32直接去驱动舵机, 非常容易致使重启或者WiFi中断连接。得运用外部5V/2A的电源给舵机供电, 且要把电源的地线同ESP32的地线相连接。

03核心代码实现(可直接复制)

本代码是基于框架的, 借助, 且要凭借库, 以此来实现平滑旋转。

方法一:使用库(推荐,更稳定)

# 
Servo ;
// 引脚定义
const int  = 13;
// 角度与时间参数
int  = 0;
int  = 90;
int  = 3000; // 单位:毫秒伟创动力,3秒
void setup() {
  .();
  .write(); // 初始化到起始角度
  delay(200); // 等待舵机到位
}
void loop() {
  // 执行平滑旋转:从0°到90°,用时3秒
  (, , );
  delay(2000); // 到达后停留2秒
  // 从90°回到0°,用时1秒
  (, , 1000);
  delay(2000); // 停留2秒后重复
}
void (int , int , int ) {
  int steps = 100; // 将运动拆分为100步,步数越多越平滑
  int  =  / steps;
  float  = (float)(  ) / steps;
  for (int i = 0; i <= steps; i++) {
    int  =  +   i;
    .write();
    delay();
  }
}

方法二:使用(需手动配置PWM频率)

# 
#  13
#  0
#  50    // 舵机标准频率50Hz
#  8  // 8位分辨率,0255
void setup() {
  (, , );
  (, );
}
void loop() {
  // 从0°到90°,用时3秒
  (0, 90, 3000);
  delay(2000);
  // 从90°回到0°,用时1秒
  (90, 0, 1000);
  delay(2000);
}
// 角度转PWM占空比(0180° > 约 5%  10% 占空比)
int (int angle) {
  // 8位分辨率下:0°=23(约5%),90°=115(约25%),180°=205(约45%)
  // 具体值需根据舵机型号微调
   map(angle, 0, 180, 23, 205);
}
void (int , int , int ) {
  int steps = 100;
  int  =  / steps;
  float  = (float)(  ) / steps;
  for (int i = 0; i <= steps; i++) {
    int  =  +   i;
    int  = ();
    (, );
    delay();
  }
}

04时间控制精准度

那些代码已然能够完成基础功能性情况, 然而要是你所需的是毫秒级别的精准程度或者长时间持续运行且不存在漂移现象, 那么请留意:

1. 延迟函数delay()的不精确性在于, 它属于基于CPU周期的单纯阻塞式延时, 由于会受到中断的影响从而累积误差, 所以可以采用非阻塞定时器()予以替代。

2. 改进版非阻塞代码示例

# 
Servo ;
int  = 0;
int  = 90;
 long  = 0;
int  = 3000; // 总时间
int  = 0;
bool  = false;
int steps = 100;
int  = 0;
 long ;
void setup() {
  .(13);
  .write(0);
   =  / steps;
}
void loop() {
  // 示例:每5秒触发一次旋转
    long  = 0;
  if (()   > 5000) {
     = ();
    (0, 90, 3000); // 开始从0°到90°伟创动力舵机,3秒
  }
  // 非阻塞执行
  if () {
    if (()   >= ) {
       = ();
      ++;
      if ( <= steps) {
        float  = (float)(  ) / steps;
         =  +  * ;
        .write();
      } else {
         = false; // 运动结束
      }
    }
  }
}
void (int from, int to, int ) {
   = from;
   = to;
   = ;
  steps = 100;
   =  / steps;
   = 0;
   = ();
   = true;
}

esp32控制舵机按规定时间旋转角度_定时旋转装置_旋转定时开关使用方法

其具备这样的优势, 即主循环loop()不会遭受阻塞现象, 能够于旋转进程之中, 与此同时处理WiFi、传感器读取这类任务。

05常见问题排查

问题现象 可能原因
舵机不转,但有轻微抖动 电源电流不足 使用外部5V/2A电源
舵机卡顿、不到位 步数太少或延时太短 增加 steps 到200以上,或加大
角度偏差大 PWM占空比映射不准确 方法时,微调 中的映射值(如23、205)
旋转时间明显偏长或偏短 delay() 累积误差 改用非阻塞 () 方法

06核心结论与行动建议

关键要点在于, ESP32去操控舵机依照规定的时间来转动角度, 从实质上而言, 是借助“分步添加以及定时延缓时间”在特定的时长范围之内均匀地更改PWM占空比。然而, 运用库并搭配()函数, 则呈现为最为有效、最为稳定的一种方式。

行动建议

1. 优先考虑选用库, 其代码具备简洁的特性, 并且有着良好的兼容性。

2. 一定要运用独立的电源去给舵机供应电力, 防止ESP32出现死机的状况。

3. 进行调试之际, 要针对单个角度展开测试, 比如说直接书写90°, 以此确保舵机能够正常工作, 之后再去测试时间控制。

4. 如果有高精度定时的需求, 那就改用()这种非阻塞方式, 以此来避免delay()所产生的累积误差。

着重再次强调: 对于时间控制而言, 其精准度是由“步数”以及“每步延时”彼此间的乘积关系所决定的。当步数增多的时候, 会显得更加平滑, 然而每步的延时需要相应地进行缩短处理。能够合理地去选择步数(100到200步这个范围), 便能够满足绝大多数的应用需求。

仅需当下按上述接线以及代码, 复制进 IDE里面, 上传至ESP32, 就能见到舵机于3秒之内从0°平滑转动至90°, 再停留过后返回。要是碰到问题, 对照排查表逐个检查就行。

为所有产品提供动力单元

联系伟创动力产品专家,为你的产品推荐合适的驱动系统所需部件。

发送邮件
在线留言
WhatsApp
+86 0769 8399 3238
 
kpowerMap