发布时间: 2026-05-08
输出周期为20ms(频率是50Hz)、高电平时间在0.5到2.5毫秒之间发生变化,通过这样的方波信号来驱动舵机旋转到指定角度,这就是PWM控制舵机的核心代码。所有型号的标准舵机都遵循这样的脉冲协议:0.5ms对应0°,1.5ms对应90°,2.5ms对应180°。下面将直接给出能够直接使用的代码模板以及参数计算方式。
// 定义舵机参数
# 20000 // 周期20ms = 20000μs
# 500 // 0°对应高电平500μs
# 1500 // 90°对应高电平1500μs
# 2500 // 180°对应高电平2500μs
// 设置舵机角度(0~180°)
void ( angle, , ) {
// 将角度线性映射到脉冲宽度(μs)
= + (angle ( ) / 180);
// 调用硬件平台的PWM占空比设置函数(需替换为实际函数)
s(, );
}
// 使用示例:设置舵机到90°
(90, , );
下面说明,上述代码当中的s(),需要替换成具体开发环境所对应的PWM输出函数伟创动力舵机,比如(),或者定时器比较值设置。核心原则是,要保证PWM周期恒定为20ms,仅仅改变高电平持续时间。
// 定时器时钟 = 1MHz,周期20ms需计数20000
// 自动重装载值ARR = 20000 1
// 比较值CCR = 脉冲宽度(μs) 1 (例如1.5ms > 15001=1499)
void (void) {
// 配置定时器为PWM模式1,周期20ms
= 19999; // 20ms周期
= (时钟频率/1MHz)1; // 预分频使计数频率为1MHz
= 1499; // 初始90°(1.5ms)
}
// 改变角度只需更新CCR值
void ( ) {
= 1; // 更新比较值
}
// 在PWM周期结束中断中更新下一个舵机的比较值
[4]; // 存储4个舵机的脉冲宽度(μs)
void (void) { // 周期中断
idx = 0;
// 当前通道输出当前舵机的脉冲宽度
e(idx, [idx]);
idx = (idx + 1) % 4; // 轮询4个通道
}
![]()
并非所有舵机都是严格的0.52.5ms。实测:
先输出0.5ms脉冲,记录舵机停止位置(可能是0°)。
逐步去增加脉冲宽度,每次增加的幅度是50μs,一直持续这样做,直到舵机转到极限位置,这种极限通常是不会超过2.5ms的。
查找最小脉宽,查找最大脉宽,对代码里的进行修改,对代码里的进行修改。
1. 针对测量信号,借助逻辑分析仪或者示波器去观测PWM引脚,进而确定周期为20000μs,并且高电平时间会依照角度呈现线性变化。
2. 对测试极限进行操作:将s(500)进行写死行为,随即舵机转到一个极限位置;接着把2500μs进行写死,之后舵机转到相反的极限位置。
![]()
3. 逐步进行调试,起始于500微秒,之后每一次增加10微秒,留意舵机是不是能够持续呈平滑状态转动。
// 假设硬件已提供以下函数:
// void ( ); // 初始化PWM频率
// void ( ); // 设置脉冲宽度(μs)
# 50 // 50Hz
# 500
# 2500
void (void) {
(); // 配置PWM频率50Hz
();
}
void ( angle) {
if (angle > 180) angle = 180;
pulse = + ()angle ( ) / 180;
(pulse);
}
int main(void) {
();
while(1) {
(0); // 转到0°
(1000);
(90); // 转到90°
(1000);
(180); // 转到180°
(1000);
}
0;
}
PWM控制舵机代码的关键核心仅有一个方面伟创动力,那就是要生成一种方波,这种方波具有固定的20ms周期,并且其高电平时间能够在0.5至2.5ms的范围内进行调整。在众多代码故障当中,有90%源自于周期不准确这一情况,或者是供电不足这种状况。
立即执行:
1. 按照上文通用模板写出你的第一版代码。
2. 用示波器确认输出波形周期为20ms。
3. 从零点五毫秒起始,每一步都增加二百微秒来测试舵机实际范围,记录下你所使用舵机精准极限脉宽。
4. 把所测得的脉宽代入代码里的以及,这样就能精确地控制从0°到180°的任意角度了。