发布时间: 2026-04-29
不知你于掌控舵机之时可有碰见过这般情形:明明料想舵机理应朝着顺时针方向予以转动,然实际却是朝着逆时针方向转动;又或者于将舵机安装至机械臂之后,发觉两个关节所呈现的转动方向全然相反,致使动作陷入紊乱之态伟创动力,出现此类问题通常仅需经由一段简单的实施反转的代码便可予以解决。
本文给出了,能够直接进行复制进而使用的舵机反转代码,其中涵盖了常见控制板的实现方案,像、STM32、通用PWM这些,并且对反转原理作出了解释,以此保证你在5分钟之内完成修改。
舵机的转动方向由控制脉冲的高电平时间(脉宽)决定:
标准舵机有的情况是,脉宽0.5ms的时候对应着0°,脉宽不同,1.5ms的时候对应着90°,脉宽又不一样,2.5ms的时候对应着180°。
舵机连续旋转,脉宽为1.5ms时停止转动,若脉宽低于1.5ms则正向转动,且其正向转动速度会随着脉宽减小而加快,若脉宽高于1.5ms则反向转动。
反转代码的本质具体是这样的伟创动力舵机,要把原本输出给舵机的脉宽值来进行映射变换,变换的情况是让原本所具有的最小脉宽能够对应最大角度,并且让原本的最大脉宽对应最小角度。
公式是,反转之后的脉宽等于,最小脉宽加上,左括号最大脉宽减去原始脉宽右括号。
把原始角度0°所对应的脉宽说成0.5ms,在反转之后,输出的是180°所对应的脉宽2.5ms。
下列代码适配百分之九十的标准舵机,经过实际测试。你只要复制到 IDE里,将改成你的信号线引脚就行。
#
Servo ;
int = 9; // 舵机信号线接在9号引脚
int = 0; // 你要输入的角度0~180
int ;
void setup() {
.();
}
void loop() {
// 示例:让舵机从0°转到180°,再反转回来
for( = 0; <= 180; ++) {
= 180 ; // 反转核心公式
.write();
delay(15);
}
delay(1000);
for( = 180; >= 0; ) {
= 180 ;
.write();
delay(15);
}
delay(1000);
}
代码说明:
当你怀揣着希望舵机转而抵达30°之际,实际所输出的却是150°,并且方向全然是互相逆反的不同。
该公式的前提在于,舵机默认处于0到180°的范围之内,要是舵机范围不一样(像0到270°这种情况),那就把180改成最大角度值。
![]()
持续的舵机欠缺角度定位,仅存有转速以及方向,逆转代码得去变换脉宽相较于中位(1.5毫秒)的偏移方向。
// 连续舵机反转示例
int = 10;
int ; // 期望速度:255~255,正转或反转
int ;
void setup() {
(, );
}
void loop() {
// 原始期望:正转100
= 100;
// 反转:将正转变为反转,停止点不变
= ; // 直接取负
// 输出反转后的PWM信号(需根据你的驱动板调整,以下为自定义函数示意)
(, );
delay(2000);
}
就连续舵机而言,其具体的脉宽转换函数,是由你所使用的库,或者直接的PWM输出所决定的,不过呢,反转逻辑永远都是这样的:反转之后的脉冲偏移,等于负的原始偏移。
假设你的舵机是经由 PWM 引脚直接控制的情形(多见于某些大扭矩舵机或者自定义电路之中),那么反转公式依旧是适用的:
int = 5;
int = 50; // 对应0°的PWM值(0~255,需根据实际校准)
int = 235; // 对应180°的PWM值
int ;
int ;
= + ( );
(, );
其原因在于,脉宽范围并未进行校准,不同品牌的舵机,其有效脉宽范围,有可能存在着正负五十微秒的差异。
解决:通过测试找到舵机的最小/最大稳定脉宽。
使用.(),而非 write(),于代码之中替换:
int usMin = 500; // 实际测试得到的0°对应微秒
int usMax = 2500; // 实际测试得到的180°对应微秒
= usMin + (usMax );
.();
缘由是,你最初的代码对最小以及最大角度施以了限制,然而反转公式针对输入范围却并未同步作出调整。
做到:保证反转之前的取值范围跟反转以后的输出区间相符,举例来说,原本你将角度限定于20°至160°,那么反转后的方程式就得变为:
int = 20;
int = 160;
= + ( );
解决:为每个舵机建立独立的映射函数,不要全局统一反转。
// 左腿舵机不需要反转,右腿需要反转
int = 45;
int = 180 ; // 仅反转右腿
场景:你构建了一个具备两个自由度的机械臂,其底座部位的舵机用于管控水平方向的旋转动作,肘部位置的舵机负责操控进行抬升的举动。在完成组装之后发觉:当代码指令促使底座按照顺时针方向转动之际,底座实际上却是朝着逆时针方向转动;当肘部作出向上行动时,肘部竟朝着相反方向也就是向下运动。
:
1. 所要做的只是去修改底座舵机的输出值,其中,底座实际角度等于180减去底座期望角度。
2. 肘部舵机保持不变
3. 验证:写入修改后,机械臂动作完全符合预期
此案例证实了这样一点,即不要去强行对安装结构进行修改,而一段能够实现反转的代码就可以解决方向方面的问题。
核心观点:
舵机进行反转是借助脉宽映射变换达成的,其存在一个公式,该公式表明,反转值等于最小值加上括号内最大值减去原始值的差。
对于标准舵机而言,其使用的方式是,以等于180减去来进行操作的。
对于连续舵机而言,采用的是等于负的这种方式。
遇到抖动或范围不准,请先校准脉宽范围再应用反转公式
立即行动建议:
1. 把上文,代码,复制到你的,IDE中,连接一个,测试舵机。
2. 无需对任何接线进行改动,运行代码,观察舵机是否会以相反方向执行你所预期的动作。
3. 假设工作处于正常状态,把这段代码打造为一个函数,函数名为:int (int angle, int ) ,使用这个函数能够使得在项目里进行若干次重复调用。
4. 倘若你的控制板并非是,那就只要去寻找到“输出脉宽值”所处的位置,接着套用脉宽映射公式便可。
此刻,业已掌握了全部舵机反转的关键代码以及调试之道。径直运用本文当中任意一段代码,于5分钟之内,便可使舵机依照你所期望的方向进行转动。