stm32教程:TB6612驱动 & 电机驱动风扇实验

早上好啊,大佬们。这一期咱们来评一评TB6612这一款驱动,简单好用,便宜耐造

请添加图片描述

前言

这里先给大伙提供一下代码例程文件 ——
链接:小白兔的礼物——tb6612驱动
提取码:tg58
解压密码:hbljdxbt

TB6612介绍

TB6612FNG 是一款常用的直流电机驱动模块,基于东芝公司的 TB6612FNG 芯片设计,专为控制小型直流电机或步进电机而开发。

在这里插入图片描述

在这里插入图片描述

模块特性

双通道驱动

可独立控制 2个直流电机 或 1个两相步进电机。

每个通道持续输出电流 1.2A(峰值 3.2A),适合中小功率电机。

宽电压范围

电机驱动电压:2.5V–13.5V(需匹配电机额定电压)。

逻辑控制电压:2.7V–5.5V(兼容 Arduino、STM32 等单片机)。

高效低功耗

内置 MOSFET 设计,效率高于传统驱动芯片(如 L298N),发热更少。

PWM 调速支持

通过 PWM 信号调节电机转速,支持高频 PWM(最高可达 100kHz)。

待机模式

通过 STBY 引脚控制芯片启停,低功耗待机时关闭电机输出。

引脚说明

在这里插入图片描述

电机控制端

引脚口功能
AIN1/AIN2控制 A 通道电机方向(如 AIN1=HIGH, AIN2=LOW 为正转)。
BIN1/BIN2控制 B 通道电机方向。
PWMA/PWMB接收 PWM 信号调节 A/B 通道速度。
VM接电机电源(2.5–13.5V),GND 为电源地。

逻辑控制端

引脚口功能
VCC接单片机逻辑电源(3.3V/5V)。
STBY高电平启用芯片,低电平进入待机模式。

使用说明

TB6612FNG 每个通道(A/B)内部包含一个 全H桥电路,由 4个 MOSFET 管 组成,通过开关组合控制电流方向,从而驱动电机正转或反转。

4个 MOSFET 分为两组(Q1-Q2 和 Q3-Q4),通过逻辑信号控制开关状态,形成不同的电流路径。
在这里插入图片描述
在这里插入图片描述

控制逻辑

输入输入输入输入输出输出模式状态
IN1IN2PWMSTBYO1O2
HHH/LHLL制动
LHHHLH反转
LHLHLL制动
HLHHHL正转
HLLHLL制动
LLHHOFFOFF停止
H/LH/LH/LLOFFOFF待机

代码编写

接线

tb6612stm32
PWMAPA0
AIN2PB0
AIN1PB1
STBY3V3
VM5 ~ 12V
VCC3V3
GNDGND
AO1电机正(不是stm32)
AO2电机负(不是stm32)

代码

timer.c 和 timer.h 这两个代码和前一期里的舵机里面的是一样的。
pwm.c 和 pwm.h 就是删掉了几个没用到的通道口,然后把 arr 的值改成了 100,psc的值改成了36。

PWM.c

#include "stm32f10x.h"                  // Device header
#include "Timer.h"
#include "PWM.h"

void PWM_Init(void)
{
	Timer_Init(100, 36);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);			//开启GPIOA的时钟
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);							//将PA0引脚初始化为复用推挽输出
																	//受外设控制的引脚,均需要配置为复用模式
	TIM_OCInitTypeDef TIM_OCInitStructure;							//定义结构体变量
	TIM_OCStructInit(&TIM_OCInitStructure);                         //结构体初始化,若结构体没有完整赋值
	                                                                //则最好执行此函数,给结构体所有成员都赋一个默认值
	                                                                //避免结构体初值不确定的问题
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;               //输出比较模式,选择PWM模式1
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;       //输出极性,选择为高,若选择极性为低,则输出高低电平取反
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   //输出使能
	TIM_OCInitStructure.TIM_Pulse = 0;								//初始的CCR值
	
	TIM_OC1Init(TIM2, &TIM_OCInitStructure);
}

void PWM_SetCompare1(uint16_t Compare)
{
	TIM_SetCompare1(TIM2, Compare);		//设置CCR2的值
}


PWM.h

#ifndef __PWM_H
#define __PWM_H

void PWM_Init(void);
void PWM_SetCompare1(uint16_t Compare);


#endif

motor.c

#include "stm32f10x.h"                  // Device header
#include "PWM.h"

void Motor_Init(void)
{
	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);		//开启GPIOB的时钟
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);						//将PB0和PB1引脚初始化为推挽输出	
	
	PWM_Init();													//初始化直流电机的底层PWM
}

void Motor_SetSpeed(int8_t Speed)
{
	if (Speed >= 0)							//如果设置正转的速度值
	{
		GPIO_SetBits(GPIOB, GPIO_Pin_0);	//PB0置高电平
		GPIO_ResetBits(GPIOB, GPIO_Pin_1);	//PB1置低电平
											//也就是设置方向为正转
		PWM_SetCompare1(Speed);				//PWM设置为速度值
	}
	else									//否则,即设置反转的速度值
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_0);	//PB0置低电平
		GPIO_SetBits(GPIOB, GPIO_Pin_1);	//PB1置高电平
											//也就是设置方向为反转
		PWM_SetCompare1(-Speed);			//PWM设置为负的速度值,因为此时速度值为负数,而PWM只能给正数
	}
}

motor.h

#ifndef __MOTOR_H
#define __MOTOR_H


void Motor_Init(void);
void Motor_SetSpeed(int Speed);


#endif

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Motor.h"

int speed = -100;

int main()
{
	Motor_Init();
	OLED_Init();//函数定义初始化
	OLED_ShowString(0, 0, "Speed:", OLED_8X16);
	OLED_Update();
	
	while(1)
	{
		OLED_ShowSignedNum(0, 16, speed, 3, OLED_8X16);
		OLED_Update();
		Motor_SetSpeed(speed);
		Delay_s(2);
		speed += 50;
		if (speed > 100) speed = -100;
	}
	
}

尾声

OK,本期的外设分享就到这里,大家可以直接使用我提供的例程,但还是建议大伙能学习一下这个模块,写一个属于自己的例程。

感谢大伙观看,别忘了三连支持一下

大家也可以关注一下我的其它专栏,同样精彩喔~

下期见咯~

请添加图片描述

<think>嗯,用户想找关于TB6612驱动12V风扇的HAL实现方法或代码示例。首先,我需要回忆一下TB6612的基本知识。TB6612是东芝的电机驱动芯片,可以控制两个直流电机或者一个步进电机,支持PWM调速。用户提到的是12V风扇,所以需要确认TB6612是否支持12V电压。根据之前的信息,TB6612的工作电压范围通常是2.5V到13.5V,所以12V应该没问题。 接下来,用户需要的是HAL库的实现,也就是基于STM32的硬件抽象层。HAL库的结构通常是初始化外设,比如GPIO和定时器来产生PWM信号。参考引用中的信息,比如引用[4]提到使用定时器3生成PWM,预分频72-1,自动重装载1000-1,生成1ms周期,占空比精度0.1%。这可以作为配置定时器的参考。 然后要考虑风扇的控制方式。直流风扇一般需要PWM调速,所以需要配置STM32的定时器输出PWM信号到TB6612的PWMA或PWMB引脚。同时,TB6612的AIN1、AIN2或BIN1、BIN2需要设置方向控制,可能用GPIO的高低电平来控制正反转或者停止。不过风扇通常只需要单向转动,所以可能只需要设置一个方向,另一个方向保持低电平。 需要检查引脚连接是否正确,比如VM接12V电源,VCC接逻辑电压(比如3.3V或5V),GND接地。然后STBY引脚需要使能,通常置高。然后AIN1和AIN2控制方向,比如AIN1高,AIN2低,或者反过来,但风扇可能只需要一个方向,所以固定设置其中一个为高,另一个为低。 HAL库的步骤应该是初始化GPIO,初始化定时器PWM,然后设置占空比。用户可能还需要处理风扇的启动和停止,以及调速。代码示例部分需要展示如何配置这些部分,比如使用CubeMX配置定时器和GPIO,然后在代码中启动PWM,调整占空比。 另外,用户可能遇到的问题比如电机不转,需要检查电源连接、PWM信号是否生成、STBY引脚是否使能、逻辑电平是否正确等。参考引用[1]和[2]中提到的问题,比如电机不转可能是因为STBY未使能,或者PWM配置错误。 最后,生成相关问题,可能涉及如何调节转速、如何实现正反转(虽然风扇可能不需要),或者如何优化PWM频率等。需要确保问题与用户的需求相关,并且帮助用户进一步了解TB6612的应用。</think>### TB6612驱动12V风扇的HAL实现方法 #### 1. 硬件连接 - **TB6612模块**: - `VM`:接12V电源(风扇供电) - `VCC`:接3.3V/5V(逻辑电压) - `GND`:共地连接 - `AIN1/AIN2`或`BIN1/BIN2`:接STM32 GPIO(控制方向) - `PWMA/PWMB`:接STM32定时器PWM输出引脚(控制转速) - `STBY`:接高电平(使能芯片) - **风扇接口**: - 连接至`AO1/AO2`或`BO1/BO2`(根据选择的电机通道) #### 2. CubeMX配置 1. **GPIO配置**: - 配置`AIN1`和`AIN2`为输出模式(例如`GPIO_PIN_0`和`GPIO_PIN_1`)。 - 配置`STBY`为输出高电平。 2. **定时器PWM配置**: - 选择定时器(如`TIM3`),配置PWM通道(如`Channel 1`)。 - 设置预分频系数(`Prescaler`)和自动重装载值(`Counter Period`)以生成合适频率的PWM波。例如: - 预分频系数:`72-1`(72MHz时钟下分频为1MHz) - 自动重装载值:`1000-1` → PWM频率 = $1MHz / 1000 = 1kHz$ [^4]。 #### 3. HAL库代码示例 ```c // 初始化PWM和GPIO(CubeMX自动生成) void MX_TIM3_Init(void); // 定时器初始化 void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); // PWM引脚初始化 // 启动风扇 HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); // 启动PWM // 设置转速(占空比0%~100%) __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 500); // 50%占空比 // 控制方向(单向风扇固定方向) HAL_GPIO_WritePin(AIN1_GPIO_Port, AIN1_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(AIN2_GPIO_Port, AIN2_Pin, GPIO_PIN_RESET); ``` #### 4. 关键注意事项 - **PWM频率选择**:风扇一般适配1kHz~20kHz,高频可降低噪音[^2]。 - **逻辑电平匹配**:确保TB6612的`VCC`与STM32电平一致(3.3V或5V)。 - **散热设计**:12V风扇电流较大时需加散热片或独立供电[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值