1、总体设计方案
该项目分为三个组成部分:MCU控制部分、传感器检测部分、执行部分。自动避障、跟踪、无线蓝牙控制等。
小车MCU使用主控部分STM32F401芯片最小系统板,搭配SG90舵机、HC-SR04超声波模块,TCRT5000红外反射传感器模块HC-05蓝牙模块、TB6612FNG电机驱动模块,降压模块,OLED显示屏、测速光电耦合传感器模块和电源部件,最后,通过软件编程,感知黑色导线和障碍物可以自动识别路线跟踪,检测障碍物的自动回避和无线蓝牙的控制。
让车动起来
我们采用DC3V-6V直流减速电机供电3V-6V。TB6612FNG电机驱动模块(淘宝30-40元一个)有16个引脚。电机驱动电路主要是通过改变电机的正反转来选择汽车的前后左右方向。
因为TB6612驱动模块的VM口只能接10V因此,我们接入内部电源LM2596S DC-DC稳压(淘宝三四块一个)可调降压模块,防止芯片烧坏。
1.接入电源(3-4000)V),电源指示灯亮,模块正常工作。
2.调整蓝色电位器旋钮(一般顺时针旋转升压,逆时针旋转降压),用万用表监测输出电压,直至达到所需电压。注意:建议长时间工作2.5A使用内部电流,加散热器(10W以上输出);由于是降压模块,请保持至少1,以确保输出稳定.5V压差。
2.首先我们来做CubeMX的设置
以下是我对TB6612模块的引脚设置和真值表。
TB6612引脚分配: VM PWMA--------->TIM1_CH1(PA8) VCC AIN2--------->GPIOA_1 GND AIN1--------->GPIOA_0 AO1 STBY--------->GPIOB_9 AO2 BIN1--------->GPIOA_2 BO2 BIN2--------->GPIOA_3 BO1 PWMB--------->TIM1_CH4(PA11) GND GND
真值表 AIN1 L H L H AIN2 L L H H BIN1 L H L H BIN2 L L H H 停止 正转 反转 刹车
并对它的,以及配置,生成工程文件
2.2.驱动程序代码设计
motor.c
#include "motor.h" #include "main.h" #include "tim.h" #include "gpio.h" void PWM_INIT(void) { HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1); //打开电机APWM输出定时器;打开定时器1,通道1 HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_4); //打开电机BPWM输出定时器;打开定时器1,通道4 } void car_go_straight(void)//前进 { __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,1000); //设置占空比 在计数周期(8400)内,一共发送1000次 __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_4,1000); AIN1_H; AIN2_L;///电机A正转 BIN1_H; BIN2_L;///电机B正转 } void car_go_right(void)//右转 { __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,1000); //设置占空比 计数周期(8400)共发送1000次 __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_4,1000); AIN1_H; AIN2_L;///电机A正转 BIN1_L; BIN2_H;///电机B反转 } void car_go_left(void)//左转 { __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,1000); //设置占空比 计数周期(8400)共发送1000次 __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_4,1000); AIN1_L; AIN2_H;///电机A反转 BIN1_H; BIN2_L;///电机B正转 } void car_go_ahead(void)//停止 { __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,0); //设置占空比 计数周期(8400)内发送0次 __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_4,0); AIN1_L; AIN2_L;///停止电机A BIN1_L; BIN2_L;///停止电机B } void car_go_after(void)//后退 { __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,1000); //设置占空比 计数周期(8400)共发送1000次 __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_4,1000); AIN1_L; AIN2_H;///电机A反转 BIN1_L; BIN2_H;///电机B反转 }
motor.h
#ifndef __MOTOR_H_ #define __MTOR_H_
#include "main.h"
//左轮
#define AIN1_H HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_SET);
#define AIN1_L HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_RESET);
#define AIN2_H HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,GPIO_PIN_SET);
#define AIN2_L HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,GPIO_PIN_RESET);
//右轮
#define BIN1_H HAL_GPIO_WritePin(BIN1_GPIO_Port,BIN1_Pin,GPIO_PIN_SET);
#define BIN1_L HAL_GPIO_WritePin(BIN1_GPIO_Port,BIN1_Pin,GPIO_PIN_RESET);
#define BIN2_H HAL_GPIO_WritePin(BIN2_GPIO_Port,BIN2_Pin,GPIO_PIN_SET);
#define BIN2_L HAL_GPIO_WritePin(BIN2_GPIO_Port,BIN2_Pin,GPIO_PIN_RESET);
void PWM_INIT(void);
void car_go_straight(void);//前进
void car_go_right(void);//右转
void car_go_left(void);//左转
void car_go_ahead(void);//停止
void car_go_after(void);//后退
#endif