电子说
DRV8833该器件具有两个H桥驱动器,能够驱动两部直流刷式电机、 一部双极步进电机、多个螺线管或其他感性负载。每个H桥的输出驱动器模块由配置为H桥的N沟道功率MOSFET组成,用于驱动电机绕组。每个H桥均具备调节或限制绕组电流的电路。该器件利用故障输出引脚实现内部关断功能,提供过流保护、短路保护、欠压锁定和过热保护。
TB6612FNG是一款双路直流电机驱动芯片。它采用H桥设计,可独立驱动两路直流电机或一台步进电机,适用于机器人、小型智能车等项目。该芯片支持正反转、刹车和待机功能,具有高效率、低功耗的特点。TB6612FNG可提供MAX每通道1.2A的连续电流和高达3.2A的峰值电流,工作电压范围广,且集成了过热和欠压保护, 广泛应用于嵌入式控制系统中。
| DRV8833 | TB6612FNG |
|---|---|
| 双H桥电机驱动器:可驱动两个直流电机或一个双极步进电机 | 双H桥电机驱动器:可驱动两个直流电机或一个双极步进电机 |
| 工作电压:2.7 V 至 10.8 V | 工作电压:4.5 V 至 13.5 V |
| 输出电流:每个电机1.2 A连续(2 A峰值) | 输出电流:每通道1A连续(3A峰值) |
| 电机输出可以并联,为单个电机连续输出2.4 A | 电机输出可以并联,为单个电机连续输出2 A |
| 输入支持3V和5V接口 | 逻辑电压(VCC):2.7 V 至 5.5 V |
| 低压锁定及对过电流和过热的保护 | 最大PWM频率:100 kHz |
| DRV8833 | |
|---|---|
| VM | 逻辑电源和电机电源,电压范围:2.7V-10.8V |
| GND | 接地 |
| STBY | 待机控制,低电平或悬空有效,接高电平工作 |
| NC | 空脚 |
| AIN1-2 | 电机A逻辑输入,控制方向和转速 |
| BIN1-2 | 电机B逻辑输入,控制方向和转速 |
| AO1-2 | 电机A输出 |
| BO1-2 | 电机B输出 |
| TB6612FNG | |
|---|---|
| VCC | 逻辑电源,电压范围:2.7V-5.5V |
| VM | 电机电源,电压范围:4.5V-13.5V |
| GND | 接地 |
| STBY | 待机控制,低电平或悬空有效,接高电平工作 |
| PWMA | 通道A的PWM输入,控制电机A转速 |
| AIN1-2 | 电机A逻辑输入,控制方向 |
| PWMB | 通道B的PWM输入,控制电机B转速 |
| BIN1-2 | 电机B逻辑输入,控制方向 |
| AO1-2 | 电机A输出 |
| BO1-2 | 电机B输出 |
TB6612FNG的特别说明:PWMA,PWMB引脚就是一个使能引脚,如果不需要调速,可将这两个引脚直接接高电平使能,逻辑输入接高低电平,实现纯硬件控制驱动。
当TB6612FNG的PWMA,PWMB接高电平时,硬件逻辑驱动与DRV8833逻辑驱动一样。注意:STBY需要接高电平才能正常工作。
逻辑驱动:
| xIN1 | xIN2 | 功能 |
|---|---|---|
| H | H | 制动 / 慢速衰减 |
| H | L | 正转 |
| L | H | 反转 |
| L | L | 滑行 / 快速衰减 |
从机械的角度说明:制动是指电机立即刹车,快速停止。而滑行是指电机靠惯性自由滑行,缓慢停下。
DRV8833的PWM调速:
| xIN1 | xIN2 | 功能 |
|---|---|---|
| PWM | L | 正转PWM,快速衰减 |
| H | PWM | 正转PWM,快速衰减 |
| L | PWM | 反转PWM,慢速衰减 |
| PWM | H | 反转PWM,慢速衰减 |
而TB6612FNG的调速,是根据PWMA/B引脚控制调速,xIN1-2控制方向。与L298N模块类似。
这里以控制TB6612FNG驱动为例。注意:TB6612FNG模块是没有过流保护功能,使用时需要加限流和散热,否则可能烧坏模块或电机。
STM32F103C8T6最小系统板,TB6612FNG模块,直流电机。
| STM32F103C8T6 | TB6612FNG |
|---|---|
| PA0 | AIN1 |
| PA1 | AIN2 |
| PA2 | BIN1 |
| PA3 | BIN2 |
| PA6 | PWMA |
| PA7 | PWMB |
| AO1-2 | 电机1 |
| AO1-2 | 电机2 |
| 5V | VCC与STBY |
| 电机电源 | VM |
| 共地 | GND |

其工作原理,可参考这篇文章[https://blog.csdn.net/qq_42250136/article/details/144696271?],这里就不再赘述。
STM32F103C8T6最小系统板,TB6612FNG模块,两相四线步进电机。
| STM32F103C8T6 | TB6612FNG |
|---|---|
| PA0 | AIN1 |
| PA1 | AIN2 |
| PA2 | BIN1 |
| PA3 | BIN2 |
| AO1-2 | 步进电机A相 |
| AO1-2 | 步进电机B相 |
| 5V | VCC与STBY,以及PWMA/B |
| 电机电源 | VM |
| 共地 | GND |

TB6612FNG_DRV8833.c
#include "tb6612_8833.h"
#include "delay.h"
#include "timer.h"
void TB6612_8833_Init(void)
{
//通过旋转编码器控制步进电机正转,翻转,加减速,停止
GPIO_InitTypeDef GPIO_InitStructurn;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructurn.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructurn.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructurn.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructurn);
}
void Motor1_Stop(void) //电机1停止
{
IN1(0); IN2(0);
}
void Motor2_Stop(void) //电机2停止
{
IN3(0); IN4(0);
}
void ALL_Stop(void) //两个电机全停止
{
IN1(0); IN2(0); IN3(0); IN4(0);
}
void Motor1_Zturn(void) //电机1正转
{
IN1(1); IN2(0);
}
void Motor1_Rturn(void) //电机1反转
{
IN1(0); IN2(1);
}
void Motor2_Zturn(void) //电机2正转
{
IN3(1); IN4(0);
}
void Motor2_Rturn(void) //电机2反转
{
IN3(0); IN4(1);
}
void Motor_Single4(uint8_t temp) //单4拍
{
switch (temp)
{
case 1: IN1(1);IN2(0);IN3(0);IN4(0); break;
case 2: IN1(0);IN2(1);IN3(0);IN4(0); break;
case 3: IN1(0);IN2(0);IN3(1);IN4(0); break;
case 4: IN1(0);IN2(0);IN3(0);IN4(1); break;
}
}
void Motor_Double4(uint8_t temp) //双4拍
{
switch (temp)
{
case 1: IN1(0);IN2(1);IN3(1);IN4(0); break;
case 2: IN1(0);IN2(1);IN3(0);IN4(1); break;
case 3: IN1(1);IN2(0);IN3(0);IN4(1); break;
case 4: IN1(1);IN2(0);IN3(1);IN4(0); break;
}
}
void Motor_Corotation(uint8_t temp) //正转
{
switch (temp)
{
case 1: IN1(1);IN2(0);IN3(0);IN4(0); break;
case 2: IN1(1);IN2(0);IN3(1);IN4(0); break;
case 3: IN1(0);IN2(0);IN3(1);IN4(0); break;
case 4: IN1(0);IN2(1);IN3(1);IN4(0); break;
case 5: IN1(0);IN2(1);IN3(0);IN4(0); break;
case 6: IN1(0);IN2(1);IN3(0);IN4(1); break;
case 7: IN1(0);IN2(0);IN3(0);IN4(1); break;
case 8: IN1(1);IN2(0);IN3(0);IN4(1); break;
}
}
void Motor_Reverse(uint8_t temp) //反转
{
switch (temp)
{
case 1: IN1(1);IN2(0);IN3(0);IN4(1); break;
case 2: IN1(0);IN2(0);IN3(0);IN4(1); break;
case 3: IN1(0);IN2(1);IN3(0);IN4(1); break;
case 4: IN1(0);IN2(1);IN3(0);IN4(0); break;
case 5: IN1(0);IN2(1);IN3(1);IN4(0); break;
case 6: IN1(0);IN2(0);IN3(1);IN4(0); break;
case 7: IN1(1);IN2(0);IN3(1);IN4(0); break;
case 8: IN1(1);IN2(0);IN3(0);IN4(0); break;
}
}
main.c
#include "stm32f10x.h" // Device header
#include "encoder.h"
#include "tb6612_8833.h"
#include "timer.h"
#include "delay.h"
#include "pwm.h"
#include "key.h"
#include "oled.h"
int32_t RxData = 500;
uint8_t MotorStart = 0;
uint8_t step, KeyNum;
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Key_Init();
TB6612_8833_Init();
Encoder_Init();
Timer_Inti();
PWM_Init();
OLED_Init();
while(1)
{
RxData +=Encoder_Get();
if(RxData <= 0) RxData = 0;
if(RxData >= 1000) RxData = 1000;
//直流电机驱动
if(Key_Get()) MotorStart = !MotorStart;
OLED_ShowNum(1,1,MotorStart,2);
if(MotorStart)
{
//直流电机控制正反转,调速
TIM_SetCompare1(TIM3,RxData);
if(Encoder_GetKey() == 0)
{
Motor1_Zturn();
Motor2_Zturn();
}else{
Motor1_Rturn();
Motor2_Rturn();
}
}else{
ALL_Stop();
}
//步进电机驱动
// switch(Encoder_GetKey())
// {
// case 0:
// Motor_Corotation(step);
// delay_ms(100);
// break;
// case 1:
// Motor_Reverse(step);
// delay_ms(100);
// break;
// }
}
}
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)
{
step++;
KeyNum++;
if(KeyNum >= 20)
{
Key_Loop();
KeyNum = 0;
}
if(step > 8)
{
step = 1;
}
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
}
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !