STM32外设系列—TB6612FNG

简介: 本文简单介绍了TB6612FNG,给出了接线方法和控制逻辑。最后,给出了程序设计,利用串口调节占空比来调节电机转速。


🎀 文章作者:二土电子
🐸 期待大家一起学习交流!


本文涉及到定时器和串口的知识,详细内容可见博主STM32速成笔记专栏

一、TB6612简介

TB6612FNG是东芝半导体的一款驱动电机的IC。一个TB6612FNG可以驱动两个电机,每一个驱动都有两个逻辑输入引脚,一个输出引脚和一个PWM引脚。可以通过给两个逻辑输入引脚不同的电平来控制电机的运行状态,通过PWM输入引脚实现电机调速。TB6612FNG还具有以下特点

  • 电源电压最大可到15V
  • 输出电流最大可达3.2A
  • 内置热停机电路和低压检测电路
  • 有正转,反转,短制动和停止四种模式

3768b670ed38638a823e7d5c2336c96f_d72bcaa6ccc14796b01eee5f824b3cc8.jpeg

二、TB6612使用方法

2.1 TB6612引脚连接

引脚 连接
PWMA A通道的PWM输入
AIN2 A通道逻辑输入2引脚
AIN1 A通道逻辑输入1引脚
STBY 待机引脚,接低电平处于待机模式,接高电平开始工作
BIN1 B通道逻辑输入1引脚
BIN2 B通道逻辑输入2引脚
PWMB B通道PWM输入引脚
GND
VM 电源输入正极,最大接15V
VCC 逻辑电源正极,接3.3V
AO1 A通道输出1引脚
AO2 A通道输出2引脚
BO2 B通道输出2引脚
BO1 B通道输出1引脚

使用时VM接电机电源的正极,GND接电机电源的负极。IN1和IN2接逻辑输入,PWM接PWM输出引脚。O1和O2接电机的正负极。

2.2 控制逻辑

IN1和IN2的高低电平状态对应不同的电机运行状态,二者的对应关系如下

image.png

上述的正反转是AO1接电机正极,AO2接电机负极的对应关系。

2.3 电机调速

电机调速的远离比较简单,只需要给TB6612FNG的PWM输入引脚输入10KHz的PWM波。调节占空比即可调节转速。需要注意的是如果PWM配置的极性是低电平,那么设置占空比时的值越大,电机转速越低。相反,如果PWM配置的极性是高电平,那么设置占空比时的值越大,电机转速越高。

三、实战项目

3.1 项目简介

本项目比较简单,使用TB6612驱动一个12V减速电机。利用串口发送占空比,实现电机的调速。

3.2 初始化GPIO

初始化GPIO完成的工作是初始化逻辑控制引脚,程序如下

/*
 *==============================================================================
 *函数名称:Drv_MotorGpio_Init
 *函数功能:初始化Motor的GPIO
 *输入参数:无
 *返回值:无
 *备  注:这里只初始化了逻辑控制IO,PWM的IO在定时器配置PWM时初始化
 *==============================================================================
 */
void Drv_MotorGpio_Init (void)
{
   
    GPIO_InitTypeDef GPIO_InitStructure;   // 定义结构体
    // 开启时钟
    RCC_APB2PeriphClockCmd(MOTOR_GPIO_TIM,ENABLE);

    // 配置结构体
    GPIO_InitStructure.GPIO_Pin = MOTOR_GPIO_PIN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   // 推挽式输出
    GPIO_Init(MOTOR_GPIO, &GPIO_InitStructure);
}

宏定义如下

// 电机逻辑控制GPIO
#define MOTOR_GPIO_TIM   RCC_APB2Periph_GPIOC
#define MOTOR_GPIO   GPIOC
#define MOTOR_GPIO_PIN   GPIO_Pin_7 | GPIO_Pin_8

3.3 PWM初始化

PWM初始化程序如下

/*
 *==============================================================================
 *函数名称:TIM2_CH1_PWM_Init
 *函数功能:初始化定时器2的PWM通道1
 *输入参数:per:自动重装载值;psc:预分频系数
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void TIM2_CH1_PWM_Init (u16 per,u16 psc)
{
   
    // 结构体定义
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;

    // 开启时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);

    // 初始化GPIO
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   // 复用推挽输出
    GPIO_Init(GPIOA,&GPIO_InitStructure);

    // 初始化定时器参数
    TIM_TimeBaseInitStructure.TIM_Period = per;   // 自动装载值
    TIM_TimeBaseInitStructure.TIM_Prescaler = psc;   // 分频系数
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;   // 设置向上计数模式
    TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);    

    // 初始化PWM参数
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;   // 比较输出模式
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;   // 输出极性
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   // 输出使能
    TIM_OC1Init(TIM2,&TIM_OCInitStructure);   // 输出比较通道1初始化

    TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);   // 使能TIMx在 CCR1 上的预装载寄存器
    TIM_ARRPreloadConfig(TIM2,ENABLE);   // 使能预装载寄存器

    TIM_Cmd(TIM2,ENABLE);   // 使能定时器    
}

初始化时配置如下,配置为10KHz

    TIM2_CH1_PWM_Init(1000,71);   // 初始化PWM

3.4 电机控制程序

电机正反转和停止控制程序如下

/*
 *==============================================================================
 *函数名称:Med_Motor_Go
 *函数功能:电机正转
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void Med_Motor_Go (void)
{
   
    MOTOR_IN1 = 1;
    MOTOR_IN2 = 0;
}
/*
 *==============================================================================
 *函数名称:Med_Motor_Stop
 *函数功能:电机停转
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void Med_Motor_Stop (void)
{
   
    MOTOR_IN1 = 0;
    MOTOR_IN2 = 0;
}
/*
 *==============================================================================
 *函数名称:Med_Motor_Reverse
 *函数功能:电机反转
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void Med_Motor_Reverse (void)
{
   
    MOTOR_IN1 = 0;
    MOTOR_IN2 = 1;
}

宏定义如下

// 电机逻辑控制引脚
#define MOTOR_IN1   PCout(7)
#define MOTOR_IN2   PCout(8)

3.5 串口接收处理函数

串口需要根据接收到的占空比来配置输出PWM的占空比,配置占空比使用的库函数是

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1)

串口只支持输入大于100小于1000的占空比,串口接收处理程序如下

/*
 *==============================================================================
 *函数名称:USART1_IRQHandler
 *函数功能:USART1中断服务函数
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
u32 gReceCount = 0;   // 接收计数变量
u32 gClearCount = 0;   // 清空接收数组计数变量
u8 gReceFifo[1500];   // 接收数组
u8 gReceEndFlag = 0;   // 接收完成标志位 

void USART1_IRQHandler(void)  
{
   
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)   //接收到一个字节  
    {
   
        gReceFifo[gReceCount++] = USART_ReceiveData(USART1);
    }
    else if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET)   //接收到一帧数据
    {
   
        USART1->SR;   // 先读SR
        USART1->DR;   // 再读DR

        gReceEndFlag = 1;   // 接收完成标志置1 
    } 
}
/*
 *==============================================================================
 *函数名称:Uart_Rece_Pares
 *函数功能:解析串口接收内容
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void Uart_Rece_Pares(void)   // 串口接收内容解析函数
{
   
    u16 pwmDuty = 0;   // 接收串口发送来的占空比

    if (gReceEndFlag  == 1)   // 如果接收完成
    {
   
        // 解析接收内容

        // 一位数
        if (gReceCount == 3)
        {
   
            pwmDuty = (gReceFifo[0] - 48);
        }
        else if (gReceCount == 4)
        {
   
            pwmDuty = (gReceFifo[0] - 48) * 10;
            pwmDuty = pwmDuty + (gReceFifo[1] - 48);
        }
        else if (gReceCount == 5)
        {
   
            pwmDuty = (gReceFifo[0] - 48) * 100;
            pwmDuty = pwmDuty + (gReceFifo[1] - 48) * 10;
            pwmDuty = pwmDuty + (gReceFifo[2] - 48);
        }

        printf ("duty=%d\r\n",pwmDuty);
        TIM_SetCompare1(TIM2,pwmDuty);

        // 清空接收数组
        for (gClearCount = 0;gClearCount < gReceCount;gClearCount ++)
        {
   
            gReceFifo[gClearCount] = ' ';
        }

        gReceEndFlag = 0;   // 清除接收完成标志位
        gReceCount = 0;   // 清零接收计数变量
    }
}
相关文章
|
8月前
|
传感器 芯片 内存技术
STM32F103标准外设库——认识STM32(一)
STM32F103标准外设库——认识STM32(一)
200 0
STM32F103标准外设库——认识STM32(一)
|
数据格式
STM32外设系列—红外遥控
本文详细介绍了红外通信的应用,原理。介绍了一种常用的二进制脉冲码形式。最后,给出了红外遥控的实现思路和程序设计。
445 2
STM32外设系列—红外遥控
|
传感器 芯片
STM32外设系列—HC-SR04(超声波)
本文主要介绍了超声波测距的原理,常用的超声波传感器。并且针对HC-SR04给出了使用思路和程序设计。最后,简单进行了思路拓展。
392 1
STM32外设系列—HC-SR04(超声波)
|
芯片
STM32外设系列—sg90(舵机)
本文介绍了什么是舵机,舵机的控制原理。以sg90为例,介绍了180°舵机的控制方法,给出了详细的程序设计。最后,介绍了360°舵机的控制方法。
2254 1
STM32外设系列—sg90(舵机)
|
7月前
|
开发者
【经典案例】使用HAL库配置STM32F407的SPI外设
在嵌入式系统开发中,STM32F407是一款广泛应用的微控制器,而SPI(Serial Peripheral Interface)是一种常用的通信接口。本文将详细介绍如何使用STM32的硬件抽象层(HAL)库配置STM32F407的SPI外设,并提供完整的代码示例。
706 1
|
存储 传感器 编解码
STM32外设系列—BH1750
本文详细介绍了BH1750的特点,原理图,IIC通信协议。给出了BH1750程序设计,能够实时获取周围环境光照强度。最后,给出了两种拓展应用,并说明了实现思路。
1383 0
STM32外设系列—BH1750
|
8月前
|
传感器 存储 缓存
STM32--MPU6050与I2C外设
STM32--MPU6050与I2C外设
200 1
|
8月前
stm32f4外设学习篇(代码集合)(三)
stm32f4外设学习篇(代码集合)
140 0
|
8月前
stm32f4外设学习篇(代码集合)(二)
stm32f4外设学习篇(代码集合)
|
8月前
|
芯片
stm32f4外设学习篇(代码集合)(一)
stm32f4外设学习篇(代码集合)
189 0