一、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