发布时间: 2026-05-01
不论您此刻是在进行机械臂的制作,还是在开展机器人相关工作,亦或是从事舵机控制方面的事宜,借由PWM(脉冲宽度调制)信号去操控舵机角度,这都是极为常见的一种需求。在本文当中,给出了一套能够直接着手使用的完整方案,其中涵盖硬件接线、核心代码以及角度换算公式,以此保证您在30分钟之内能够完成首个舵机控制程序。
有一个在舵机内部的比较器,它为于将输入PWM信号里高电平持续的那个时间长度也就是脉宽、与内部电位器反馈回来的角度数值去做比较。标准模拟舵机的控制周期长度是20ms、也就是50Hz的那个频率,当中。
0.5ms脉宽 → 0度(极限左端)
1.5ms脉宽 → 90度(中位点)
2.5ms脉宽 → 180度(极限右端)
> 仅有这三个核心数据即可推出任意角度对应的脉宽:
目标脉宽(毫秒这个单位)等于,零点五加上,目标角度除以一百八十之后,再乘以二点零。
重点警示:当多个舵机一同进行工作之际,要去运用外置的5V/2A之上的稳压电源 ,不可以从控制器主板那里获取电力 ,不然的话电流不够会致使复位现象产生或者舵机出现抖动情况。
以下程序会使舵机从0度开始,以缓慢的状态摆动至180度,之后再返回来,然后循环地执行这个操作。任何能够支持PWM的控制器,像STM32、ESP32、51单片机等等,都可以按照相同的逻辑进行移植。
#
// 定义PWM引脚号(以常见开发板的9号引脚为例)
const int = 9;
// 角度转脉宽的函数(单位:微秒)
int (int angle) {
// 限制角度范围0~180
angle = (angle, 0, 180);
// 映射:0°→500μs, 180°→2500μs
map(angle, 0, 180, 500, 2500);
}
void setup() {
(, );
}
void loop() {
// 从0度逐渐增加到180度
for (int angle = 0; angle <= 180; angle++) {
int = (angle);
// 产生一个持续微秒的高电平,其余时间为低电平
(, HIGH);
();
(, LOW);
// 剩余周期时间 = 20ms 脉宽,确保周期稳定20ms
(20000 );
}
// 从180度逐渐减少到0度
for (int angle = 180; angle >= 0; angle) {
int = (angle);
(, HIGH);
();
(, LOW);
(20000 );
}
}
![]()
移植到其他控制器的注意事项:
要保证人尽皆知的绝大多数标准舵机的工作频率得以确保,需使PWM信号频率成为50Hz,也就是周期为20ms。
在运用硬件PWM之际,直接去进行占空比的设置,其计算方式为,占空比等于脉宽以毫秒为单位的值除以20毫秒。举例来说,90°所对应的情况是,1.5毫秒除以20毫秒,结果等于7.5%占空比。
原因:PWM信号不稳定或电源纹波大。
解决:
在舵机电源引脚两侧,并联一个容量处于100μF至470μF范围的电解电容,以此滤除电源纹波。
信号线与电源线分开走线,避免大电流串扰。
采用硬件PWM输出,来替换软件模拟的(),因为后者容易受到中断的干扰。
理由是,脉宽范围没有进行校准,存在这样的情况,个别舵机处在0°的时候和550μs相对应,而当处于180°的时候,和2450μs相对应。
进行解决,编写一个开展测试作业的程序,分别去发出500μs长度的脉宽,还要发出1500μs长度的脉宽,并且发出2500μs长度的脉宽,进而去观察实际呈现的角度,随后再去修改map(angle,0,180,校准最小脉宽,校准最大脉宽)。
这是因为,电源电压处于不足的状态,或者信号线电平出现不匹配的情况伟创动力舵机,像是采用3.3V控制器去驱动5V舵机这样的情形。
![]()
要解决此问题,可采用电平转换模块(5V至3.3V双向的那种),或者去确认舵机是否支持3.3V逻辑(多数现代舵机是支持的)。还要检查电源负载能力:单个9g舵机需要0.5A瞬间电流,大扭矩舵机需要2A以上。
如果您所运用的是那种360°能够进行连续旋转操作的舵机,此种舵机常常被应用于轮式机器人上面,那么PWM脉宽所表明的意味是不一样的:
1.5ms:停止转动
1.5ms ~ 2.5ms:正向速度随脉宽增大而增加
0.5ms ~ 1.5ms:反向速度随脉宽减小而增加
在这个时候,程序已经不再对角度进行控制了伟创动力,而是会去控制转速。只要把上面所提及的代码当中的角度映射改成速度映射就行。
主要核心观点为:PWM去控制舵机,其本质是这样的原理,即依据目标角度,通过线性方式计算得出处于0.5至2.5ms之间的脉宽,而且要以20ms作为周期持续不断地输出。任何一种偏离了这一原理的方法,都会造成控制失败。
立即执行的三个步骤:
1. 要是没有仪器,那就得利用代码先去对中位1.5ms脉宽展开 测试,此时舵机指向90°,以此来确认您的PWM输出脉宽是不是准确呢,不过这是采用示波器或者逻辑分析仪才行的。
2. 进行独立供电,对电源电压于舵机标称范围之内(通常是4.8V至6.0V)予以验证。
3. 在您的项目里,把本文所具有的角度 脉宽换算公式直接作复制的操作,经行替换硬件引脚之后进而能够运行。
做出以上操作完毕之后,您已然掌握了全部标准PWM舵机的控制办法。要是碰到本文没有涵盖的特殊情形(像是总线舵机、巨无霸舵机这种),那其底层的PWM控制逻辑依旧是依照本指南的。