文章目录前言一、PWM舵机 核心规格参数 如何控制SG90舵机 快速上手示例 Arduino 注意事项二、使用步骤1. 连接图1.1 添加舵机 关键字 SERVO1.2 添加示波器1.3 添加单片机 记得根据实际情况修改单片机的时钟2. 51测试代码初级版本3.1 测试 查看周期 查看高电平3.增加按键 控制舵机的加减三、手把手视频总结前言提示这里可以添加本文要记录的大概内容学习了51单片机可以控制一盏灯亮灭了能做哪些实操呢比赛又需要用到舵机那么就来用几条指令搞定舵机的控制吧因为项目需要提示以下是本篇文章正文内容下面案例可供参考一、PWM舵机SG90 舵机SG90是一款非常受欢迎的微型舵机常用于机器人、小型机械臂和航模等项目。它的特点是重量轻约9克、扭矩足够且控制简单。 核心规格参数参数项目具体规格工作电压4.8V - 6.0V 通常使用5V供电扭矩1.6 kg·cm 4.8V转速0.12 - 0.14秒/60度 4.8V转动角度最大180度 有0-180°和360°两种版本控制方式PWM脉冲宽度调制尺寸约 23 x 12.2 x 29 mm重量约 9克 如何控制SG90舵机SG90通过接收周期为20ms的PWM信号来控制通过改变高电平的持续时间脉宽就可以精确控制舵机转动的角度。核心原理一个PWM周期为20ms其中高电平的时长在0.5ms到2.5ms之间变化对应舵机输出轴从0°转动到180°。角度与脉宽对照0.5 ms高电平 → 0°1.0 ms高电平 → 45°1.5 ms高电平 → 90°2.0 ms高电平 → 135°2.5 ms高电平 → 180°接线方式棕色线GND地线连接开发板的GND。红色线VCC电源线连接开发板的5V引脚需确保供电电流充足。黄色/橙色线Signal信号线连接支持PWM输出的数字引脚。 快速上手示例 Arduino在Arduino上驱动SG90非常简单可以直接使用内置的Servo库。#includeServo.hServo myservo;// 创建一个舵机对象voidsetup(){myservo.attach(9);// 将舵机的信号线连接到Arduino的9号引脚}voidloop(){myservo.write(0);// 让舵机转到0度delay(1000);// 等待1秒myservo.write(90);// 让舵机转到90度delay(1000);// 等待1秒myservo.write(180);// 让舵机转到180度delay(1000);// 等待1秒} 注意事项确认舵机类型购买时请务必分清是0-180°还是360°的版本。360°的舵机无法控制具体的角度只能控制旋转的方向和速度。供电问题当驱动多个舵机或舵机负载较大时不要仅用开发板的USB口供电可能会因电流不足导致开发板重启或舵机无力。建议使用外部5V电源为舵机供电并将电源地与开发板GND共地。PWM频率SG90舵机的PWM信号频率固定为50Hz周期20ms不要随意更改。反应速度SG90的转速不是很快控制程序里两次角度指令间请加入适当延时如15-20ms给舵机留出反应和转动的时间。SG90是入门舵机控制的理想选择只要掌握PWM信号的脉宽控制方法就能轻松驱动它。二、使用步骤1. 连接图1.1 添加舵机 关键字 SERVO1.2 添加示波器1.3 添加单片机 记得根据实际情况修改单片机的时钟为了跟板子的时钟11.0592MHz一致先在修改仿真芯片的时钟2. 51测试代码初级版本代码如下示例#includereg52.h#includeintrins.h// 包含 _nop_() 函数定义//定义脉宽unsignedintpulse_width35;// --- 硬件引脚定义 ---sbit SERVO_PINP1^0;// 舵机信号线// --- 延时函数 (基于 _nop_) ---// 假设晶振 12MHz, 1个机器周期 1usvoidDelay_us(unsignedintus){while(us--){_nop_();}}// --- 主函数 ---voidmain(){while(1){// 1. 高电平阶段 (0.5ms ~ 2.5ms)SERVO_PIN1;Delay_us(pulse_width);// 2. 低电平阶段 (补足到 20ms)SERVO_PIN0;// 防止计算溢出或逻辑错误确保延时为正数Delay_us(1535-pulse_width);}}3.1 测试 查看周期 查看高电平先测试出高电平的时间3.增加按键 控制舵机的加减代码如下示例#includereg52.h#includeintrins.h// 包含 _nop_() 函数定义// --- 硬件引脚定义 ---sbit SERVO_PINP1^0;// 舵机信号线sbit KEY_UPP3^2;// 角度增加按键sbit KEY_DOWNP3^3;// 角度减少按键sbit KEY_SWITCHP3^0;// 舵机开关按键 (新增)// --- 全局变量 ---unsignedchartarget_angle90;// 目标角度: 0 ~ 180unsignedintpulse_width35;// 脉宽: 500us ~ 2500usbit servo_enabled1;// 舵机开关标志: 1开启, 0关闭// --- 延时函数 (基于 _nop_) ---// 假设晶振 12MHz, 1个机器周期 1usvoidDelay_us(unsignedintus){while(us--){_nop_();}}// --- 按键扫描函数 ---voidKey_Scan(){// 1. 扫描角度增加键if(KEY_UP0){Delay_us(1000);// 去抖if(KEY_UP0){if(servo_enabled){// 只有在开启状态下才能调节角度if(target_angle160){target_angle5;// 计算脉宽: 500 角度 * 11.11pulse_width35target_angle;}}while(KEY_UP0);// 等待释放}}// 2. 扫描角度减少键if(KEY_DOWN0){Delay_us(1000);if(KEY_DOWN0){if(servo_enabled){if(target_angle0){target_angle-5;// 1535pulse_width35target_angle;}}while(KEY_DOWN0);}}// 3. 扫描开关按键 (新增)if(KEY_SWITCH0){Delay_us(1000);if(KEY_SWITCH0){servo_enabled!servo_enabled;// 状态取反// 如果关闭舵机立即拉低引脚停止输出脉冲if(!servo_enabled){SERVO_PIN0;}while(KEY_SWITCH0);// 等待释放}}}// --- PWM 生成函数 ---voidServo_PWM_Loop(){if(servo_enabled){// --- 开启状态发送标准 20ms PWM ---// 1. 高电平阶段 (0.5ms ~ 2.5ms)SERVO_PIN1;Delay_us(pulse_width);// 2. 低电平阶段 (补足到 20ms)SERVO_PIN0;// 防止计算溢出或逻辑错误确保延时为正数if(pulse_width1535){Delay_us(1535-pulse_width);}else{Delay_us(0);}}else{// --- 关闭状态保持低电平 ---// 舵机在没有脉冲信号时通常会进入休眠/自由模式// 也可以在这里添加一个极短的无效脉冲以防某些特殊舵机误判但通常拉低即可SERVO_PIN0;Delay_us(1535);// 简单延时维持主循环节奏避免按键扫描太快}}// --- 主函数 ---voidmain(){// 初始化SERVO_PIN0;target_angle0;pulse_width50;servo_enabled1;// 默认开启while(1){// 1. 扫描所有按键Key_Scan();// 2. 执行PWM输出逻辑Servo_PWM_Loop();// 1. 高电平阶段 (0.5ms ~ 2.5ms)// SERVO_PIN 1;// Delay_us(pulse_width);//// // 2. 低电平阶段 (补足到 20ms)// SERVO_PIN 0;// // 防止计算溢出或逻辑错误确保延时为正数//// Delay_us(1535 - pulse_width);}}三、手把手视频20260327_193408舵机原理实操讲解120260327_200209舵机原理实操讲解2总结学习使人快乐音乐使人愉悦日积月累使人充实和自信