Tabla de contenido:

Generación de señal PWM de alta resolución para servos RC con dispositivos STM32: 3 pasos
Generación de señal PWM de alta resolución para servos RC con dispositivos STM32: 3 pasos

Video: Generación de señal PWM de alta resolución para servos RC con dispositivos STM32: 3 pasos

Video: Generación de señal PWM de alta resolución para servos RC con dispositivos STM32: 3 pasos
Video: De Arduino a STM32 #12 PWM (Pulse Width Modulation) 2024, Mes de julio
Anonim
Generación de señal PWM de alta resolución para servos RC con dispositivos STM32
Generación de señal PWM de alta resolución para servos RC con dispositivos STM32
Generación de señal PWM de alta resolución para servos RC con dispositivos STM32
Generación de señal PWM de alta resolución para servos RC con dispositivos STM32
Generación de señal PWM de alta resolución para servos RC con dispositivos STM32
Generación de señal PWM de alta resolución para servos RC con dispositivos STM32

Actualmente, estoy construyendo un transmisor / receptor RC basado en el chip RF SX1280. Uno de los objetivos del proyecto es que quiero una resolución de servo de 12 bits desde los sticks hasta los servos. En parte porque los servos digitales modernos tienen una resolución de 12 bits, en segundo lugar, un transmisor de gama alta usa 12 bits de todos modos. Estaba investigando cómo puedo generar señales PWM de alta resolución en dispositivos STM32. Estoy usando píldora negra (STM32F103C8T8) en este momento para el prototipo.

Paso 1: Lista de piezas

Hardware

  • Cualquier placa de desarrollo STM32F103 (pastilla azul, pastilla negra, etc.)
  • Un banco de energía USB como fuente de alimentación
  • Programador STM32 (Segger j-links, ST-LINK / V2, o simplemente un clon de st-link)

Software

  • STM32CubeMX
  • Atollic TrueSTUDIO para STM32
  • Fuente del proyecto de github

Paso 2: la solución obvia

La solución obvia
La solución obvia
La solución obvia
La solución obvia
La solución obvia
La solución obvia

Probablemente, la solución más sencilla es utilizar uno de los temporizadores que pueden generar señales PWM, como TIM1-3 en un STM32F103. Para un servo digital moderno, la velocidad de fotogramas puede bajar a 5 ms aproximadamente, pero para un servo analógico antiguo debería ser de 20 ms o 50 Hz. Entonces, en el peor de los casos, generemos eso. Con un reloj de 72 MHz y una resolución de contador de temporizador de 16 bits, debemos configurar el preescalador del temporizador en un mínimo de 23 para cubrir la velocidad de cuadro de 20 ms. Seleccioné 24 porque luego, durante 20 ms, necesito configurar el contador exactamente en 60000. Puede ver la configuración de CubeMX y las señales PWM de 1 y 1,5 ms generadas en las capturas de pantalla. Desafortunadamente, durante 1 ms, el contador del temporizador debe establecerse en 3000, lo que nos daría una resolución de solo 11 bits. No está mal, pero el objetivo era de 12 bits, así que intentemos algo más.

Por supuesto, si seleccionara un microcontrolador con contador de temporizador de 32 bits, como STM32L476, esta resolución puede ser mucho mayor y el problema se resolvería.

Pero aquí, me gustaría proponer una solución alternativa que aumentará aún más la resolución incluso en el STM32F103.

Paso 3: temporizadores en cascada para una resolución más alta

Temporizadores en cascada para mayor resolución
Temporizadores en cascada para mayor resolución
Temporizadores en cascada para mayor resolución
Temporizadores en cascada para mayor resolución
Temporizadores en cascada para mayor resolución
Temporizadores en cascada para mayor resolución

El principal problema con la solución anterior es que la velocidad de fotogramas (20 ms) es relativamente alta en comparación con la señal PWM realmente generada (entre 1 y 2 ms), por lo que estamos desperdiciando algunos bits valiosos durante los 18 ms restantes cuando estamos esperando. el siguiente cuadro. Esto se puede resolver conectando temporizadores en cascada utilizando la función de enlace de temporizador para la sincronización.

La idea es que usaré TIM1 como maestro para generar la velocidad de fotogramas (20 ms) y TIM2, TIM3 para hacer frente a las señales PWM como esclavos. Cuando el maestro activa los esclavos, solo generan una señal PWM en un modo de pulso. Por lo tanto, solo necesito cubrir 2 ms en esos temporizadores. Afortunadamente, puede conectar esos temporizadores en cascada en el hardware, por lo que esta sincronización no necesita ninguna intervención del procesador y también es muy precisa, el jitter está en la región ps. Puede ver la configuración de CubeMX en las capturas de pantalla.

Como puede ver, seleccioné 3 como prescalar, por lo que para los 2 ms necesito establecer 48000 en el contador del temporizador. Esto nos da 24000 por 1 ms, que en realidad es más de lo que necesitamos para una resolución de 14 bits. Tadaaaa…

Eche un vistazo a las capturas de pantalla del osciloscopio en la introducción para ver el resultado final. El canal 3 (violeta) es la interrupción del temporizador maestro que activará los bálsamos para generar un pulso. Los canales 1 y 4 (haz amarillo y verde) son las señales PWM reales generadas por diferentes temporizadores. Tenga en cuenta que están sincronizados, pero están sincronizados en los bordes posteriores, eso se debe al modo PWM 2. Esto no es un problema, porque la velocidad PWM para el servo en particular sigue siendo correcta.

Otro beneficio de esta solución es que cambiar la velocidad de fotogramas significaría cambiar el período solo en TIM1. Para los servos digitales modernos, puede bajar incluso a 200-300 Hz, pero consulte el manual del servo si desea realizar un ajuste fino.

Recomendado: