From 23c73c6e914747139f36a70aa6b85e14e92d2210 Mon Sep 17 00:00:00 2001 From: franchioping Date: Sat, 18 Apr 2026 21:23:25 +0100 Subject: [PATCH] servo --- main/gps.h | 3 ++- main/servo.cpp | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++ main/servo.h | 0 3 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 main/servo.cpp create mode 100644 main/servo.h diff --git a/main/gps.h b/main/gps.h index e9d0e46..d64a8d0 100644 --- a/main/gps.h +++ b/main/gps.h @@ -14,7 +14,8 @@ #include "HardwareSerial.h" #include "esp_log.h" -#include #include +#include +#include #include #include diff --git a/main/servo.cpp b/main/servo.cpp new file mode 100644 index 0000000..21b747d --- /dev/null +++ b/main/servo.cpp @@ -0,0 +1,61 @@ + +#include "driver/ledc.h" +#include "esp_log_level.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include + +#include "esp_log.h" + +#define SERVO_PIN 7 +#define LEDC_TIMER LEDC_TIMER_0 +#define LEDC_MODE LEDC_LOW_SPEED_MODE +#define LEDC_CHANNEL LEDC_CHANNEL_0 +#define LEDC_DUTY_RES LEDC_TIMER_13_BIT +#define LEDC_FREQUENCY 50 + +uint32_t us_to_duty(int us) { + // 20000 is the period in microseconds (50Hz) + // 8191 is the max duty cycle for 13-bit resolution + return (uint32_t)((float)us / 20000.0f * 8191.0f); +} + +ledc_timer_config_t ledc_timer = {.speed_mode = LEDC_MODE, + .duty_resolution = LEDC_DUTY_RES, + .timer_num = LEDC_TIMER, + .freq_hz = LEDC_FREQUENCY, + .clk_cfg = LEDC_AUTO_CLK}; + +ledc_channel_config_t ledc_channel = {.gpio_num = SERVO_PIN, + .speed_mode = LEDC_MODE, + .channel = LEDC_CHANNEL, + .timer_sel = LEDC_TIMER, + .duty = 0}; +void servo_init() { + ledc_timer_config(&ledc_timer); + ledc_channel_config(&ledc_channel); +} + +#define DUTY_CYCLE_DOWN 2000 +#define DUTY_CYCLE_UP 850 + +enum SERVO_OPTIONS { + UP, + DOWN, + OFF, +}; + +void set_servo(SERVO_OPTIONS opt) { + switch (opt) { + case UP: + ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, us_to_duty(DUTY_CYCLE_UP)); + ledc_update_duty(LEDC_MODE, LEDC_CHANNEL); + break; + case DOWN: + ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, us_to_duty(DUTY_CYCLE_DOWN)); + ledc_update_duty(LEDC_MODE, LEDC_CHANNEL); + case OFF: + ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, 0); + ledc_update_duty(LEDC_MODE, LEDC_CHANNEL); + } +} diff --git a/main/servo.h b/main/servo.h new file mode 100644 index 0000000..e69de29