esp32如何控制sg90
时间: 2025-03-05 13:06:06 浏览: 64
### ESP32 控制 SG90 舵机 示例代码
为了实现对SG90舵机的有效控制,通常采用PWM(脉宽调制)信号来指定舵机的位置。下面是一个基于ESP-IDF框架下的C语言示例程序,用于初始化并设置SG90舵机的角度。
#### 初始化函数定义
```c
#include "driver/ledc.h"
#include "sg90.h"
#define SERVO_PIN GPIO_NUM_18 // 定义舵机连接的GPIO引脚编号
#define LEDC_CHANNEL 0 // 使用LEDC通道号
#define LEDC_TIMER LEDC_TIMER_0 // 设置定时器
#define LEDC_RESOLUTION 10 // 分辨率为10位 (0~1023)
void sg90_init() {
ledc_timer_config_t timer_conf = {
.speed_mode = LEDC_LOW_SPEED_MODE,
.duty_resolution = LEDC_RESOLUTION,
.timer_num = LEDC_TIMER,
.freq_hz = 50, // 频率设为50Hz即周期为20ms
.clk_cfg = LEDC_AUTO_CLK
};
ledc_channel_config_t channel_conf = {
.gpio_num = SERVO_PIN,
.speed_mode = LEDC_LOW_SPEED_MODE,
.channel = LEDC_CHANNEL,
.intr_type = LEDC_INTR_DISABLE,
.timer_sel = LEDC_TIMER,
.duty = 0, // 初始占空比设为0%
.hpoint = 0
};
ledc_timer_config(&timer_conf);
ledc_channel_config(&channel_conf);
// 启动LEDC模块
ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL, 0);
ledc_update_duty(LEDC_LOW-Speed_MODE, LEDC_CHANNEL);
}
```
此段代码负责配置硬件资源以及设定初始参数[^2]。
#### 设定角度函数定义
```c
// 将角度转换成对应的占空比数值
uint32_t angle_to_duty(float angle) {
float duty_cycle;
if(angle < 0){
angle = 0;
}else if(angle > 180){
angle = 180;
}
duty_cycle = ((angle / 180.0f) * 1023); // 计算对应于输入角的PWM值
return (uint32_t)duty_cycle;
}
void sg90_SetAngle(float angle) {
uint32_t duty = angle_to_duty(angle);
ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL, duty);
ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL);
}
```
上述`sg90_SetAngle()`函数接收一个浮点数作为目标角度,并将其映射至合适的PWM占空比范围之内再发送给舵机执行转动操作。
#### 主循环中的应用实例
```c
int main(void) {
sg90_init();
while(true) {
for(int i=0; i<=180; ++i){
sg90_SetAngle(i);
vTaskDelay(pdMS_TO_TICKS(15)); // 延迟一段时间让动作更流畅
}
for(int i=180; i>=0; --i){
sg90_SetAngle(i);
vTaskDelay(pdMS_TO_TICKS(15));
}
}
}
```
这段主逻辑实现了从0度到180度再到返回的过程,在实际项目里可以根据需求修改具体的运动模式和速度[^3]。
阅读全文
相关推荐


















