一、简介        

        RZ7889 是一款 DC 双向马达驱动电路,它适用于玩具等类的电机驱动、自 动阀门电机驱动、电磁门锁驱动等。它有两个逻辑输入端子用来控制电机前进、 后退及制动。该电路具有良好的抗干扰性,微小的待机电流、低的输出内阻,同时,他还具有内置二极管能释放感性负载的反向冲击电流。

二、特点

  • 微小的待机电流,小于 2uA。
  •  工作电压范围宽 3.0V~15V
  •  有紧急停止功能 z 有过热保护功能
  •  有过流嵌流及短路保护功能
  •  封装外形为: SOP8

三、引脚功能

引脚名引脚号描述
BI1后退输入
FI2前进输入
GND3
Vcc4电源
FO5,6前进输出
BO7,8后退输出

四、控制逻辑

因为本芯片用于小车的驱动较多,故直接展示小车的控制逻辑,下面的代码展示也是基于小车的代码:

FIBIFOBO电机
1010正转
0101反转
1100停止

五、代码展示

这里只展示了电机的代码,因代码较长完整的代码放到了资源中,有需要自行下载。

最终效果: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);
}
//---------------------------------

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐