🛠 Piloter un micro-servo avec le PWM

Raspberry Pi Pico 2 · intermediaire · Schéma : IMG-pico-2-intermediaire-1-pico2-pwm-servo.svg — micro-servo de type MG90S alimenté en 5 V via VBUS, fil de commande relié à GP2 de la Pico 2, masses communes

Objetivos

Configurar un slice PWM del RP2350 (16 canales PWM, 8 slices dobles) a 50 Hz con una resolución suficiente para generar impulsos de 1 a 2 ms, y controlar un micro-servo en barrido de ángulo. Diferencia con el RP2040: mismos principios PWM, pero el RP2350 permite divisiones de reloj más finas a 150 MHz.

Material

Código completo

/* servo.c — balayage 0..180 deg sur GP2, PWM 50 Hz */
#include "pico/stdlib.h"
#include "hardware/pwm.h"

#define SERVO_PIN 2
#define WRAP 19999   /* 125 MHz / (125 * 20000) = 50 Hz */

static void servo_angle(float deg) {
    /* 0 deg -> 1 ms, 180 deg -> 2 ms ; 1 pas = 10 ns avec clkdiv 125 */
    uint32_t level = 100 + (uint32_t)(deg * 5.0f);  /* 100..1000 */
    pwm_set_chan_level(pwm_gpio_to_slice_num(SERVO_PIN), PWM_CHAN_A, level);
}

int main(void) {
    gpio_set_function(SERVO_PIN, GPIO_FUNC_PWM);
    uint slice = pwm_gpio_to_slice_num(SERVO_PIN);
    pwm_set_clkdiv(slice, 125.0f);      /* 1 pas = 1 us / 100 ? voir texte */
    pwm_set_wrap(slice, WRAP);
    pwm_set_enabled(slice, true);

    for (float a = 0; ; a += 5) {          /* triangle 0->180->0 */
        float ang = (a <= 180.0f) ? a : 360.0f - a;
        servo_angle(ang);
        if (a >= 355.0f) a = 0;
        sleep_ms(20);
    }
}

Verificación esperada

El servo barre regularmente de 0° a 180° y vuelve, en bucle. En el osciloscopio: periodo de 20 ms (50 Hz), ancho de pulso variando de aproximadamente 1 ms a 2 ms. Ajuste los límites level según su servo.

Errores frecuentes

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales