Este tutorial es parte de una serie de tutoriales sobre la generación de señales pwm (modulación de ancho de pulso) con el microcontrolador stm32f103. Anteriormente vimos cómo generar señal pwm con el microcontrolador stm32 usando keil uvision 5 ide y el configurador de código stm32cubemx. Contamos con generación avanzada de señal PWM variable utilizando temporizadores internos del microcontrolador STM32F103. Estudiamos la generación pwm, ahora toca ponerlo en práctica y controlar un periférico con señal pwm. Decidí controlar un servomotor de juguete simple con un microcontrolador stm32f103. Utilicé dos servomotores en el proyecto para probar el código. Primero utilicé el servomotor tower pro SG-90. Este motor funciona bien, pero no movió el brazo a la posición correcta; siempre hay algunos grados de tolerancia en los resultados reales. Puedes comprar uno por un precio justo de $3. Otro motor que acabo de probar es el HS-785HB, gira correctamente pero requiere más potencia (corriente). Para este tutorial recomiendo utilizar el servomotor tower pro sg90 debido a su menor consumo de energía y su simplicidad.
Principio de funcionamiento del servomotor
No todos los servomotores pueden mover cargas pesadas. Depende de sus especificaciones y detalles. Normalmente, los servomotores de juguete pueden mover cargas de 1 kg a 12 kg. Hay dos tipos de servomotores CC y CA. Los servomotores de CA pueden mover cargas aún más pesadas ya que se utilizan en aplicaciones industriales. Los servomotores de CC son los mejores para proyectos pequeños. En este proyecto también estoy usando un servomotor DC con microcontrolador stm32.
Como aprendiste, los servomotores funcionan con señal PWM. La mayoría de los servomotores de CC requieren una frecuencia de 50 Hz para un funcionamiento con ciclo de trabajo variable. A continuación se muestran las formas de onda de los requisitos estándar. Nuestro motor también exige el mismo estándar.
Como aprendiste, los servomotores funcionan con señal PWM. La mayoría de los servomotores de CC requieren una frecuencia de 50 Hz para un funcionamiento con ciclo de trabajo variable. A continuación se muestran las formas de onda de los requisitos estándar. Nuestro motor también exige el mismo estándar.
En el período de ciclo de trabajo de 20 milisegundos y 2 milisegundos, el brazo del servomotor se mueve a 180 grados. En el ciclo de trabajo de 1,5 milisegundos, el brazo se mueve a 90 grados y en el ciclo de trabajo de 1 milisegundo, el brazo gira a 0 grados.
Servo con microcontrolador stm32
Conectaré el servo con el microcontrolador stm32f103c8t6. Compré una placa premontada barata que monta el microcontrolador en ella. Para girar el brazo del servomotor, se utilizan tres pines del microcontrolador como entrada. Para emitir la señal pwm, se utiliza un pin. Los pines 0,1 y 2 del puerto A se utilizan como entradas y el pin 6 del puerto B se utiliza para emitir la señal pwm.
El microcontrolador Stm32f103 funciona a 3,3 voltios mientras que el servomotor tower pro sg90 funciona a 5 voltios. Por lo tanto, tanto el motor del módulo como el microcontrolador deben ser alimentados por fuentes de energía diferentes. No podemos controlar el servo directamente con la señal pwm de salida stm32 porque tiene una forma de onda de 3,3 V y el motor requiere 5 V. Inserté un circuito entre los dos módulos para convertir 3,3 V a 5 V. El primer transistor convierte la señal de entrada en salida de 5 V, pero la señal está invertida. Otro transistor invierte la señal invertida y la devuelve a la lógica original. Entonces, ahora 3.3V en la entrada se cruzan con 5V en la salida del servomotor.
El microcontrolador Stm32f103 funciona a 3,3 voltios mientras que el servomotor tower pro sg90 funciona a 5 voltios. Por lo tanto, tanto el motor del módulo como el microcontrolador deben ser alimentados por fuentes de energía diferentes. No podemos controlar el servo directamente con la señal pwm de salida stm32 porque tiene una forma de onda de 3,3 V y el motor requiere 5 V. Inserté un circuito entre los dos módulos para convertir 3,3 V a 5 V. El primer transistor convierte la señal de entrada en salida de 5 V, pero la señal está invertida. Otro transistor invierte la señal invertida y la devuelve a la lógica original. Entonces, ahora 3.3V en la entrada se cruzan con 5V en la salida del servomotor.
Servomotor controlado con microcontrolador Stm32f103
En el circuito anterior, asegúrese de conectar las tierras de la fuente de alimentación del motor y del microcontrolador. También puedes usar el IC ULN2003 aquí en lugar de los dos transistores. ULN2003 contiene el mismo circuito con diodos volantes.
En stm32cubemx, inicialice 3 pines del Puerto A, pines 1,2 y 3 como entrada. Si no sabes cómo hacer esto, tengo un tutorial sencillo para ti.
Enviaré la señal pwm en PB6. Para esto, debe realizar algunas configuraciones en el ide stm32cubemx. Cómo seleccionar el canal y configurar algunas cosas más. Antes de continuar, me gustaría que hiciera un tutorial sencillo sobre la selección de pines pwm y la fórmula de cálculo del ciclo de trabajo.
El tutorial anterior es muy importante para comprender el flujo de código y la configuración a continuación. En el proyecto se utiliza el oscilador interno del microcontrolador STM32. Aunque la tarjeta tiene un oscilador externo de 8 MHz, preferí usar el interno. El reloj final del temporizador 4 es 1 MHz.
Luego calculé los valores del registro del contador y otros valores necesarios para ingresar en la configuración del temporizador 4. Puede ver la fórmula y otros cálculos de valores en el tutorial anterior.
Mi período de contador es 1000. Esto significa que en 1000 el ciclo de trabajo pwm será del 100% con un período de 20 milisegundos o una frecuencia de 50 Hz. A 500 pwm el ciclo de trabajo será del 50%, lo que se traduce en 10 milisegundos. Al 5% será 1 milisegundo y al 10% serán 2 milisegundos y al 7,5% serán 1,5 milisegundos.
Este valor del contador se utiliza en el código para mover el brazo del servomotor. A continuación se muestra el código. Cuando se presiona el botón 3, el motor se mueve 180 grados. Cuando se presiona el botón 2, el botón gira 90 grados y cuando se presiona el botón 1, vuelve a 0 grados.
Resistencias pull-up internas de los pines del Puerto A. Los pines #1,2 y 3 están activados. En consecuencia, sólo los botones están conectados directamente a tierra.
Descarga el código del proyecto. El código está escrito en Keil Uvision 5 IDE. Stm32cubemx se utiliza para la configuración del microcontrolador. La carpeta Código contiene todos los archivos keil y stm32cubemx. El código es de código abierto, puedes modificarlo y utilizarlo según tus necesidades. Por favor envíenos sus comentarios sobre el proyecto.