Explicación del servo de control STM32, desde la entrada hasta el abandono.

Servocontrol STM32


prefacio

Aquí tomamos STM32F103C8T6 como nuestro chip y emitimos PWM a través del puerto PB9 para controlar el servo. Aquí tomamos el mecanismo de dirección de 180° SG90.


1. PWM


¿Qué es PWM?

PWM, nombre en inglés Pulse Width Modulation, es la abreviatura de Pulse Width Modulation. Modula el ancho de una serie de pulsos para obtener de manera equivalente la forma de onda requerida (incluida la forma y la amplitud), y codifica digitalmente el nivel de la señal analógica. es decir, el cambio de señal, energía, etc., se ajusta ajustando el cambio de ciclo de trabajo. El ciclo de trabajo se refiere al porcentaje de todo el ciclo de la señal cuando la señal está en un nivel alto en un ciclo. Por ejemplo, el El ciclo de trabajo de una onda cuadrada es del 50%.

Temporizadores STM32 excepto TIM6 y 7. Se pueden usar otros temporizadores para generar salidas PWM. Entre ellos, los temporizadores avanzados TIM1 y TIM8 pueden generar hasta 7 salidas PWM al mismo tiempo. El temporizador de uso general también puede generar hasta 4 salidas PWM al mismo tiempo, de modo que el STM32 puede generar hasta 30 salidas PWM al mismo tiempo. Aquí solo usamos CH4 de TIM4 para generar una salida PWM.

inserte la descripción de la imagen aquí
Frecuencia PWM: se refiere a la cantidad de veces que la señal pasa de nivel alto a nivel bajo y de regreso a nivel alto en 1 segundo (un ciclo);
es decir, cuántos ciclos de PWM en un segundo

Unidad: Hz

Representación: 50Hz 100Hz

Período de PWM:

T=1/f

periodo=1/frecuencia

50Hz = 20ms un ciclo

Si la frecuencia es de 50Hz, es decir un ciclo es de 20ms, entonces hay 50 ciclos PWM en un
segundo , el periodo es de 20ms, entonces (tomando el servo girando 45° como ejemplo), el ciclo de trabajo debe ser de 1ms /20ms = 5%, por lo que el valor de registro de comparación de captura TIMx 1 de TIM_SetCompare1 es 200-200*5% = 190

Unidad: % (0%-100%)

Representación: 20%

¿Cómo realizar la salida de señal PWM?

<1> La señal PWM se puede emitir directamente a través del módulo interno del chip. La premisa es que este puerto de E/S tiene un módulo integrado, que solo necesita unos pocos pasos sencillos. Este tipo de módulo de función con salida PWM es más fácil Para programar y diseñar Al mismo tiempo, los datos son más precisos. Como se muestra en la figura a continuación, el puerto IC general indicará si se trata de un puerto PWM;

inserte la descripción de la imagen aquí

<2> Pero si no hay un módulo de función PWM dentro del IC, o los requisitos no son muy altos, puede usar el puerto de E/S para configurar algunos parámetros para generar la señal PWM, porque la señal PWM es en realidad una combinación de una serie de niveles altos y bajos. El método específico es agregar un temporizador a la E / S. Para que la frecuencia de la señal PWM que necesita para generar sea consistente con su temporizador, use la interrupción del temporizador para contar, pero este método generalmente no se usa, a menos que los requisitos para la precisión, la frecuencia, etc. no son muy altas.

En segundo lugar, el mecanismo de dirección


¿Qué es un mecanismo de dirección?

Los engranajes de dirección también se denominan servos RC, que generalmente se usan en proyectos de robótica, y también se pueden encontrar en automóviles, aviones y otros modelos de aviones RC.
Los servosistemas como los servos generalmente consisten en pequeños motores eléctricos, potenciómetros, controles integrados y cajas de cambios.
El potenciómetro interno muestrea y mide continuamente la posición del eje de salida del motor, y se compara con la posición objetivo establecida por el microcontrolador (como STM32, Arduino);
de acuerdo con la desviación correspondiente, el dispositivo de control ajustará la posición real de el eje de salida del motor para que coincida con la ubicación del objetivo. Esto forma un sistema de control de circuito cerrado.

inserte la descripción de la imagen aquí

Principio de control

Controle la salida del mecanismo de dirección enviando una señal PWM a la línea de señal del mecanismo de dirección;

En términos generales, podemos controlar el período y el ciclo de trabajo de PWM, por lo que el ciclo de trabajo del pulso PWM determina directamente la posición del eje de salida.

Aquí hay un ejemplo;

Cuando enviamos una señal con un ancho de pulso de 1,5 milisegundos (ms) al servo, el eje de salida del servo se moverá a la posición media (90 grados);

Cuando el ancho de pulso es de 1 ms, el eje de salida del servo se moverá a la posición mínima (0 grados);

Cuando el ancho de pulso es de 2 ms, el eje de salida del servo se moverá a la posición mínima (180 grados);

Nota: Los ángulos de las posiciones máxima y mínima pueden variar entre diferentes tipos y marcas de servomotores. Muchos servos solo giran alrededor de 170 grados (o solo 90 grados), pero un pulso de servo con un ancho de 1,5 ms generalmente establecerá el servo en la posición media (generalmente la mitad del rango completo especificado);

Para obtener más información, consulte la siguiente figura;
inserte la descripción de la imagen aquí

Ciclo de trabajo = t / T Los parámetros relevantes son los siguientes:

t = 0,5 ms--------El servo gira a 0°
t = 1,0 ms--------El servo gira a 45°
t = 1,5 ms--------El servo gira a 90 °
t = 2.0ms —————- el servo gira a 135°
t = 2.5ms —————- el servo gira a 180°

Porque: el período PWM es 20ms = (7200*200)/72000000=0.02
Entonces: TIM_Period = 199, TIM_Prescaler = 7199, que son mis parámetros de entrada de programa


Código de referencia

Pasos de escritura:

<1> Encienda TIM4, reloj GPIOB, configure PB9 como salida multiplexada.

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器 4 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB, ENABLE); //复用时钟使能

<2> Inicialice TIM4, configure ARR y PSC de TIM4.

TIM_TimeBaseStructure.TIM_Period = arr; //设置自动重装载值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据指定的参数初始化 TIMx 的

<3> Configure el modo PWM de TIM4_CH4 y habilite la salida CH4 de TIM4.

void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)

Eche un vistazo a la definición de la estructura TIM_OCInitTypeDef
:

typedef struct
{
    
    
	uint16_t TIM_OCMode;
	uint16_t TIM_OutputState;
	uint16_t TIM_OutputNState; 
	uint16_t TIM_Pulse;
	uint16_t TIM_OCPolarity;
	uint16_t TIM_OCNPolarity;
	uint16_t TIM_OCIdleState;
	uint16_t TIM_OCNIdleState;
} TIM_OCInitTypeDef;

Echemos un vistazo a los parámetros dentro:

El parámetro TIM_OCMode establece si el modo es PWM o comparación de salida, aquí estamos en modo PWM.
El parámetro TIM_OutputState se usa para configurar la habilitación de la salida de comparación, es decir, habilita la salida PWM al puerto.
El parámetro TIM_OCPolarity se utiliza para establecer si la polaridad es alta o baja.
Los demás parámetros TIM_OutputNState, TIM_OCNPolarity, TIM_OCIdleState y TIM_OCNIdleState
solo los utilizan los temporizadores avanzados TIM1 y TIM8.

La configuración es la siguiente:

TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择 PWM 模式 2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高
TIM_OC4Init(TIM4, &TIM_OCInitStructure); //初始化 TIM4 OC4

<4> Habilitar TIM4.

TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_Cmd(TIM4, ENABLE); //使能 TIM4

<5> Modifique TIM4_CCR4 para controlar el ciclo de trabajo.

void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4)

Fragmento de código final:

//time.c
#include "time.h"
#include "stm32f10x.h"
#include "sys.h"

void TIM4_PWM_Init(u16 arr,u16 psc)
{
    
    
	GPIO_InitTypeDef GPIO_InitStrue;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	TIM_OCInitTypeDef TIM_OCInitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

	GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;
	GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStrue);
	
	TIM_TimeBaseStructure.TIM_Period = arr; 
	TIM_TimeBaseStructure.TIM_Prescaler =psc; 
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; 
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); 
	
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High; 
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OC4Init(TIM4,&TIM_OCInitStructure);
	
	TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);
	TIM_Cmd(TIM4,ENABLE);
}



Aquí está el código de la función principal:

//main.c
#include "stm32f10x.h"
#include "time.h"
#include "sys.h"
#include "usart.h"
#include "delay.h"

int main(void)
{
    
    
	delay_init();
	TIM4_PWM_Init(199,7199);
  while (1)
 {
    
    
	 
		delay_ms(10);
	 
		TIM_SetCompare4(TIM4,190);
	
 }
}

Supongo que te gusta

Origin blog.csdn.net/qq_42866708/article/details/113355329
Recomendado
Clasificación