L293D驱动模块的使用详解


该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芯片详解

驱动代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#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:先给电路驱动电源,写入串行数据信号,再给电机驱动电源驱动电机,也是可以的。