定义:
TB6612FNG是一款直流电机驱动器件,它具有大电流MOSFET-H桥结构,双通道电路输出,可同时驱动2个电机。
TB6612FNG每通道输出最高1.2 A的连续驱动电流,启动峰值电流达2A/3.2 A(连续脉冲/单脉冲);
4种电机控制模式:
正转/反转/制动/停止;PWM支持频率高达100 kHz;
功能引脚图:
**
逻辑真值表
使用说明:
TB6612FNG的主要引脚功能:AINl/AIN2、BIN1/BIN2、PWMA/PWMB为控制信号输入端;
:这里的几个引脚接stm32开发板上的GPIO口
即将GPIO口初始化为输出,并通过定时器输出两路pwm接到6612上。
AO1/A02、B01/B02为2路电机控制输出端;
;:A,B两路分别控制两个直流电机
STBY为正常工作/待机状态控制引脚;
VM(4.5~15 V)和VCC(2.7~5.5 V)分别为电机驱动电压输入和逻辑电平输入端。
:VM引脚接12v直流电源,VCC接stm32板上的VCC。
**
实物图
基于上述内容,我画了一个计算机电机单元控制图,如下:
**
软件实现部分
接下来就开始着手连接Stm32与TB6612模块:
首先我们需要完成软件上的支持,即控制stm32输出pwm信号与驱动电机信号。我用的是keil5来编写程序。
通过查阅资料,pwm信号可以通过GPIOB端口的pb6和pb7输出,因此我选择了用GPIOB口做为输出。用pb1,pb2,pb3,pb4做为控制电机驱动信号。以下是代码实现:
void tim4_pwm_init(u16 arr,u16 psc)
{
RCC->APB1ENR |= 1<<2; //时钟复位TIM4
TIM4->CR1=0x0080; //ARPE 使能,Timx_ARR寄存器被装入缓冲器
TIM4->CR1|=0x01; //使能定时器 4
RCC->APB2ENR |= 1<<3; //时钟使能GPIOB 由电路图知GPIO6和TIM4的通道一复用
GPIOB->CRL&=0X00F00000;
GPIOB->CRL|=0XBB033333; //pb6 7复用功能输出 PB6输出ch1,pb7输出ch2
TIM4->ARR = arr; //设置计数器自动重装载值
TIM4->PSC = psc; //预分频器设计
TIM4->CCMR1 =0X6060; //配置Tim4输入捕获模式
TIM4->CCMR1|=1<<3; //CH1 预装载使能
TIM4->CCMR1|=1<<11; //CH 2 预装载使能
TIM4->CCER |=1<<0; //OC1 输出使能
TIM4->CCER |=1<<4; //OC2 输出使能
}
这里用到的寄存器全部可以在stm32中文手册里查到。
将GPIOB口和TIM4定时器配置完后,然后写了电机的驱动函数,如下:
```void go(int pwmnum)
{
GPIOB->ODR&=(~1<<3);//pb3
GPIOB->ODR|=1<<2;//pb2
GPIOB->ODR&=~(1<<1); //pb1
GPIOB->ODR|=1<<4; //pb4
MOTOR_Pwm_Valu=pwmnum;
MOTOR_Pwm_Valu2=pwmnum;
}
至此基本代码编写已经完成,我们只需要在主函数里调用go()函数,用过改变pwmnum的值就可以改变电机速度了。
#include "sys.h"
#include "pwm.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "key.h"
int main(void)
{
Stm32_Clock_Init(9);//系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口初始化
LED_Init(); //初始化与LED连接的硬件接口
tim4_pwm_init(899,0);
KEY_Init();
LED0=0; //点亮LED
while(1)
{
go(5000);//在这里改变参数值
}
}
成果图
还请大佬们指出不足之处。