Código experimental STM32F103RCT6 del aparato de gobierno + carro ultrasónico para evitar obstáculos (1) Hablando + motor + L298N

STM32 servo + ultrasonido evitación de obstáculos

Debido a las largas vacaciones de invierno, quería hacer un auto inteligente para jugar. El primero es un auto Bluetooth, pero es relativamente simple. No planeo abrir otra parte específicamente. Luego elegiré algo diferente del auto para evitar obstáculos. Habla en parte de eso. Mi automóvil tiene una velocidad lenta para caminar, todavía hay algunos defectos, la línea también es desordenada y se puede lograr la función general.
Primero pegue la imagen del automóvil:
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

El automóvil se divide principalmente en varias partes:
1. STM32F103RCT6, por supuesto, se usa para ejecutar varios comandos, porque usa un tablero de aprendizaje, que ocupa un área relativamente grande, y luego tiene tiempo para cambiar al tablero central de C8T6, que ocupa un área más pequeña.
2. El módulo de accionamiento del motor L298N se utiliza principalmente para conducir los motores izquierdo y derecho. Este módulo se presenta a continuación.
3. Batería, aquí compré una batería de avión modelo 1800mah 20c Batería de enchufe T soldada, la salida es voltaje de 12V
4. Tablero de distribución, principalmente para dividir la batería 12V en una salida de 12V y 5V
5. Servo , El SG90 se usa para simular el servo, lo que lleva más tiempo, porque el resultado no es el mismo que quiero
6. Módulo de rango ultrasónico, usando el módulo HC-SR04, dijo el uso específico de mi artículo anterior Después del
7. módulo Bluetooth, el módulo Bluetooth HC-05 se usa principalmente en el automóvil Bluetooth, y luego se coloca en el automóvil para evitar obstáculos para generar los datos del obstáculo delantero
8. El chasis del automóvil + motor, esta es una búsqueda de un tesoro Sí, y los métodos de conducción son similares. Yo uso un motor DC aquí. También hay un motor paso a paso, pero no utilicé

En este artículo, hablo principalmente sobre cómo hacer que el automóvil funcione, es decir, cómo se mueve el motor.
Para que el automóvil funcione, lo más importante es el motor, que necesita principalmente dos interfaces.

1. motor de corriente continua

Inserte la descripción de la imagen aquí
Esta es una descripción del motor del automóvil que uso. Entre ellos, queremos conducir el motor a un voltaje alto y bajo en la "línea del motor" y "línea del motor +", y el motor rotará. Requerir diferentes métodos de conexión solo afecta el avance y retroceso. En cuanto a otros relacionados con el codificador, no es necesario conectar cables, que se utilizan para medir la velocidad del motor. Bajo ciertas condiciones de voltaje, cuanto mayor es la corriente, más rápida es la velocidad correspondiente.
Normalmente, el módulo L298N puede conducir el motor y alcanzar una velocidad muy alta. Intenté conducirlo directamente con un microordenador de un solo chip, y descubrí que el motor también se puede encender, pero la velocidad es mucho más lenta que el módulo. Supongo que debería ser muy diferente de la corriente. Gran relación

2. módulo L298N

L298N
Así es como se ve el módulo del controlador L298N.
Entre los primeros tres terminales, la tierra en el medio, preste atención a la tierra común con el chip único , de lo contrario no conducirá el motor normalmente. El terminal izquierdo es de entrada de + 12V, que se utiliza para suministrar energía al módulo L298N, que es la salida de potencia. Voltaje de +12 V, el terminal de la derecha tiene una salida de + 5 V, preste atención para no usar este 5 V como entrada , se recomienda no usar este 5 V como terminal de alimentación del microordenador de un solo chip.
Hay dos terminales en los lados izquierdo y derecho, que son OUT1, OUT2, OUT3 y OUT4, que se utilizan para conducir dos motores. Aquí, solo necesita conectar los cables del motor de OUT y el motor para completar.
Hay cuatro encabezados de clavijas al lado de los tres terminales en la parte frontal. Estos cuatro encabezados de clavijas se utilizan para controlar la SALIDA en los lados izquierdo y derecho. Los cuatro encabezados de clavijas son IN1 IN2 IN3 IN4. Hay dos tapas de puente en los lados izquierdo y derecho de los encabezados de clavijas. Los encabezados de los pines son ENA ENB, el propósito es habilitar esos cuatro IN. La conexión con la tapa del puente está habilitada de manera predeterminada. Puede continuar usándola quitando la tapa del puente y agregando señales.Inserte la descripción de la imagen aquí

Esta es la rotación del motor en diferentes situaciones. En la etapa posterior, puede ajustar la velocidad del motor de dos maneras:
1. Habilite EN y luego ajuste la diferencia de voltaje entre IN1 e IN2 (ajustando el ciclo de trabajo PWM) para controlar Velocidad.
2. El control del voltaje de EN también se logra a través del ciclo de trabajo condicional PWM. Este es el método que utilicé aquí.
Aquí inicializo cuatro puertos IO para controlar los cuatro terminales IN para controlar su rotación hacia adelante y hacia atrás.

void gpio_Init(void)
{
 
 GPIO_InitTypeDef  GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);	 //使能PA,PB端口时钟
	
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;				 //PA.4 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
 GPIO_Init(GPIOA, &GPIO_InitStructure);					 //根据设定参数初始化GPIOA.4
// GPIO_SetBits(GPIOA,GPIO_Pin_4);						 //PA.4 输出高

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;	    		 //PA.5 端口配置, 推挽输出
 GPIO_Init(GPIOA, &GPIO_InitStructure);	  				 //推挽输出 ,IO口速度为50MHz
 //GPIO_SetBits(GPIOA,GPIO_Pin_5); 						 //PA.5 输出高


 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;	    		 //PB.10端口配置, 推挽输出
 GPIO_Init(GPIOB, &GPIO_InitStructure);	  				 //推挽输出 ,IO口速度为50MHz
 

	
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;	    		 //PB.11 端口配置, 推挽输出
 GPIO_Init(GPIOB, &GPIO_InitStructure);	  				 //推挽输出 ,IO口速度为50MHz
 
 

 

}

Aquí clasifico varias rotaciones de motor y las llamo con funciones

void stop()
{
		PAout(4)=0;
		PAout(5)=0;
		PBout(10)=0;
		PBout(11)=0;//停止

}



void front()
	
{
		PBout(10)=0;
		PBout(11)=1;//前进
		PAout(4)=0;
		PAout(5)=1;
			



}


void left()
	
{
		PAout(4)=0;
		PAout(5)=1;
		PBout(10)=1;
		PBout(11)=0;//左转


}


void right()
{
		PAout(4)=1;
		PAout(5)=0;
		PBout(10)=0;
		PBout(11)=1;//右转

}	


void turnleft()
	
{

		PAout(4)=0;
		PAout(5)=1;
		PBout(10)=0;
		PBout(11)=0;//一电机停止 左转
		

}




void turnright()
	

{

		PAout(4)=0;
		PAout(5)=0;
		PBout(10)=0;
		PBout(11)=1;//一电机停止 右转

}
 

void back()
	

{

		PAout(4)=1;
		PAout(5)=0;
		PBout(10)=1;
		PBout(11)=0;//后退
		

}

De esta manera, el neumático se puede conducir para rotar, y el carro se puede conducir para moverse en cualquier dirección.
Lo siguiente es que configuré dos ondas PWM en dos señales EN para controlar la velocidad del motor y luego la velocidad del automóvil. Solo usé un temporizador normal para emitir la onda PWM, y no utilicé la función de freno del temporizador avanzado.
PWM1:

#include "pwm.h"


//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM3_PWM4_Init(u16 arr,u16 psc)
{  
	 GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);// 
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);  //使能GPIO外设时钟使能
	                                                                     	

   //设置该引脚为复用输出功能,输出TIM3 CH4的PWM脉冲波形
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //TIM_CH4
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);

	
	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	 80K
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
	TIM_OC4Init(TIM3, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

  TIM_CtrlPWMOutputs(TIM3,ENABLE);	//MOE 主输出使能	

	TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);  //CH4预装载使能	 
	
	TIM_ARRPreloadConfig(TIM3, ENABLE); //使能TIMx在ARR上的预装载寄存器
	
	TIM_Cmd(TIM3, ENABLE);  //使能TIM3
 
   
}

PWM2:

#include "pwm2.h"


//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM3_PWM3_Init(u16 arr,u16 psc)
{  
	 GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);// 
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);  //使能GPIO外设时钟使能
	                                                                     	

   //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //TIM_CH1
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);

	
	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	 80K
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
	TIM_OC3Init(TIM3, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

  TIM_CtrlPWMOutputs(TIM3,ENABLE);	//MOE 主输出使能	

	TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);  //CH3预装载使能	 
	
	TIM_ARRPreloadConfig(TIM3, ENABLE); //使能TIMx在ARR上的预装载寄存器
	
	TIM_Cmd(TIM3, ENABLE);  //使能TIM3
 
   

Dos ciclos de trabajo de control PWM

		TIM_SetCompare3(TIM3,2400);//左轮电机转速
		TIM_SetCompare4(TIM3,2530);//右轮电机转速

Cuanto mayor es el valor de la función de control del ciclo de trabajo, más lenta es la velocidad. En la práctica, encontraré diferentes velocidades de las dos ruedas del automóvil. Aquí no he usado un algoritmo para ajustarlo. Utilizo el ajuste manual para probablemente ir directamente. Los defectos de hardware son software Para hacer las paces


Hasta ahora, puede usar el módulo de un solo chip + L298N para conducir el motor, que puede hacer que el automóvil viaje en cualquier dirección. El código específico se carga después de

Publicado 3 artículos originales · elogiado 4 · visitas 142

Supongo que te gusta

Origin blog.csdn.net/ljw__/article/details/105558686
Recomendado
Clasificación