一、简介
RZ7889 是一款 DC 双向马达驱动电路,它适用于玩具等类的电机驱动、自 动阀门电机驱动、电磁门锁驱动等。它有两个逻辑输入端子用来控制电机前进、 后退及制动。该电路具有良好的抗干扰性,微小的待机电流、低的输出内阻,同时,他还具有内置二极管能释放感性负载的反向冲击电流。
二、特点
- 微小的待机电流,小于 2uA。
- 工作电压范围宽 3.0V~15V
- 有紧急停止功能 z 有过热保护功能
- 有过流嵌流及短路保护功能
- 封装外形为: SOP8
三、引脚功能
引脚名 | 引脚号 | 描述 |
BI | 1 | 后退输入 |
FI | 2 | 前进输入 |
GND | 3 | 地 |
Vcc | 4 | 电源 |
FO | 5,6 | 前进输出 |
BO | 7,8 | 后退输出 |
四、控制逻辑
因为本芯片用于小车的驱动较多,故直接展示小车的控制逻辑,下面的代码展示也是基于小车的代码:
FI | BI | FO | BO | 电机 |
1 | 0 | 1 | 0 | 正转 |
0 | 1 | 0 | 1 | 反转 |
1 | 1 | 0 | 0 | 停止 |
五、代码展示
这里只展示了电机的代码,因代码较长完整的代码放到了资源中,有需要自行下载。
最终效果:STM32单片机上电之后,实验效果小车前进1s,后退1s, 左转1s, 右转1s, 原地左旋1s, 原地右旋1s, 停止4s,然后循环以上步骤。
Motor.h
#ifndef __MOTOR_H
#define __MOTOR_H
#include "stm32f10x.h"
#include "bit_band.h"
// 小车的熄火/刹车宏定义
//-----------------------------------
#define CAR_FLAMEOUT 0 // 熄火
#define CAR_BREAK 1 // 刹车
//-----------------------------------
// 宏设置PA8~PA11、PB6~PB9管脚的输出状态
//-------------------------------------------------------------------------------------
// PA8模式配置
//----------------------------------------------------------------------------
// PA8:通用推挽输出
#define PA8_Out_PP { GPIOA->CRH&=0XFFFFFFF0; GPIOA->CRH|=(u32)0x01<<(0*4); }
// PA8:复用推挽输出
#define PA8_AF_PP { GPIOA->CRH&=0X0FFFFFF0; GPIOA->CRH|=(u32)0x09<<(0*4); }
//----------------------------------------------------------------------------
// PA9模式配置
//----------------------------------------------------------------------------
// PA9:通用推挽输出
#define PA9_Out_PP { GPIOA->CRH&=0XFFFFFF0F; GPIOA->CRH|=(u32)0x03<<(1*4); }
// PA9:复用推挽输出
#define PA9_AF_PP { GPIOA->CRH&=0XFFFFFF0F; GPIOA->CRH|=(u32)0x09<<(1*4); }
//----------------------------------------------------------------------------
// PA10模式配置
//----------------------------------------------------------------------------
// PA10:通用推挽输出
#define PA10_Out_PP { GPIOA->CRH&=0XFFFFF0FF; GPIOA->CRH|=(u32)0x01<<(2*4); }
// PA10:复用推挽输出
#define PA10_AF_PP { GPIOA->CRH&=0XFFFFF0FF; GPIOA->CRH|=(u32)0x09<<(2*4); }
//----------------------------------------------------------------------------
// PA11模式配置
//----------------------------------------------------------------------------
// PA11:通用推挽输出
#define PA11_Out_PP { GPIOA->CRH&=0XFFFF0FFF; GPIOA->CRH|=(u32)0x01<<(3*4); }
// PA11:复用推挽输出
#define PA11_AF_PP { GPIOA->CRH&=0XFFFF0FFF; GPIOA->CRH|=(u32)0x09<<(3*4); }
//----------------------------------------------------------------------------
// PB6模式配置
//----------------------------------------------------------------------------
// PB6:通用推挽输出
#define PB6_Out_PP { GPIOB->CRL&=0XF0FFFFFF; GPIOB->CRL|=(u32)0x01<<(6*4); }
// PB6:复用推挽输出
#define PB6_AF_PP { GPIOB->CRL&=0XF0FFFFFF; GPIOB->CRL|=(u32)0x09<<(6*4); }
//----------------------------------------------------------------------------
// PB7模式配置
//----------------------------------------------------------------------------
// PB7:通用推挽输出
#define PB7_Out_PP { GPIOB->CRL&=0X0FFFFFFF; GPIOB->CRL|=(u32)0x01<<(7*4); }
// PB7:复用推挽输出
#define PB7_AF_PP { GPIOB->CRL&=0X0FFFFFFF; GPIOB->CRL|=(u32)0x09<<(7*4); }
//----------------------------------------------------------------------------
// PB8模式配置
//----------------------------------------------------------------------------
// PB8:通用推挽输出
#define PB8_Out_PP { GPIOB->CRH&=0XFFFFFFF0; GPIOB->CRH|=(u32)0x01<<(0*4); }
// PB8:复用推挽输出
#define PB8_AF_PP { GPIOB->CRH&=0XFFFFFFF0; GPIOB->CRH|=(u32)0x09<<(0*4); }
//----------------------------------------------------------------------------
// PB9模式配置
//----------------------------------------------------------------------------
// PB9:通用推挽输出
#define PB9_Out_PP { GPIOB->CRH&=0XFFFFFF0F; GPIOB->CRH|=(u32)0x01<<(1*4); }
// PB9:复用推挽输出
#define PB9_AF_PP { GPIOB->CRH&=0XFFFFFF0F; GPIOB->CRH|=(u32)0x09<<(1*4); }
//----------------------------------------------------------------------------
//------------------------------------------------------------------------------------
//----------------------------------------------------------------------------
void Motor_LF_forward(u8 speed); // 左前轮=前转(速度 = speed%)
void Motor_LF_backward(u8 speed); // 左前轮=后转(速度 = -speed%)
void Motor_LF_Stop(u8 Wheel_STOP); // 左前轮=停止(熄火/刹车)
void Motor_LB_forward(u8 speed); // 左后轮=前转(速度 = speed%)
void Motor_LB_backward(u8 speed); // 左后轮=后转(速度 = -speed%)
void Motor_LB_Stop(u8 Wheel_STOP); // 左后轮=停止(熄火/刹车)
void Motor_RF_forward(u8 speed); // 右前轮=前转(速度 = speed%)
void Motor_RF_backward(u8 speed); // 右前轮=后转(速度 = -speed%)
void Motor_RF_Stop(u8 Wheel_STOP); // 右前轮=停止(熄火/刹车)
void Motor_RB_forward(u8 speed); // 右后轮=前转(速度 = speed%)
void Motor_RB_backward(u8 speed); // 右后轮=后转(速度 = -speed%)
void Motor_RB_Stop(u8 Wheel_STOP); // 右前轮=停止(熄火/刹车)
void Car_Stop(u8 Wheel_STOP); // 小车=停止(熄火/刹车)
void Car_forward(u8 speed); // 小车向前(速度 = speed%)
void Car_backward(u8 speed); // 小车向后(速度 = -speed%)
void Car_Turn_Left(u8 speed); // 小车左转(速度 = speed%)
void Car_Turn_Right(u8 speed); // 小车右转(速度 = speed%)
//----------------------------------------------------------------------------
#endif
Motor.c
#include "Motor.h"
// 左前轮
//**************************************
// 左前轮=前转(速度 = speed%)
//------------------------------------
void Motor_LF_forward(u8 speed)
{
PA9_Out_PP;
PA_out(9) = 0;
PA8_AF_PP;
TIM_SetCompare1(TIM1, speed);
}
//------------------------------------
// 左前轮=后转(速度 = -speed%)
//------------------------------------
void Motor_LF_backward(u8 speed)
{
PA8_Out_PP;
PA_out(8) = 0;
PA9_AF_PP;
TIM_SetCompare2(TIM1, speed);
}
//------------------------------------
// 左前轮=停止(熄火/刹车)
// Wheel_STOP = 0:熄火 1:刹车
//------------------------------------
void Motor_LF_Stop(u8 Wheel_STOP)
{
if( Wheel_STOP == 0 ) // 熄火
{
PA8_Out_PP;
PA_out(8) = 0;
PA9_Out_PP;
PA_out(9) = 0;
}
else//if(Wheel_STOP==1) // 刹车
{
PA8_Out_PP;
PA_out(8) = 1;
PA9_Out_PP;
PA_out(9) = 1;
}
}
//------------------------------------
//**************************************
// 左后轮
//**************************************
// 左后轮=前转(速度 = speed%)
//----------------------------------
void Motor_LB_forward(u8 speed)
{
PA11_Out_PP;
PA_out(11) = 0;
PA10_AF_PP;
TIM_SetCompare3(TIM1, speed);
}
//----------------------------------
// 左后轮=后转(速度 = -speed%)
//----------------------------------
void Motor_LB_backward(u8 speed)
{
PA10_Out_PP;
PA_out(10) = 0;
PA11_AF_PP;
TIM_SetCompare4(TIM1, speed);
}
//----------------------------------
// 左后轮=停止(熄火/刹车)
// Wheel_STOP = 0:熄火 1:刹车
//----------------------------------
void Motor_LB_Stop(u8 Wheel_STOP)
{
if( Wheel_STOP == 0 ) // 熄火
{
PA10_Out_PP;
PA_out(10) = 0;
PA11_Out_PP;
PA_out(11) = 0;
}
else//if(Wheel_STOP==1) // 刹车
{
PA10_Out_PP;
PA_out(10) = 1;
PA11_Out_PP;
PA_out(11) = 1;
}
}
//----------------------------------
//**************************************
// 右前轮
//**************************************
// 右前轮=前转(速度 = speed%)
//----------------------------------
void Motor_RF_forward(u8 speed)
{
PB7_Out_PP;
PB_out(7) = 0;
PB6_AF_PP;
TIM_SetCompare1(TIM4, speed);
}
//----------------------------------
// 右前轮=后转(速度 = -speed%)
//----------------------------------
void Motor_RF_backward(u8 speed)
{
PB6_Out_PP;
PB_out(6) = 0;
PB7_AF_PP;
TIM_SetCompare2(TIM4, speed);
}
//----------------------------------
// 右前轮=停止(熄火/刹车)
// Wheel_STOP = 0:熄火 1:刹车
//----------------------------------
void Motor_RF_Stop(u8 Wheel_STOP)
{
if( Wheel_STOP == 0 ) // 熄火
{
PB6_Out_PP;
PB_out(6) = 0;
PB7_Out_PP;
PB_out(7) = 0;
}
else//if(Wheel_STOP==1) // 刹车
{
PB6_Out_PP;
PB_out(6) = 1;
PB7_Out_PP;
PB_out(7) = 1;
}
}
//----------------------------------
//**************************************
// 右后轮
//**************************************
// 右后轮=前转(速度 = speed%)
//----------------------------------
void Motor_RB_forward(u8 speed)
{
PB9_Out_PP;
PB_out(9) = 0;
PB8_AF_PP;
TIM_SetCompare3(TIM4, speed);
}
//----------------------------------
// 右后轮=后转(速度 = -speed%)
//----------------------------------
void Motor_RB_backward(u8 speed)
{
PB8_Out_PP;
PB_out(8) = 0;
PB9_AF_PP;
TIM_SetCompare4(TIM4, speed);
}
//----------------------------------
// 右前轮=停止(熄火/刹车)
// Wheel_STOP = 0:熄火 1:刹车
//----------------------------------
void Motor_RB_Stop(u8 Wheel_STOP)
{
if( Wheel_STOP == 0 ) // 熄火
{
PB8_Out_PP;
PB_out(8) = 0;
PB9_Out_PP;
PB_out(9) = 0;
}
else//if(Wheel_STOP==1) // 刹车
{
PB8_Out_PP;
PB_out(8) = 1;
PB9_Out_PP;
PB_out(9) = 1;
}
}
//----------------------------------
//**************************************
// 小车运动情况
//**************************************
// 小车=停止(熄火/刹车)
// Wheel_STOP = 0:熄火 1:刹车
//---------------------------------
void Car_Stop(u8 Wheel_STOP)
{
if( Wheel_STOP == 0 ) // 熄火
{
Motor_LF_Stop(0);
Motor_LB_Stop(0);
Motor_RF_Stop(0);
Motor_RB_Stop(0);
}
else//if(Wheel_STOP==1) // 刹车
{
Motor_LF_Stop(1);
Motor_LB_Stop(1);
Motor_RF_Stop(1);
Motor_RB_Stop(1);
}
}
//---------------------------------
// 小车向前(速度 = speed%)
//---------------------------------
void Car_forward(u8 speed)
{
Motor_LF_forward(speed);
Motor_LB_forward(speed);
Motor_RF_forward(speed);
Motor_RB_forward(speed);
}
//---------------------------------
// 小车向后(速度 = -speed%)
//---------------------------------
void Car_backward(u8 speed)
{
Motor_LF_backward(speed);
Motor_LB_backward(speed);
Motor_RF_backward(speed);
Motor_RB_backward(speed);
}
//---------------------------------
// 小车左转
// 左侧车轮向后转(速度 = -speed%)
// 右侧车轮向前转(速度 = speed%)
//---------------------------------
void Car_Turn_Left(u8 speed)
{
Motor_LF_backward(speed);
Motor_LB_backward(speed);
Motor_RF_forward(speed);
Motor_RB_forward(speed);
}
//---------------------------------
// 小车右转
// 右侧车轮向后转(速度 = -speed%)
// 左侧车轮向前转(速度 = speed%)
//---------------------------------
void Car_Turn_Right(u8 speed)
{
Motor_LF_forward(speed);
Motor_LB_forward(speed);
Motor_RF_backward(speed);
Motor_RB_backward(speed);
}
//---------------------------------