发布时间: 2026-05-05
文章给出舵机转动操控的规范化代码以及操作流程,它适配于、STM32等主要开发平台。不管您此刻是在制作机器人手臂,或者是打造智能小车,又或者是塑造舵面,依据以下指南能够迅速达成从零度至一百八十度的精确角度控制。
舵机的转动角度由PWM信号的高电平脉宽决定:
0°位置:高电平持续 0.5ms(毫秒)
90°中间位置:高电平持续 1.5ms
180°位置:高电平持续 2.5ms
PWM信号的周期是固定的,其固定值为20ms,此周期对应的频率是50Hz。控制代码的本质所在,便是输出那种符合上述所讲脉宽规则的方波。
以下代码经过了验证,在SG90、MG995、等常见舵机上,验证的结果是通过,此代码可以直接进行复制,然后使用着。
#
Servo ; // 创建舵机对象
void setup() {
.(9); // 将舵机信号线连接到的9号引脚
}
void loop() {
.write(0); // 转到0度
delay(1000); // 保持1秒
.write(90); // 转到90度
delay(1000); // 保持1秒
.write(180); // 转到180度
delay(1000); // 保持1秒
}
使用说明:
1. 把舵机红色的线,连接到5V电源上,小舵机连接的5V,大舵机需要进行外接电源。
2. 棕色/黑色线接GND
![]()
3. 橙色/黄色信号线接数字引脚9
4. 上传代码后,舵机自动循环转动
#
Servo ;
int pos = 0; // 当前角度变量
void setup() {
.(9);
}
void loop() {
// 从0度缓慢转到180度,每次增加1度,间隔15毫秒
for (pos = 0; pos <= 180; pos += 1) {
.write(pos);
delay(15); // 控制转动速度伟创动力舵机,数值越小越快
}
// 从180度缓慢转回0度
for (pos = 180; pos >= 0; pos = 1) {
.write(pos);
delay(15);
}
}
from Pin, PWM
time
# 设置PWM引脚和频率
servo = PWM(Pin(0)) # GP0引脚
servo.freq(50) # 50Hz频率
def (angle):
"""角度转脉宽:0°=0.5ms,180°=2.5ms,周期20ms"""
duty = int((angle / 180) (2500 500) + 500)
= int(duty / 20000 65535)
servo.()
# 测试转动
while True:
(0) # 转到0度
time.sleep(1)
(90) # 转到90度
time.sleep(1)
(180) # 转到180度
time.sleep(1)
// 使用定时器2通道1输出PWM,引脚PA0
# ".h"
htim2;
void ( angle) {
// 0°对应500个计数,180°对应2500个计数,周期20000计数
pulse = 500 + (angle * 2000 / 180);
E(&htim2, , pulse);
}
int main(void) {
();
// 初始化定时器2为PWM模式,频率50Hz,周期20000计数
// ... 标准初始化代码(此处省略,实际使用需完整配置)
while (1) {
(0);
(1000);
(90);
(1000);
(180);
(1000);
}
}
因为大舵机瞬间电流能够达到2A以上的缘故,电源不足,如果那样的话,就绝对不可以直接使用开发板USB供电,而是要使用独立电源,像4.8V 6V电池或者稳压模块等都是可以考虑的选择。
信号干扰:PWM信号线尽量远离电机线,长度不超过50cm
角度出现超限情况:有部分舵机仅仅只是支持从0度到180度,要是写入超出这个范围的数值,那么就会致使产生异响。
原因:普通舵机到达目标角度后仍会持续输出扭矩保持位置
出现这样的情况:当处于需要维持该角度的状况时,展现出无法解决的态势,此乃是舵机本就具备的特性;而当存在不需要保持该角度的情形时,促使舵机停止供电,或者将其驱动至设定为0度的空闲位置处。
检查引脚号是否与()参数一致
检查舵机信号线是否插反(通常黄色/橙色为信号线)
于setup()里,增添.begin(9600)伟创动力,以及.("Start")展开调试输出操作。
要特别留意,360°连续旋转的舵机没办法控制确切的角度,仅仅可以控制转速以及方向,将使其状态设定为写入90°时停止,当角度小于90°时逆时针方向加速,而角度大于90°时则顺时针方向加速。
舵机转动的本质:是什么呢,是输出周期20ms的信号,并且脉宽在0.5ms到2.5ms之间的PWM信号,代码里的write(角度)函数呢会做什么,会把这样的规则封装成直观的角度值。
立即行动建议:
1. 先进行第一步,要使用以及基础代码,也就是第二节示例里的代码,去驱动您手头的小舵机,以此来验证接线以及电源是正常的。
2. 第二步,逐行去修改,在.write()里的角度值,然后观察舵机实际转动的位置,进而建立起角度与物理位置的对应感。
3. 第三步:把舵机角度控制代码整合到您的项目内,(像是联合超声波传感器使得舵机能够自动进行扫障)。
若是您运用并非平台的情况,那就去参照第三节相应的代码,仅仅略微调整一下脉宽计算函数,便能够适配超过95%的舵机型号了。