驱动四个轮子用的TB6612,黑色的和红色最大输电压好像不一样(12v和10v的区别,建议还是5v就够了)
一、cubemx
sys
RCC
gpio
TIM3-PWM
最后生成文件记得要勾选生成独立的.c.h文件
二、连线
TB6612 | STM32 |
PWMA | PA7 |
PWMB | PA6 |
AIN1 | PB12 |
AIN2 | PB13 |
BIN1 | PB14 |
BIN2 | PB15 |
三、代码
写一个Motor文件,里面包含一些函数,配置引脚高低电平以及通过设置比较寄存器来调控车速
Motor.C
#include "stm32f1xx_hal.h"
#include "tim.h"
void Motor_LeftSetSpeed(int8_t speed)
{
if(speed>0)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET);
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,speed);
}else if(speed<0)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_RESET);
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,-speed);
}else
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_SET);
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,speed);
}
}
void Motor_RightSetSpeed(int8_t speed)
{
if(speed>0)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET);
__HAL_TIM_SET_COMPARE(&htim3 ,TIM_CHANNEL_2,speed);
}else if(speed<0)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_RESET);
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,-speed);
}else
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_SET);
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,speed);
}
}
void Go_Ahead()
{
Motor_LeftSetSpeed(70);
Motor_RightSetSpeed(70);
}
void Go_Back()
{
Motor_LeftSetSpeed(-70);
Motor_RightSetSpeed(-70);
}
void Turn_Left()
{
Motor_LeftSetSpeed(0);
Motor_RightSetSpeed(70);
}
void Turn_Right()
{
Motor_LeftSetSpeed(70);
Motor_RightSetSpeed(0);
}
void Self_Left()
{
Motor_LeftSetSpeed(-70);
Motor_RightSetSpeed(70);
}
void Self_Right()
{
Motor_LeftSetSpeed(70);
Motor_RightSetSpeed(-70);
}
void Car_Stop()
{
Motor_LeftSetSpeed(0);
Motor_RightSetSpeed(0);
}
Motor.h
#ifndef __MOTOR_H__
#define __MOTOR_H__
#include "stm32f1xx_hal.h"
#include "tim.h"
void Motor_LeftSetSpeed(int8_t speed);
void Motor_RightSetSpeed(int8_t speed);
void Go_Ahead();
void Go_Back();
void Turn_Left();
void Turn_Right();
void Self_Left();
void Self_Right();
void Car_Stop();
#endif
在main.c里加入头文件
/* USER CODE BEGIN Includes */
#include "Motor.h"
/* USER CODE END Includes */
开启PWM的两个通道,在while循环里调用Go_Ahead();即可驱动小车
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM3_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
// __HAL_TIM_SET_COUNTER(&htim3, 100);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
// HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_SET);
// HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET);
Go_Ahead();
HAL_Delay(20);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}