该L293D驱动模块是专门为arduino设计的,网上使用arduino驱动该模块的资料很多,但是关于使用其他单片机驱动该模块是资料比较少,本人在学习中也是花了很多时间查找资料和摸索,该模块直接整块插入arduino,然后安装专门的库文件,就可以直接使用,而51单片机则需要自己进行接线和了解模块的原理,所以在此为该模块做个比较详细的介绍。
模块功能:
*2个5V伺服电机(舵机)端口联接到的高解析高精度的定时器无抖动!
*多达4个双向直流电机及4路PMM调速(大约0.5%的解析度)
*多达2个步进电机正反转控制,单/双步控制,交错或微步及旋转角度控制。
*4路H-桥:L293D芯片每路桥提供0.6A (峰值1.2A)电流并且带有热断电保护, 4. 5Vto36V。
*下拉电阻保证在上电时电机保持停止状态。
*大终端接线端子使接线更容易(10-22AWG)和电源。
*带有复位按钮。
*2个大终端外部电源接线端子保证逻辑和电机驱动电源分离
下载方便使用的软件库快速进行项目开发
适用范围:初学者,实验器材平台,互动电子,机器人等。
特点:功能多,操作方便,有强大的驱动库支持及功能更新。
缺点:I/0占用较多在同时驱动四路电机的情况下(相对Arduino1/0少的版本而言),小功率。
可驱动4路直流电机或者2路步进电机的同时还能驱动2路舵机
支持Arduino UNO. Arduino Mega2560
您可以这样搭配
驱动四路直流电机和两路舵机
驱动两路直流电机和一路步进电机和两路舵机
驱动两路步进电机和两路舵机
可以同时控制4个直流电机和2个步进电机和两个伺服电机(舵
机)。有专门的代码库。导入库后,简单使用。
模块接线图:
注意,使用步进电机会占用2个直流电机接口,电机驱动电源需要单独供电给电机,电路驱动电源需要使用51单片机提供的电源,也可以单独供电,但是必须要跟单片机共地,否则会无法将数据写入模块。
模块引脚说明(该模块是为arduino设计的,所以使用51单片机驱动该模块有些引脚是没用的,如:0,1,2,13,ARef):
3:直流电机M2的PWM信号端,与左边的L293D芯片(IC1)的9号脚相连
4:74HC595芯片的数据输入时钟端(上升沿有效),与中间的74HC595芯片(IC3)的11号脚相连
5:直流电机M4的PWM信号端,与右边的L293D芯片(IC2)的1号脚相连
6:直流电机M3的PWM信号端,与右边的L293D芯片(IC2)的9号脚相连
7:74HC595芯片的输出使能端(低电平有效),与中间的74HC595芯片(IC3)的13号脚相连
8:74HC595芯片的串行数据输入端,与中间的74HC595芯片(IC3)的14号脚相连
9:舵机2的PWM信号端
10:舵机1的PWM信号端
11:直流电机M1的PWM信号端,与左边的L293D芯片(IC2)的1号脚相连
12:74HC595芯片的并行数据输出时钟端(上升沿有效),与中间的74HC595芯片(IC3)的12号脚相连
A0~A5可以自行焊接排针作为扩展,可以提供给舵机也可以提供给测速模块,接线柱的电机驱动电源是提供给4个直流电机的,引脚的5V电路驱动电源是提供给芯片和舵机的,以及右下脚的5V电源,黄色的跳线帽将电机驱动电源和9V引脚相连,电机驱动电源提供多少伏的电压,9V接脚就是多少伏的,并不是固定9V,所以请注意,关于电机驱动电源资料上说的是4.5V到36V,建议在12V之内,L293D的芯片是4.5V到36V的,但是该模块上的其他元件不一定能承受,本人就弄坏一个板子,起初是74HC595芯片莫名其妙的烧坏,然后更换芯片后,在20V电压下调压时拧错了反向,导致一个电容爆炸了,但是肯定是没有超过36V的,该模块的电容的击穿电压是16V,20V以下是没有问题的,还要注意的是电流,不能过大,一般12V的电压绝对够用了。
模块上还有一些被焊死的接口,是和直流电机接线柱相邻的(蓝色区域其他引脚是GND),可以自行焊上排针,这样就可以使用杜邦线连接电机了或者串上电阻接上LED做指示灯,我的板子是自己把引脚都焊上来了。
模块原理:
改模块是使用L293D来驱动电机的,中间有一个74HC595芯片,是将串行信号转为并行信号的,因为该模块是为arduino设计的,arduino的I/O口较少,控制4个直流电机需要12个引脚,使用74HC595可以减少4个引脚的使用,也可以取掉74HC595芯片,焊接接线,直接使用51单片机并行控制2个L293D芯片从而控制电机。
74HC595芯片:
简单的说,先将模块的引脚7置0,然后模块的引脚4(74HC595芯片的数据输入时钟端)接受到一个上升沿,就将芯片中的8位数据左移一位,空出低位将引脚8(74HC595芯片的串行数据输入端)的0或1信号写入低位,写入八次就将控制4个电机的8位信
号写入74HC595的芯片中了(M3M4M3M2M1M1M2M4),然后在给引脚12一个上升沿,就将芯片中的数据输出在芯片的引脚上(Q0~Q7)。74HC595芯片详解
L293D芯片:
1号和9号都是使能端,可以输入PWM信号来控制电机,当1脚置1时,2脚置1,则3脚输出高电压,7脚置0,则6脚输出低电压,而3脚和6脚接电机,产生电压带动电机转动,如果2脚置0,7脚置1,则电机反转,右半边也是一样的原理。而2,7,10,15脚接的是74HC595的输出端,所以使用74HC595就控制了2个L293D芯片,然后就可以控制电机的转动。L293D芯片详解
驱动代码:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SER=P1^0; //串行数据输入,脚8
sbit SCK=P1^1; //数据输入时钟线,脚4
sbit RCK=P1^2; //数据输出时钟线,脚12
sbit EN=P1^3; // 74hc595的使能输出 要为0,脚7
sbit PWM_M1=P1^4; // L293d的MA1使能,电机M1的pwm ,脚11
sbit PWM_M2=P1^5; //脚3
sbit PWM_M3=P1^6; //脚6
sbit PWM_M4=P1^7; //脚5
void HC595SendData(unsigned char SendVal)//发送一个字节
{
unsigned char i;
for(i=0;i<8;i++)
{
if((SendVal<<i)&0x80) SER=1;
else SER=0;
SCK=0;//产生上升沿发送数据
_nop_();
_nop_();
SCK=1;
}
}
void HC595ShowData()//产生上升沿输出数据
{
RCK=0;
_nop_();
_nop_();
RCK=1;
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for (y=123;y>0;y--);
}
void main()
{
PWM_M1=1;
PWM_M2=1;
PWM_M3=1;
PWM_M4=1;
EN=0;
HC595SendData(0x95);//M3M4M3M2M1M1M2M4:10010101
delay(10);
HC595ShowData();
while(1);
}
原理图(该图是网上找的,不太清晰,还有M3和M4它弄错了,我用黑色文字标明了一下):
PS:先给电路驱动电源,写入串行数据信号,再给电机驱动电源驱动电机,也是可以的。