首页 > 行业资讯 >减速电机
TECHNICAL SUPPORT

51单片机控制4个舵机程序(C语言代码+接线图)

发布时间: 2026-04-18

本文给出了让51单片机同时操控4个舵机的全部解决办法,涵盖了能够直接进行烧录的C语言编程代码、标准的硬件连接方式以及调试的关键要点。不管您是打造机械臂、四足机器人还是多自由度云台,下面这些内容都能够助力您迅速达成4路舵机的单独角度控制。

01硬件连接(严格执行)

控制4个舵机需要以下连接:

舵机引脚 连接对象 关键要求
红色(VCC) 外部5V电源正极 4个舵机总电流可能达23A,严禁从单片机开发板取电
棕色/黑色(GND) 外部电源地 + 单片机GND 共地(所有地线连接在一起)
橙色/黄色(信号) 单片机4个独立IO口 推荐P1.0、P1.1、P1.2、P1.3

案例方面包含常见错误:众多刚开始学习的人直接把舵机红色的线连接到单片机的5V引脚那里,进而致使单片机复位或者被烧毁。正确的做法是这样的:外部5V/2A以上的电源正极去连接舵机的红线,负极同时连接舵机的地线以及单片机的GND。

02控制原理(理解才能调试)

标准舵机采用PWM(脉宽调制)信号控制,参数固定:

周期:20ms(50Hz)

高电平时间:0.5ms~2.5ms,对应0°~180°

0.5ms → 0°

1.5ms → 90°(中点)

2.5ms → 180°

要有4路相互独立的PWM信号才能够对4个舵机加以控制,51单片机硬件并不支持多路硬件PWM,所以运用定时器中断加上软件比较的方式,设定一个0.1ms的定时器中断,于中断函数里借助计数器累加到200次也就是20ms,每个舵机单独判定是否输出高电平。

03完整程序代码(可直接烧录)

单片机程序控制舵机实验报告_单片机程序控制舵机原理_51单片机控制4个舵机程序

接着来瞧,这段代码呢,它是依托于51单片机,此单片机配备了12MHz的晶振,然后呢,借助定时器0中断,进而去生成4路PWM信号焉。

# 
// 定义4个舵机信号引脚
sbit  = P1^0;
sbit  = P1^1;
sbit  = P1^2;
sbit  = P1^3;
// 存储每个舵机的高电平时间(单位:0.1ms,范围5~25)
 char  = 15;  // 默认90度
 char  = 15;
 char  = 15;
 char  = 15;
// 中断计数器
 char count = 0;
// 定时器0初始化(模式2,8位自动重装,每0.1ms中断)
void (void) {
    TMOD &= 0xF0;      // 清零T0模式位
    TMOD |= 0x02;      // 模式2,8位自动重装
    TH0 = 156;         // 12MHz晶振,0.1ms初值:256100=156
    TL0 = 156;
    ET0 = 1;           // 使能定时器0中断
    EA = 1;            // 开总中断
    TR0 = 1;           // 启动定时器
}
// 定时器0中断服务程序
void (void)  1 {
    count++;
    if(count >= 200) {   // 20ms周期结束
        count = 0;
    }
    // 控制舵机1
    if(count < )  = 1;
    else  = 0;
    // 控制舵机2
    if(count < )  = 1;
    else  = 0;
    // 控制舵机3
    if(count < )  = 1;
    else  = 0;
    // 控制舵机4
    if(count < )  = 1;
    else  = 0;
}
// 角度转换函数(0~180度 > 5~25)
 char ( char angle) {
    if(angle > 180) angle = 180;
    // 映射:0°→5,180°→25伟创动力,线性关系
     5 + ( char)(( int)angle * 20 / 180);
}
// 主函数
void main(void) {
    ();     // 初始化定时器
    // 设置四个舵机不同角度示例
     = (0);    // 舵机1转到0度
     = (45);   // 舵机2转到45度
     = (90);   // 舵机3转到90度
     = (135);  // 舵机4转到135度
    while(1) {
        // 主循环可添加其他任务,如串口接收角度指令
        // 示例:每隔2秒改变舵机3角度
        // 实际使用时请添加延时函数或使用定时器标志
    }
}

04程序说明与修改指南

4.1 修改引脚

若是需要去更换IO口,那么仅仅只要去修改开头起始的sbit定义就行,举例比如说是将舵机1给改成P2.0:

sbit  = P2^0;

4.2 改变角度

对于变量,在主函数或者任意别的地方直接去做修改,其取值范围是5至25 ,推荐运用()函数来进行角度转换。

 = (120);  // 转到120度

4.3 晶振频率调整

要是您所使用的单片机采用的是11.晶振,那就得对定时器初值进行重新计算

0.机器周期数在1ms时所需的数量情况是,用0.1ms除以1除以11.的结果,其约等于110.6,最终取整为111。

模式2初值:256 111 = 145

修改代码中TH0=145; TL0=145;

4.4 控制不同型号舵机

单片机程序控制舵机实验报告_51单片机控制4个舵机程序_单片机程序控制舵机原理

180度舵机:使用上述代码,范围5~25

360度连续旋转的舵机,其处于高电平1.5ms(也就是15)时会停止转动,当电平小于1.5ms时舵机前往正向转动,而当电平大于1.5ms时舵机则朝着反向转动,程序里的逻辑保持不变,只是把角度的含义进行修改就行。

05常见问题及

现象 原因 解决方法
舵机不转,发热严重 电源电流不足或电压过低 更换5V/3A以上电源,舵机红线直接接电源
舵机抖动,位置不稳 未共地或中断频率不精准 将舵机地线与单片机GND连接;检查晶振初值
只有一个舵机工作 IO口驱动能力不足或程序引脚定义错误 检查sbit引脚号;可在信号线加10k上拉电阻
角度范围不是0180度 舵机自身机械限位不同 用示波器测量脉宽,调整中的5和25边界值
程序烧录后无反应 单片机未复位或晶振未起振 检查复位电路;确认烧录配置正确

事例呈现:有一位爱好者着手制作四自由度机械手,当四个舵机共同进行动作之际,出现了间歇性复位的状况。经过一番仔细排查,察觉到他运用的是USB供电方式,其最大电流为500mA,然而四个MG995舵机瞬间所需电流超过了2A。随后改用5V/5A开关电源独立供电,至此问题得以完全解决。

06核心要点

与此同时控制4个舵机的标准办法:运用一个定时器去产生0.1ms基准中断,借助计数器来构建20ms周期,于每个周期当中独立比较4个通道的高电平时间,进而达成多路PWM输出。该方法不会占用额外定时器资源,并且角度响应延迟低于1ms,完全能够满足绝大多数应用场景。

行动建议

1. 按照本文“硬件连接”表格正确接线,优先保证外部供电和共地

2. 把完整的代码复制进Keil工程里头,按照实际的晶振频率来对定时器的初值作出修改

3. 先进行烧录,以此来测试单个舵机伟创动力舵机,此过程中修改一个值,进而验证PWM信号于正常状态

4. 逐步增加4个舵机,观察是否相互干扰

5. 若存在动态控制需求,像是串口指令这种情况,于while(1)循环里增添接收代码,径直对变量予以更新便可。

遵循上述步骤去操作,您能够于半小时时间之内达成51单片机对4个舵机的稳定控制。要是碰到任何异常状况,那就请再次核查第五节的常见问题对照表。

为所有产品提供动力单元

联系伟创动力产品专家,为你的产品推荐合适的驱动系统所需部件。

发送邮件
在线留言
WhatsApp
+86 0769 8399 3238
 
kpowerMap