发布时间: 2026-05-11
你有没有碰到过这般状况:购入了一架舵机,想着借助51单片机促使它转动起来,然而查阅了诸多资料,不是代码运行不起来,就是舵机不停地抖动,甚至压根就不转动?关键缘由在于:舵机所需的是精准的20ms周期PWM信号,而51单片机得正确配置定时器才可生成此信号。 本文径直给出完备的解决办法——硬件接线、定时器初始值计算、C51代码、常见故障排查,保证你依照步骤操作后,舵机能平稳地转动至任意角度。
舵机的内部,存在着一个直流电机,还有减速齿轮组以及角度反馈电路。你并不需要去了解全部的细节,仅仅需要知道:
有那么一种信号,它被称作控制的信号,这个信号呢,是带有特定周期的,其周期时长为20毫秒,而20毫秒所对应的频率是50赫兹,它还是一种PWM信号,也就是脉冲宽度调制信号。
在以最常见的从0°至180°的舵机作为示例来看时,脉冲宽度跟角度之间存在着的对应关系:
0.5ms 脉冲 → 0度
1.0ms 脉冲 → 45度
1.5ms 脉冲 → 90度(中点)
2.0ms 脉冲 → 135度
2.5ms 脉冲 → 180度
存在这样的情况,不同品牌的舵机,或者不同型号的舵机,其脉宽范围有可能存在微小的差异,举例来说,差异范围在于0.55ms至2.45ms,然而,上述所提到的标准,是适用于在市面上占比90%的微型舵机的,像SG90、MG995这类的舵机便是如此。要是有疑问产生,那就去查阅一下你手上舵机的数据手册。
你需要准备:
51单片机开发板(最小系统即可,如)
一个标准舵机(推荐先用小扭矩舵机调试)
有着5V直流电的电源,舵机电源得单独于单片机逻辑电源,除非舵机小巧且电流比200mA小,这样才行。
杜邦线若干
接线表:
关键要点:
![]()
要实现共地,舵机的地线,需与单片机的地线相连,且外接电源的地线也得与之全部连接在一起。
舵机开始启动的那一瞬间,电流是比较大的,能够达到1A以上,所以要用单独的能够提供稳定电压的电源或者电池来供电。要是使用通过USB的方式进行供电,那么有可能会致使单片机出现复位的情况。
常出现的案例是,好多刚开始学习的人直接拿开发板上的5V引脚为舵机供应电力,随后一旦运行程序,舵机就会出现抖动或者单片机发生死机情况。正确的做法是,由开发板给出信号,通过外部电源为舵机供电。
51单片机不存在硬件PWM模块,所以我们得借助定时中断来模拟PWM波形,其思路具体为,利用一个定时器生成周期为20ms的中断,然后在中断服务函数里依据目标角度去设定信号引脚的高低电平。
第一步:计算定时器初值
假定运用12MHz晶振,定时器0处于模式1(即16位定时器)工作状态。若要生成20ms中断,那就需要计数20,000个机器周期。每个机器周期等于1µs(在12MHz的情况下)于是:
计数初值 = 65536 20000 = 45536
将十六进制表示为:,这意味着,TH0等于是0xB1,并且TL0等于0xE0。
当进行实际编程操作的时候,我们一般会把20ms划分成更小的时间片就像是0.1ms那样,随后借助计数器累计相加而生成不一样宽度的脉冲。有更简便并且常用的办法是,让定时器每隔0.1ms就产生一次中断,当中断达到200次的时候便达成了20ms。在中断的过程当中去判断当下是第几次,进而决定引脚的状态。
第二步:完整C51代码
#
sbit servo = P1^0; // 信号引脚
char = 0; // 0.1ms计数,0~199共200个
char = 15; // 脉宽比较值(单位0.1ms),对应1.5ms > 90度
// 延时函数(用于演示角度变化)
void ( int ms)
{
int i,j;
for(i=0;i 0度
(1000);
= 15; // 1.5ms > 90度
(1000);
= 25; // 2.5ms > 180度
(1000);
}
}
void (void) 1
{
// 重新赋初值,保证0.1ms周期
TH0 = 0xFF;
TL0 = 0x9C;
++;
if( < )
{
servo = 1; // 保持高电平
}
else
{
servo = 0; // 低电平
}
if( >= 200) // 20ms周期结束
{
= 0;
}
}
代码解释:
控制变量来把控高电平持续的时长,其范围处于5至25之间,这一范围对应的是0.5毫秒至2.5毫秒。每增加或者减少1,脉宽就会产生0.1毫秒的变化,角度变化大约为9度(180度除以20步)。
没隔0.1ms就触发一次中断,倘若计数比小,那么输出高电平,不然就输出低电平,等一个周期(200次中断)结束之后重置计数。
![]()
在主循环里,演示了角度渐变的典型惯用方式伟创动力舵机,你能够直接去修改这个值,以此来设定任意的角度。
,51单片机运用定时器中断去模拟PWM已然足够精准,其误差处于±1μs范围以内,这完全能够满足舵机所需,舵机通常对精度的要求是±10μs。,要是你有同时驱动多个舵机的需求,那么可以采用“分时法”,或者使用带有硬件PWM的增强型51,典型的如STC15/STC8系列,不过其基本原理和本教程是完全一样的。
核心观点是,用51单片机去驱动舵机,唯一正确的路径在于,要借助定时器中断来生成周期为20ms的PWM信号,脉宽需在0.5至2.5ms之间伟创动力,一定要做到共地,而且得是独立供电。
行动建议:
1. 按照本文接线图连接电路(特别注意电源共地和独立供电)。
2. 在Keil里头将完整代码进行复制,接着实施编译,从而生成HEX文件,随后把该文件下载到单片机那儿。
3. 伊始观察舵机有没有呈周期性摆动,从0角度摆动至90角度,再摆动至180角度,若情况正常,那就表明你所具备的软件以及硬件全然正确无误。
4. ,对值予以修改运用,实际测试你所需要的角度所对应的数值,举例来说,运用维持某个值,并借助眼睛或者角度尺进行验证。
5. 保存下你实测的脉宽角度对照表,后续项目直接调用。
无论使用何种品牌的 51 单片机或舵机,只要你严格遵循上述步骤,就能在 30 分钟内成功驱动。若遇到本文未列出的异常,要检查你的示波器或逻辑分析仪波形,确保周期为 20ms,脉宽在有效范围内。