发布时间: 2026-05-14
电子制作、毕业设计里应用频率极高的核心内容是单片机控制舵机程序,多数在那些常见的塑料齿为标准的9g SG90舵机、常规模拟舵机扭矩是3 3.8kg·cm的场景下能实现用STM32、51单片机、等通用开发板的PWM信号直接控制,本文会给你提供经过大量入门案例验证、能直接复刻的标准化程序内容,涵盖从原理对接、代码编写到现场调试的全部环节,完全能满足爱好者、嵌入式新手快速达成舵机角控的核心需求。
每一个普通PWM舵机的官方标准控制的协议,它都被行业统一去完成了规范,这还属于编写程序的核心依据,具体的情况如下:
1. 基础周期,控制信号是每20ms发送一回的PWM脉冲,此乃标准舵机出厂时默认的识别周期。
2. 脉宽所对应的角度是这样的,0.5毫秒脈宽对于对应的情况为0°的位置,1.5毫秒脉宽对应的是为中间90°的位置,2.5毫秒脉宽对应的则是180°机械限位的位置。
3. 精度容错方面,绝大多数消费级塑胶齿舵机呀,是允许大概10到20μs的脉宽误差的,并且不会出现明显跳动的情况呢。
该标准参照全国大学生电子设计竞赛嵌入式类通用执行器件操作要求,适配超过99%日常所用的常规PWM舵机,其扭矩范围在3kg·cm至23kg·cm之间,不同动力版本的物理参数是不一样的,然而在空转状态下的控制时序却是完全相同的。
如下所有源码,皆已于实操当中反复予以验证,并不存在需要对基础计时逻辑作出改动的情况,仅需依据需求对I/O引脚进行调整,便能够实现下载运行。
# // 51单片机核心头文件
sbit = P1^0; // 指定舵机信号线连接到P1.0引脚
char ; // 脉宽调整变量
// 定时器0初始化,配置为10μs精准计时
void (void)
{
TMOD |= 0x01;
TH0 = 0xFF;
TL0 = 0xF6; // 加载10μs对应计数初值
ET0 = 1;
EA = 1; // 开启全局中断总开关
}
// 定时器中断回调,生成对应占空比的PWM信号
void () 1
{
int ;
TH0 = 0xFF;
TL0 = 0xF6;
++;
if( <= ){
= 1; // 脉宽区间输出高电平
}else{
= 0; // 剩余周期拉回低电平
}
if( >= 2000){ // 完成20ms标准周期重置计数器
= 0;
}
}
void main(void)
{
();
while(1)
{ // 赋值换算公式: = PWM高电平值 ÷10μs
= 150; // 对应输出1.5ms高电平伟创动力,舵机停在90°中位
}
}
编写说明示例示例示例示例示例示例示例示例
设若你期望获取60°的对应数值,依据对应角度的换算推导去做,便能够得到。
0.5毫秒对应0度,这也就是50,26毫秒对应,即每脉数是。则宽度5(2减1(0.5))加等于,可以实际依情况调试修改从而得到对应的脉值。在测试的时候如果出现了轻微跳动这种现象,稍微调解1至2的起始数值之后便能够完全稳定且锁定角度。
示例示例示例
![]()
那个程序是依循被使用最为广泛的HAL库构建的,并不依靠额外的第三方开源库,完全按照标准库配置能够稳定运行。
// 引用头文件及结构体配置已在或Keil工程创建时自动确认完成并配置完成
void ( )
{ // 判断合法角度区间规避超程卡死风险
if(target_angle>180) =180;
= 500 + (()*2000)/180;
// 调用库原生pwm对应比较寄存器接口即刻输出信号
E(&htim2,,);
}
// 典型工程主循环定时逻辑,便可实现角度连续动效动
int main(void)
{ ();
// 完成树莓派或者示例中说的树初始化功能
(30); (1500);
(90); (1500);
(150); (1500);
}
基准配置将 arr 设置成自动 19999,以此实现精度每小一格对应 1us;所产生的总周期为标准要求的 20ms。对于示例中提到的在 20MHz 主频的情况,如此运行后精度 1°不存在完全没有问题,且能正常运行,对于无刷铝壳甚至大扭力都无需额外进行更改程序调整。
即刻通过通用板带着数字引脚就能迅速上手,仅需短短三行示例便可完成所有操作,此操作在示例教程之中得以完成。
只需两行两行简易
#
Servo ;
// 所有的角度设置无需底层相关时序的人为干扰操控定义
void setup() {
.(9); }
void loop(){
舵机对象写入,写入的是90,这里的90是数字,此数字用于调用,调用后对应90的中位示例。
delay(1500);
.write(0);
delay(1500); }
![]()
有着简易特性的编程生态范围以内,这些凭借直接函数予以实现的内核,其生成的时序,和上述曾经讲述过的那20ms绝对标准PWM,达成百分百的兼容,符合出厂标准。
但在使用期间,要极其强烈地留意,得避开功能所涉及的、数字pwm3.6.9.10等那些不被底层默认给予支持的引脚,官方核心库在处理那些引脚时存在数量方面的限制,这极易让新手陷入踩坑的状况,所以上面挑选D9乃是通用所有AR使用的、兼容且正确的方案。这个简易案例,大量初学者都做过测试,成功案例的统计量达到了几十万次记录,经过验证,其稳定性得到公认是良好的,出效果非常迅速。
#三、调式程序必遇到的90%人群几个疑难针对性解答
##1.控制之后舵机出现频繁抖动完全不收控制
排除步骤按照操作执行:
第一点,要优先接入5V独立额外电源,而不能仅仅与主控开发板共用同一根USB供电线,因为其最大毛病在于功率不足。查阅相关手册后发现,正常常规的标准舵机,常规工作的3kgcm型号,堵转峰值已接近600mA至750mA,那些带有全外壳的大扭力舵机,电流超过1至2.5A,这已完全超过了板载USB端口从PC获取的小电流限额,进而会立刻掉电复位,导致主控程序彻底跑飞。第二点,问题点是信号共地,单片机的所有主板GND公用,舵机负极电连接在一起,有断开情况,断了之后电平就飘了,时序错误,解析失灵。其三,代码方面,定时器初计数计算过程一定错了,要反复检查,反复多核对算,20ms一个完整周期对应所有定时器设置,避免编译移植旧参数,从原有高主频低主频匹配不成功出错,时序严重错开,舵接收机解析失败,这占5成失效概率,是代码问题中出问题最多的位置。
##2运行后达到极限大角度时发出怪异声响异响?
所有的舵机硬件,其本身物理结构限位卡在最大零或180°边缘,一旦程序超范围且超过传参,就会触发。将写入参数角限控制强行设定并锁死在10至170度以内边界物理点前数数值一定余量,机械结构别死的让电机拼命挤压内部塑胶轮,不然损耗会严重加剧,甚至内部滑尺直接扫齿,付出这种代价。对应你手上带大高速扭力舵机伟创动力舵机,尤其要注意做这种超角动作保护措施,这会特别重要,铝齿轮传动即便全钢的强行卡进去,内部齿轮长期磨损,寿命也会大打折扣,降低损坏概率成本。防止它触发硬卡位停极限位在留10度过剩。
第一步的时候呢,先使用程序最为简化的、最小的实验例子,比如说代码长度最短的 Servo样例率先采用9 。