电机驱动----RZ7889

一、简介        

        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);
}
//---------------------------------

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
功能及说明 一、基本功能 1、两路直流电机驱动,可调速和正反转控制。 2、两路正交编码器接口,可用于电机速度反馈。 3、1路USB转串口,用于电路的参数设定。 4、6轴运动处理器件MPU6050,可用于平衡小车的开发。 5、蓝牙4.0接口模块,可通过手机上的app(TTC-BLE)对电机进行加速、减速、正反转控制。 6、DC12V供电。 7、1个USB指示灯、1个蓝牙模块指示灯、2个用户指示灯(用户程序控制)。 8、1个轻触开关,供用户程序使用。 二、各部分电路说明 1、供电接口: 本模块采用DC12V供电,供电接口有2针2.54端子,并配有船型手动电源开关。 2、USB接口: USB接口为USB转串口,选择的芯片为CH340E,串口连接到单片机的USART0口,供用户程序使用,并带有LED指示灯。 3、单片机调试口和boot设定: GD32F330CBT6单片机采用的SWD调试口,开发环境MDK或IAR,开发工具为ST-LINK V2,资料中的程序两种开发环境都支持。电路中将BOOT0脚引出,可通过跳线开关去选择单片机的启动程序地址,可通过跳线选择BOOT0脚后,用USART0对用户程序进行升级,具体操作参见单片机的数据手册。 4、电机驱动电路 本电路中具有2路电机驱动接口,同时可以接2路正交编码器,可对电机转速和方向实时反馈;驱动芯片采用RZ7889,一款 DC 双向马达驱动电路,它适用于玩具等类的电机驱动、自动阀门电机驱动、电磁门锁驱动等。它有两个逻辑输入端子用来控制电机前进、后退及制动。该电路具有良好的抗干扰性,微小的待机电流、低的输出内阻,同时,他还具有内置二极管能释放感性负载的反向冲击电流。工作电压3-15V。电机驱动用到单片机的TIMER15和TIMER16,编码器检测用到单片机的TIMER1和TIMER2,具体操作参见程序。 5、6轴运动传感器电路 MPU-6050是世界上第一款集成 6 轴MotionTracking设备。它集成了3轴MEMS陀螺仪,3轴MEMS加速度计。 MPU-6050也可以通过其I2C接口连接非惯性的数字传感器,比如压力传感器。MPU-6050对陀螺仪和加速度计分别用了三个16位的ADC,将其测量的模拟量转化为可输出的数字量。为了精确跟踪快速和慢速的运动,传感器的测量范围都是用户可控的,陀螺仪可测范围为±250, ±500, ±1000, ±2000°/秒( dps),加速度计可测范围为±2, ±4,±8, ±16g。 可以采用本电路中的6轴运动传感器和2路直流电机控制做两轮平衡小车的开发。 6、蓝牙接口 蓝牙接口采用的是深圳市昇润科技有限公司的HY-254101 V1蓝牙4.0模块。使用简单,无需任何蓝牙协议栈应用经验。支持蓝牙主机、蓝牙从机、蓝牙主从一体,共 3 种版本。用户接口使用通用串口设计,全双工双向通讯,最低波特率支持 9600bps。通过AT命令对模块进行控制,再配上手机端的TCC-BLE软件可以和模块进行实时通信控制。模块的详细资料参照附件中资料
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值