Tabla de contenido:

Control de servomotor con STM32F4 ARM MCU: 4 pasos
Control de servomotor con STM32F4 ARM MCU: 4 pasos

Video: Control de servomotor con STM32F4 ARM MCU: 4 pasos

Video: Control de servomotor con STM32F4 ARM MCU: 4 pasos
Video: Control Servo motor with Joystick and Arduino[with CODE] | Arduino Servo motor control | Servo robot 2024, Noviembre
Anonim
Control de servomotor con STM32F4 ARM MCU
Control de servomotor con STM32F4 ARM MCU
Control de servomotor con STM32F4 ARM MCU
Control de servomotor con STM32F4 ARM MCU

Hola de nuevo amigos:) Entonces, en este proyecto controlaremos un servomotor con STM32F4 ARM MCU. En mi caso, usaré la placa de descubrimiento, pero si comprende la esencia del problema, puede aplicarla para cada MCU. Entonces. empecemos:)

Paso 1: requisitos de hardware y software

En términos de hardware necesitaremos:

  • Una MCU que es en mi caso la placa de descubrimiento STM32f4
  • Un servomotor común, como SG90 o cualquier otro

En términos de software, necesitaremos:

  • STM32CubeMX
  • Keil uVision

Si tiene todos estos, vaya al siguiente paso:)

Paso 2: Configuración de STM32CubeMX

Como saben, para controlar un servomotor necesitamos la señal PWM. Los requisitos en términos de señal PWM son así:

  • El período de PWM debe ser de 20 mS
  • El tiempo debe estar entre 0,5 mS y 2,5 mS. Cuando el tiempo es de 0,5 mS, el servo girará 0 grados, 1,5 mS durante 90 grados y 2,5 mS durante 180 grados.

Entonces, necesitamos configurar PWM y para eso usaremos Timer1.

  • Primero, seleccione TIM1 en la sección Temporizadores. Este paso
  • Luego, desde la sección Mode

    1. Elija reloj interno Este paso
    2. PWM Generation CH1 Este paso
  • Luego, desde la sección Configuración

    1. Establezca Prescaler en 160 Este paso
    2. Establezca el período del contador en 2000 Este paso
    3. Establezca el pulso en 50 Este paso
  • Además, desde la configuración del reloj, configure los relojes del temporizador APB1 en 16MHz. Este paso

Ahora, hablemos un poco sobre este paso:

La frecuencia de nuestro reloj APB1 Timer es de 16MHz. Entonces, significa que se requieren 16, 000, 000 ticks para obtener 1 segundo. Sin embargo, configuramos nuestro preescalador en 160. Es decir, dividimos nuestra frecuencia por ese número y disminuimos el número de tics a 100, 000. Entonces, durante 1 segundo, necesitamos 100, 000 ticks. Sin embargo, necesitamos 20 mS de período PWM como dijimos antes. Entonces, basado en matemáticas simples, necesitamos 2000 ticks para 20 ms. Por lo tanto, al establecer el período del contador en 2000, determinamos el período de la señal PWM que es de 20 mS. Ahora necesitamos determinar el número de tick para obtener tiempos de encendido de 0.5 mS a 2.5 mS. Podemos obtener esta ecuación de matemáticas simples y es:

On_Time = (Tick_Number / 100). Tenga en cuenta que este es el on_time que cambia el ángulo del servomotor. Entonces, debajo de la imagen resumo este paso. Si tienes alguna duda escribe en los comentarios y te responderé lo antes posible.

Imagen de cálculos

Después de hacer todo esto, genere código:)

Paso 3: Codificación Keil UVision

Entonces, primero determinemos qué queremos hacer. Queremos escribir una función que acepte grado y escribirlo en el servo. Entonces, ¿cómo lo haremos? Como hemos dicho antes, para cambiar el ángulo necesitamos cambiar el tiempo. Nuestros ángulos cambian entre [0, 180] y nuestro número de tics, lo que determina los cambios de tiempo entre [50, 250]. Entonces, necesitamos una función de mapeo que mapee un ángulo dado al rango de número de tics. Por ejemplo, para ticks de 0 grados 50, para ticks de 180 grados 250 y así sucesivamente … Así que vamos a escribir nuestra función de mapeo:

int map (int st1, int fn1, int st2, int fn2, int value) {return (1.0 * (value-st1)) / ((fn1-st1) * 1.0) * (fn2-st2) + st2; }

Esta es nuestra función de mapeo. ¿Le interesa cómo se deriva? Entonces lee eso. Entonces, tomamos nuestros rangos y el valor que queremos mapear.

Ahora, escriba una función que acepte el ángulo y lo asigne al rango de tics:

void servo_write (ángulo int) {htim1. Instance-> CCR1 = map (0, 180, 50, 250, angle); }

Como puede ver, este código acepta el ángulo y lo asigna al rango de número de tics. Luego, el número de tics se da al registro CCR1 que controla el tiempo de encendido y, por lo tanto, el ángulo.

Sin embargo, para que todo esto funcione, primero iniciamos el pwm, que se puede hacer con solo una línea de código:

HAL_TIM_PWM_Start (& htim1, TIM_CHANNEL_1);

Entonces, tenemos una función que acepta el ángulo y lo escribe en el servo. Probemos y escribamos nuestra función de barrido que es muy fácil:

void servo_sweep (void) {for (int i = 0; i <= 180; i ++) {servo_write (i); HAL_Delay (10); } para (int i = 180; i> = 0; i--) {servo_write (i); HAL_Delay (10); }}

Entonces, solo cuenta hasta 180 y luego hasta 0 y escribe estos valores en el servo:) Entonces, ¡veamos el resultado!

Paso 4: el resultado:)

Así que este es el final. Si tiene alguna pregunta, por favor pregunte. Estaré feliz de poder contestarlas. Muchas gracias por leer y espero verte en el próximo proyecto:)

Recomendado: