STM32F103C8T6实战:手把手教你搭建扫地机器人电机驱动电路(附TB6612FNG配置)

张开发
2026/4/13 9:48:47 15 分钟阅读

分享文章

STM32F103C8T6实战:手把手教你搭建扫地机器人电机驱动电路(附TB6612FNG配置)
STM32F103C8T6实战手把手教你搭建扫地机器人电机驱动电路附TB6612FNG配置在智能家居设备中扫地机器人因其自动化清洁能力而广受欢迎。作为其核心部件电机驱动系统的稳定性和精确性直接决定了机器人的运动性能。本文将基于STM32F103C8T6微控制器和TB6612FNG电机驱动芯片详细讲解如何构建一个高效可靠的电机驱动电路。1. 硬件选型与电路设计1.1 核心器件介绍STM32F103C8T6作为一款性价比极高的ARM Cortex-M3内核微控制器具备丰富的外设资源72MHz主频满足实时控制需求多达7个定时器其中4个支持PWM输出丰富的GPIO接口便于扩展TB6612FNG是一款双通道H桥电机驱动芯片主要特性包括最大输出电流1.2A单通道工作电压范围2.5-13.5V内置过热保护和低压检测电路1.2 电路连接方案完整的电机驱动系统包含以下关键连接模块STM32引脚TB6612FNG引脚功能说明PWM控制PA6 (TIM3_CH1)PWMA左电机PWM信号方向控制PB3AIN1左电机方向控制1方向控制PB4AIN2左电机方向控制2PWM控制PA7 (TIM3_CH2)PWMB右电机PWM信号方向控制PB5BIN1右电机方向控制1方向控制PB6BIN2右电机方向控制2电源-VM电机电源(5-12V)地线GNDGND共地连接提示实际布线时建议在PWM信号线上串联22Ω电阻并并联100pF电容到地以抑制信号反射和高频噪声。2. STM32外设配置2.1 GPIO初始化首先配置方向控制引脚为推挽输出模式// 方向控制引脚初始化 void GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct {0}; // 使能GPIOB时钟 __HAL_RCC_GPIOB_CLK_ENABLE(); // 配置PB3,PB4,PB5,PB6为推挽输出 GPIO_InitStruct.Pin GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6; GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull GPIO_NOPULL; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, GPIO_InitStruct); // 初始状态设为停止 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6, GPIO_PIN_RESET); }2.2 PWM定时器配置TIM3用于生成两路PWM信号关键配置参数如下// TIM3 PWM初始化 void PWM_Init(void) { TIM_HandleTypeDef htim3; TIM_OC_InitTypeDef sConfigOC {0}; // 定时器基础配置 htim3.Instance TIM3; htim3.Init.Prescaler 720-1; // 72MHz/720 100kHz htim3.Init.CounterMode TIM_COUNTERMODE_UP; htim3.Init.Period 100-1; // PWM周期1ms(1kHz) htim3.Init.ClockDivision TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Init(htim3); // 通道1配置(PA6) sConfigOC.OCMode TIM_OCMODE_PWM1; sConfigOC.Pulse 0; // 初始占空比0% sConfigOC.OCPolarity TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(htim3, sConfigOC, TIM_CHANNEL_1); // 通道2配置(PA7) HAL_TIM_PWM_ConfigChannel(htim3, sConfigOC, TIM_CHANNEL_2); // 启动PWM输出 HAL_TIM_PWM_Start(htim3, TIM_CHANNEL_1); HAL_TIM_PWM_Start(htim3, TIM_CHANNEL_2); }3. 电机控制逻辑实现3.1 基本控制函数根据TB6612FNG的真值表我们可以实现以下控制函数// 电机方向控制枚举 typedef enum { MOTOR_STOP 0, MOTOR_CW, // 顺时针 MOTOR_CCW // 逆时针 } Motor_Dir; // 左电机控制 void LeftMotor_Control(Motor_Dir dir, uint8_t speed) { switch(dir) { case MOTOR_CW: HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET); break; case MOTOR_CCW: HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET); break; default: // STOP HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3 | GPIO_PIN_4, GPIO_PIN_RESET); } __HAL_TIM_SET_COMPARE(htim3, TIM_CHANNEL_1, speed); } // 右电机控制(类似实现)3.2 运动控制算法实现基本的差速转向控制// 机器人运动控制 void Robot_Move(int8_t linear, int8_t angular) { // 计算左右轮速度 int16_t left_speed linear - angular; int16_t right_speed linear angular; // 限幅处理 left_speed (left_speed 100) ? 100 : (left_speed -100) ? -100 : left_speed; right_speed (right_speed 100) ? 100 : (right_speed -100) ? -100 : right_speed; // 设置电机方向和速度 if(left_speed 0) { LeftMotor_Control(MOTOR_CW, left_speed); } else { LeftMotor_Control(MOTOR_CCW, -left_speed); } if(right_speed 0) { RightMotor_Control(MOTOR_CW, right_speed); } else { RightMotor_Control(MOTOR_CCW, -right_speed); } }4. 系统调试与优化4.1 常见问题排查在实际调试中可能会遇到以下典型问题电机不转动检查VM电源是否正常建议用示波器观察确认STM32的PWM信号输出频率和占空比测量TB6612FNG的STBY引脚是否为高电平电机转动方向相反交换AIN1/AIN2或BIN1/BIN2的连接或者在软件中反转方向控制逻辑电机抖动或转速不稳定检查电源滤波电容建议在VM和GND之间并联100μF电解电容和0.1μF陶瓷电容降低PWM频率可尝试500Hz-1kHz范围增加电机端的续流二极管4.2 性能优化建议电流检测在电机回路中串联0.1Ω采样电阻通过运放放大后接入STM32的ADC实现过流保护温度监测利用STM32内部温度传感器或外接NTC监测系统工作温度能耗优化在直线行驶时进入滑行模式设置TB6612FNG为高阻态降低功耗// 滑行模式实现 void Motor_Coast(void) { // 设置方向引脚为高阻态 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6, GPIO_PIN_RESET); // 将GPIO配置为模拟输入高阻态 GPIO_InitTypeDef GPIO_InitStruct {0}; GPIO_InitStruct.Pin GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6; GPIO_InitStruct.Mode GPIO_MODE_ANALOG; HAL_GPIO_Init(GPIOB, GPIO_InitStruct); }通过以上完整的实现方案开发者可以构建一个响应迅速、运行稳定的扫地机器人电机驱动系统。在实际项目中建议根据具体电机参数进一步优化PWM频率和加减速曲线以获得最佳的运动性能。

更多文章