一、TB6612FNG
TB6612是一个支持双电机的驱动模块,支持PWM调速。PWMA、AIN1、AIN2 为一组控制引脚,PWMA 为 PWM 速度控制引脚,AIN1、AIN2 为方向控制引脚;PWMB、BIN1、BIN2 为一组控制引脚,PWMB 为 PWM 速度控制引脚,BIN1、BIN2 为方向控制引脚。
PA4 --> BIN1 PA5 --> BIN2 PA6 --> AIN2 PA7 --> AIN1 TIM2_CH2(PA1) --> PWMA TIM2_CH3(PA2) --> PWMB
驱动电机的 PWM 频率一般 10kHz(0.0001ms)左右,72MHZ/72/100=72000000/7200=10000HZ=10KHZ
二、CUbeMX配置
SYS
RCC
时钟树
GPIO配置
定时器配置
生成工程
生成代码
三、Keil代码
添加PWM电机驱动代码
/* USER CODE BEGIN 0 */ void motorControlL(uint8_t direction, uint16_t speed) {//左电机驱动 HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3); /* 根据方向设置 IN1 和 IN2 引脚 */ HAL_GPIO_WritePin(GPIOA, BIN1_Pin, (direction & 0x01)); HAL_GPIO_WritePin(GPIOA, BIN2_Pin, ((direction & 0x01) ^ 0x01)); /* 设置 PWM 引脚以控制速度 */ __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, speed); } void motorControlR(uint8_t direction, uint16_t speed) {//右电机驱动 HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2); /* 根据方向设置 AIN1 和 IN2 引脚 */ HAL_GPIO_WritePin(GPIOA, AIN2_Pin, (direction & 0x01)); HAL_GPIO_WritePin(GPIOA, AIN1_Pin, ((direction & 0x01) ^ 0x01)); /* 设置 PWM 引脚以控制速度 */ __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, speed); } /* USER CODE END 0 */
while循环中红外光电逻辑判断
/* USER CODE BEGIN WHILE */ while (1) { if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8)== 1 && HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_9)== 1 ){ motorControlL(1, 300); //第一个参数 0反向转 1正向转 第二个参数控制小车速度 motorControlR(1, 300); } if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8)==0 && HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_9)==0){ motorControlL(0, 0); motorControlR(0, 0); } if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8)==0 && HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_9)==1){ motorControlL(1, 180); motorControlR(1, 300); } if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8)==1 && HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_9)==0){ motorControlL(1, 300); motorControlR(1, 180); } /* USER CODE END WHILE */
效果
car
链接: https://pan.baidu.com/s/1xOMmcG4KKbLN1cJ1ZK-zaQ?pwd=3h3k 提取码: 3h3k