1. 模块简介
TB6612FNG 是 STM32 嵌入式系统中常用的 电机驱动模块 ,广泛用于 机器人控制、电动工具驱动、自动化设备 等领域。
在实际项目开发中,TB6612FNG 具有如下典型用途:
- 机器人控制系统:驱动电动小车、机械臂等。
- 自动化设备控制:驱动传送带、自动化门等。
- DIY 项目:适用于 Arduino 或树莓派等开发平台,帮助开发者实现高效的电机控制。

2. 原理解析
2.1 硬件工作原理
TB6612FNG 模块通过接收来自微控制器(如 STM32)的 PWM 信号控制直流电机的转速,并通过输入引脚控制电机的转动方向。模块依赖于 PWM 调速原理 和 电平控制原理 工作。通过 PWM 信号调节占空比来控制电机速度,方向控制则通过输入引脚的电平变化(高电平/低电平)实现。
2.2 电路连接示意


说明:
- GPIO 配置:PA4 和 PA5 配置为推挽输出,用于控制电机的转向;PA2 配置为 PWM 输出,用于调节电机的转速。
- 电阻、滤波:在设计时,可以加上电流限制电阻,确保驱动模块的稳定性。

3. 外设配置思路
3.1 涉及外设资源
外设名称 | 用途说明 |
---|---|
GPIO | 控制电机的转向和PWM信号 |
定时器(TIM) | 生成PWM信号,控制电机转速 |
电源管理 | 提供模块和电机所需的电压 |
3.2 配置步骤概述
- 开启相关外设时钟:开启 GPIO 和定时器时钟。
- 配置 IO 模式:设置 PA4 和 PA5 为推挽输出,PA2 为复用推挽输出。
- 配置 PWM 信号:通过定时器生成 PWM 信号,并将其输出到 PA2。
- 调用初始化函数应用配置:初始化 GPIO 和定时器,启动电机驱动模块。
4. 标准库驱动代码
4.1 头文件引用
c
#include "stm32f10x.h"
4.2 初始化函数
c
void Motor_Init(void) {
// 开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 开启 GPIOA 时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 开启 TIM2 时钟
// GPIO 初始化
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5; // PA4 和 PA5 为推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化 PA4 和 PA5
// PWM 初始化
PWM_Init();
}
void PWM_Init(void) {
// TIM2 时基单元配置
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_Prescaler = 36 - 1; // 预分频
TIM_TimeBaseInitStructure.TIM_Period = 100 - 1; // 设定周期为 100
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); // 应用配置
// PWM 输出通道配置
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0; // 初始占空比为 0
TIM_OC3Init(TIM2, &TIM_OCInitStructure); // 配置 TIM2 的通道 3
// 启动定时器
TIM_Cmd(TIM2, ENABLE); // 启动 TIM2 定时器
}
4.3 控制电机速度与方向
c
void Motor_SetSpeed(int8_t Speed) {
if (Speed >= 0) { // 正转
GPIO_SetBits(GPIOA, GPIO_Pin_4); // PA4 高电平
GPIO_ResetBits(GPIOA, GPIO_Pin_5); // PA5 低电平
PWM_SetCompare3(Speed); // 设置 PWM 输出的占空比
} else { // 反转
GPIO_ResetBits(GPIOA, GPIO_Pin_4); // PA4 低电平
GPIO_SetBits(GPIOA, GPIO_Pin_5); // PA5 高电平
PWM_SetCompare3(-Speed); // 设置 PWM 输出的占空比
}
}
4.4 主函数范例
c
int main(void) {
Motor_Init(); // 初始化电机
while (1) {
// 根据需要调整电机速度
Motor_SetSpeed(50); // 设置电机速度为 50
// 其他操作
}
}
5. 应用扩展建议
拓展功能 | 实现说明或应用场景 |
---|---|
电机方向控制 | 通过控制 AIN1 和 AIN2 的电平,实现电机正反转。 |
多个电机控制 | 通过扩展 TB6612FNG 模块,控制更多电机。 |
PWM 控制 | 根据需求调整 PWM 的占空比,实现电机精确速度控制。 |
6. 常见问题与调试建议
问题现象 | 排查与解决建议 |
---|---|
电机不转动 | 检查电源连接、电压范围是否合适,确保 PWM 信号输出正确。 |
电机转速不稳定 | 检查 PWM 信号占空比,确保定时器配置正确,且没有干扰。 |
电流过大 | 检查电机负载,确认电源和电机匹配,可能需要加装限流电阻。 |
结语
TB6612FNG 电机驱动模块 是嵌入式开发中非常重要的模块,广泛应用于机器人控制和自动化设备中。掌握该模块的使用,不仅可以有效控制电机的速度和方向,还可以为后续的系统设计提供强大的支持。通过掌握其原理和标准库驱动,你可以快速实现复杂的电机控制任务。