ESP32 控制舵机随机旋转
作者:追风剑情 发布于:2026-5-25 16:05 分类:物联网
PWM 的全称是 Pulse Width Modulation,中文翻译为脉冲宽度调制。
原理:舵机是通过控制占空比(duty)来控制旋转角度。
SG90 舵机需要的脉冲宽度范围是 0.5ms 到 2.5ms,这也是绝大多数标准舵机的通用规格。
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "driver/ledc.h"
#include "esp_timer.h"
#include <stdlib.h>
#include <time.h>
// 舵机配置
#define SERVO_GPIO GPIO_NUM_5 // 信号线接GPIO5
#define SERVO_MIN_PULSE 500 // 最小脉冲宽度 (0度)
#define SERVO_MAX_PULSE 2500 // 最大脉冲宽度 (180度)
#define SERVO_FREQ_HZ 50 // 舵机标准频率 50Hz (周期20ms)
static const char *TAG = "SERVO";
// 初始化舵机 (使用LEDC)
void servo_init(void)
{
// LEDC定时器配置
ledc_timer_config_t timer_conf = {
// 低速模式
.speed_mode = LEDC_LOW_SPEED_MODE,
// 使用0号定时器
.timer_num = LEDC_TIMER_0,
// 14位分辨率 (0-16383)
.duty_resolution = LEDC_TIMER_14_BIT,
// 设置 PWM 的频率
.freq_hz = SERVO_FREQ_HZ,
// 自动选择合适的时钟源
.clk_cfg = LEDC_AUTO_CLK
};
ledc_timer_config(&timer_conf);
// LEDC通道配置
ledc_channel_config_t channel_conf = {
// 信号GPIO引脚
.gpio_num = SERVO_GPIO,
// 低速模式
.speed_mode = LEDC_LOW_SPEED_MODE,
// 使用0号通道
.channel = LEDC_CHANNEL_0,
// 禁用中断
.intr_type = LEDC_INTR_DISABLE,
// 关联0号定时器
.timer_sel = LEDC_TIMER_0,
// 一开始时输出低电平(0V)
.duty = 0,
// 从周期开始时输出高电平
.hpoint = 0
};
ledc_channel_config(&channel_conf);
ESP_LOGI(TAG, "舵机初始化完成, GPIO: %d", SERVO_GPIO);
}
// 将角度转换为占空比值
// 0度 -> 0.5ms 高电平, 180度 -> 2.5ms 高电平
// 公式: duty = (脉冲宽度_us / 周期_us) * 最大占空比值
int angle_to_duty(int angle)
{
// 限制角度范围 0-180
if (angle < 0) angle = 0;
if (angle > 180) angle = 180;
// 计算对应脉冲宽度 (微秒)
// 0度: 500us, 180度: 2500us
int pulse_us = SERVO_MIN_PULSE + (angle * (SERVO_MAX_PULSE - SERVO_MIN_PULSE) / 180);
// 周期 = 1000000us / 50Hz = 20000us
// 占空比 = 脉冲宽度 / 周期
// 转换成14位分辨率值: 分辨率值 = 占空比 * 最大分辨率(16383)
int duty = (pulse_us * 16383) / 20000;
return duty;
}
// 设置舵机角度
void servo_set_angle(int angle)
{
int duty = angle_to_duty(angle);
ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, duty);
ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0);
ESP_LOGI(TAG, "舵机转到: %d度", angle);
}
void app_main(void)
{
// 初始化随机数种子
srand(time(NULL));
// 初始化舵机
servo_init();
// 让舵机先转到90度 (中间位置)
servo_set_angle(90);
vTaskDelay(1000 / portTICK_PERIOD_MS);
ESP_LOGI(TAG, "开始随机旋转测试...");
while (1) {
// 生成 0-180 之间的随机角度
int random_angle = rand() % 181; // 0到180
// 控制舵机转到随机角度
servo_set_angle(random_angle);
// 等待1秒
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
标签: IoT
日历
最新文章
随机文章
热门文章
分类
存档
- 2026年5月(20)
- 2026年4月(7)
- 2026年3月(15)
- 2026年2月(3)
- 2026年1月(6)
- 2025年12月(1)
- 2025年11月(1)
- 2025年9月(3)
- 2025年7月(4)
- 2025年6月(5)
- 2025年5月(1)
- 2025年4月(5)
- 2025年3月(4)
- 2025年2月(3)
- 2025年1月(1)
- 2024年12月(5)
- 2024年11月(5)
- 2024年10月(5)
- 2024年9月(3)
- 2024年8月(3)
- 2024年7月(11)
- 2024年6月(3)
- 2024年5月(9)
- 2024年4月(10)
- 2024年3月(11)
- 2024年2月(24)
- 2024年1月(12)
- 2023年12月(3)
- 2023年11月(9)
- 2023年10月(7)
- 2023年9月(2)
- 2023年8月(7)
- 2023年7月(9)
- 2023年6月(6)
- 2023年5月(7)
- 2023年4月(11)
- 2023年3月(6)
- 2023年2月(11)
- 2023年1月(8)
- 2022年12月(2)
- 2022年11月(4)
- 2022年10月(10)
- 2022年9月(2)
- 2022年8月(13)
- 2022年7月(7)
- 2022年6月(11)
- 2022年5月(18)
- 2022年4月(29)
- 2022年3月(5)
- 2022年2月(6)
- 2022年1月(8)
- 2021年12月(5)
- 2021年11月(3)
- 2021年10月(4)
- 2021年9月(9)
- 2021年8月(14)
- 2021年7月(8)
- 2021年6月(5)
- 2021年5月(2)
- 2021年4月(3)
- 2021年3月(7)
- 2021年2月(2)
- 2021年1月(8)
- 2020年12月(7)
- 2020年11月(2)
- 2020年10月(6)
- 2020年9月(9)
- 2020年8月(10)
- 2020年7月(9)
- 2020年6月(18)
- 2020年5月(4)
- 2020年4月(25)
- 2020年3月(38)
- 2020年1月(21)
- 2019年12月(13)
- 2019年11月(29)
- 2019年10月(44)
- 2019年9月(17)
- 2019年8月(18)
- 2019年7月(25)
- 2019年6月(25)
- 2019年5月(17)
- 2019年4月(10)
- 2019年3月(36)
- 2019年2月(35)
- 2019年1月(28)
- 2018年12月(30)
- 2018年11月(22)
- 2018年10月(4)
- 2018年9月(7)
- 2018年8月(13)
- 2018年7月(13)
- 2018年6月(6)
- 2018年5月(5)
- 2018年4月(13)
- 2018年3月(5)
- 2018年2月(3)
- 2018年1月(8)
- 2017年12月(35)
- 2017年11月(17)
- 2017年10月(16)
- 2017年9月(17)
- 2017年8月(20)
- 2017年7月(34)
- 2017年6月(17)
- 2017年5月(15)
- 2017年4月(32)
- 2017年3月(8)
- 2017年2月(2)
- 2017年1月(5)
- 2016年12月(14)
- 2016年11月(26)
- 2016年10月(12)
- 2016年9月(25)
- 2016年8月(32)
- 2016年7月(14)
- 2016年6月(21)
- 2016年5月(17)
- 2016年4月(13)
- 2016年3月(8)
- 2016年2月(8)
- 2016年1月(18)
- 2015年12月(13)
- 2015年11月(15)
- 2015年10月(12)
- 2015年9月(18)
- 2015年8月(21)
- 2015年7月(35)
- 2015年6月(13)
- 2015年5月(9)
- 2015年4月(4)
- 2015年3月(5)
- 2015年2月(4)
- 2015年1月(13)
- 2014年12月(7)
- 2014年11月(5)
- 2014年10月(4)
- 2014年9月(8)
- 2014年8月(16)
- 2014年7月(26)
- 2014年6月(22)
- 2014年5月(28)
- 2014年4月(15)
友情链接
- Unity官网
- Unity圣典
- Unity在线手册
- Unity中文手册(圣典)
- Unity官方中文论坛
- Unity游戏蛮牛用户文档
- Unity下载存档
- Unity引擎源码下载
- Unity服务
- Unity Ads
- wiki.unity3d
- Visual Studio Code官网
- SenseAR开发文档
- MSDN
- C# 参考
- C# 编程指南
- .NET Framework类库
- .NET 文档
- .NET 开发
- WPF官方文档
- uLua
- xLua
- SharpZipLib
- Protobuf-net
- Protobuf.js
- OpenSSL
- OPEN CASCADE
- JSON
- MessagePack
- C在线工具
- 游戏蛮牛
- GreenVPN
- 聚合数据
- 热云
- 融云
- 腾讯云
- 腾讯开放平台
- 腾讯游戏服务
- 腾讯游戏开发者平台
- 腾讯课堂
- 微信开放平台
- 腾讯实时音视频
- 腾讯即时通信IM
- 微信公众平台技术文档
- 白鹭引擎官网
- 白鹭引擎开放平台
- 白鹭引擎开发文档
- FairyGUI编辑器
- PureMVC-TypeScript
- 讯飞开放平台
- 亲加通讯云
- Cygwin
- Mono开发者联盟
- Scut游戏服务器引擎
- KBEngine游戏服务器引擎
- Photon游戏服务器引擎
- 码云
- SharpSvn
- 腾讯bugly
- 4399原创平台
- 开源中国
- Firebase
- Firebase-Admob-Unity
- google-services-unity
- Firebase SDK for Unity
- Google-Firebase-SDK
- AppsFlyer SDK
- android-repository
- CQASO
- Facebook开发者平台
- gradle下载
- GradleBuildTool下载
- Android Developers
- Google中国开发者
- AndroidDevTools
- Android社区
- Android开发工具
- Google Play Games Services
- Google商店
- Google APIs for Android
- 金钱豹VPN
- TouchSense SDK
- MakeHuman
- Online RSA Key Converter
- Windows UWP应用
- Visual Studio For Unity
- Open CASCADE Technology
- 慕课网
- 阿里云服务器ECS
- 在线免费文字转语音系统
- AI Studio
- 网云穿
- 百度网盘开放平台
- 迅捷画图
- 菜鸟工具
- [CSDN] 程序员研修院
- 华为人脸识别
- 百度AR导航导览SDK
- 海康威视官网
- 海康开放平台
- 海康SDK下载
- git download
- Open CASCADE
- CascadeStudio
- OpenClaw中文社区
- three.js manual
- SVG官方文档
交流QQ群
-
Flash游戏设计: 86184192
Unity游戏设计: 171855449
游戏设计订阅号






