如果您发现自己需要更多的输出,74HC595很有用
您可以在您的微控制器上使用;是时候思考了
using a serial shift
寄存器等芯片。
使用您现有的一些现有
微控制器输出您可以添加多个595's扩展输出
倍数为8;每595次输出。当您添加更多595岁时't use
任何现有的微控制器输出引脚。
它的工作方式是您使用一个单片机引脚作为数据 输出和另一个时钟。只需将时钟引脚缩低到高电平 在595的数据输入的值中的时钟。由于595有8 输出您将此执行8次以填充595内存。转移新的 将数据存储到输出切换另一个引脚和您're done - 8 new outputs working.
您还可以将多个595串一起'■甚至更多的输出!这里有几个例子向您展示了如何做到。
这个 74HC595.教程 向您展示驾驶7的示例 段,LED和使用多个595's均使用8,16或32个输出 3个线接口。您还可以找到使用这些方法的正确方法 驱动LED和七个段显示的设备,并学习如何添加8,16,32, 或更多,输出具有多个595's.
74HC595.是串行移位寄存器或SIPO(串行 并行输出)用于增加您的输出次数的设备 微控制器。它只是一个内存设备,它顺序存储每个位 数据传递给它。
您通过在数据输入和提供数据的数据位发送数据 时钟信号到时钟输入。在每个时钟信号时,数据通过数据 一系列D型 - 每种D型输出馈送到输入的输入中 next.
当您在8位数据中时钟时,您可以激活并行8 从D型存储器输出。
595使用标准SPI接口。三个串行控制信号 来自微控制器是:
只有这3个串行控件,您可以根据需要添加尽可能多的输出 - 串行控制线的数量始终保持相同。
在芯片上还有另外两个控制信号:
输出使能对现代设计并不真正有用,只需将其连接到 ground (see 这里 对于它应该真正使用的东西)。
您可以将主重置(MR)控制无效,除非它至关重要 输出在上电时重置为零。将其留下意味着软件 开始时需要重置,以将零作为移位寄存器发送零点 使用锁存时钟将它们旋转到输出。
595允许您使用几根电线在串行流中传输数据 使用目的地的输出并行交付。另外多个 595's可以是菊花链式,所以你可以拥有尽可能多的输出 串行接线的任何增加。
微控制器系统进入8,16,32位并行总线设计,因为 在芯片内部使用宽总线(一组)在内部发送数据速度更快(一组 并行连接)。但是,当您需要在外面互连设备时 处理器,连接和路由32根电线都变成了 问题(甚至8是痛苦)。解决方案是使用串行接口和 将并行8,16或32位数据转换为定时数据流。这 595将转换为8位输出(请参阅以后增加 并行输出宽度)。
595有两个主要寄存器:
74HC595.以这种方式排列,因此,当您更新移位寄存器时 数据使用串行时钟(SRCLK)和串行数据(SER)输入,输出 从芯片不会改变.i.e。您可以将数据馈送到移位寄存器中 它将通过而不会影响输出引脚状态纹波。只有当 输出数据时钟闪过(闩锁时钟或注册时钟 - RCLK)将是 数据从移位寄存器传输到输出引脚。
下图显示了595的内部结构:
下图显示了74HC595的引脚。它遵循标准 TTL芯片布局以右上角的电源和底部左下角。所有输出 除了一个位于芯片的左侧,控制信号 对。串行输出QH'在右下方,这是为了 黛西链接了设备。
PIN名称 | 功能 |
---|---|
QA-QH. | 将Q0(QA)输出到Q7(QH)。 |
QH' | 串行数据输出。 |
塞 | 串行数据输入。 |
SRCLK. | 串行数据输入时钟。 |
rclk. | 输出寄存器(锁存)时钟。 |
SRCLR. | 有效低,异步移位寄存器清除。 |
OE. | 有效低,输出启用。 |
vcc. | 正电源。 |
GND. | 负电源(接地 - 0V)。 |
制作16位移位寄存器非常简单,它只是使用74HC595 雏菊链。你所做的一切,是使用两个595's并连接数据输出 第一班次寄存器到下一个的数据输入。连接QH' 第一个595到下一个的SER(串行数据输入)。
下图显示了所需的简单连接(注意序列方式 当数据信号移出时,时钟信号被馈送到两个芯片中 第一个芯片进入第二芯片):
注意:控制输出所需的唯一变更是 而不是8个x Srclk时钟脉冲,您需要16 x Srclk时钟脉冲 关联的串行数据(SER)即软件更改是必需的。
如何在链中串行连接4 74HC595S;这是非常简单的 - 它 只是上述过程的扩展i.e.将序列连接出来 以前的74HC595到下一个串行输入。唯一的区别是 要传输的总比特数。
查看放大的图像 这里.
该项目显示如何加入和控制16个LED和两个七个段 使用4 74HC595芯片显示。经过了8,16,有三组代码 和32个输出,以便轻松接线设备。
查看放大的图像 这里.
只要您只能看到Arduino和您需要三个连接 可以添加更多595芯片,因为您需要更多的输出,而不使用更多 Arduino pins.
arduino.连接是:
此示例Arduino Sketch显示如何使用输出驱动单个74HC595 驾驶LED。步行一个方向由可变的rid控制 实际值被设置为变量d。如果在任何一种位置检测到高位 那个字节的结尾然后改变方向。通过这种方式,走路一个 左右通过字节。每次换档后,将输出值 595使用ShiftOut功能,MSB首先。注意:ShiftOut以字节为单位运行 only.
// Demonstration code for 74HC595 8 bit output
在t rclk.Pin = 3; // pin 12 on the 74hc595 latch - nSS
在t SRCLK.Pin = 6; // pin 11 on the 74hc595 shift register clock - SCK
在t 塞Pin = 4; // pin 14 on the 74hc595 data - MOSI
unsigned 在t d; // Data to be sent to the shift reg.
在t dir =0; // Direction of walking 1.
char buf[12]; // General purpose buffer.
void setup() {
Serial.begin(9600); // start serial port (debug).
pinMode(RCLKPin, OUTPUT); // Set 595 control PIN sto output.
pinMode(SRCLKPin, OUTPUT);
pinMode(SERPin, OUTPUT);
Serial.println("74HC595 Demo.");
d=1;
}
void loop() {
delay(100);
digitalWrite(RCLKPin, LOW);
shiftOut(SERPin, SRCLK.Pin, MSBFIRST, 0x00ff & d);
digitalWrite(RCLKPin, HIGH);
Serial.println(itoa(d,buf,16));
if (!dir) d<<=1; else d>>=1; // Shift
if (d&0x80) dir=1; // Set direction.
if (d&0x01) dir=0;
}
此示例arduino草图扩展了前一个示例,以驱动两个595s创建16 位移寄存器与74HC595并使用输出进行驱动LED。 再次创建一个步行的人,但这次代码使用无符号整数 存储允许16位输出的值。请注意ShiftOut功能的方式 必须使用两次以输出16位值(也必须分为2 由于ShiftOut以来使用位移位的碎片只能处理8位数据 time ).
// Demonstration code for 74HC595 16 bit output
在t rclk.Pin = 3; // pin 12 on the 74hc595 latch - nSS
在t SRCLK.Pin = 6; // pin 11 on the 74hc595 shift register clock - SCK
在t 塞Pin = 4; // pin 14 on the 74hc595 data - MOSI
unsigned 在t d; // Data to be sent to the shift reg.
在t dir =0; // Direction of walking 1.
char buf[12]; // General purpose buffer.
void setup() {
Serial.begin(9600); // start serial port (debug).
pinMode(RCLKPin, OUTPUT); // Set 595 control PIN sto output.
pinMode(SRCLKPin, OUTPUT);
pinMode(SERPin, OUTPUT);
Serial.println("74HC595 Demo 2xchips for 16 bit register.");
d=1;
}
void loop() {
delay(100);
digitalWrite(RCLKPin, LOW);
shiftOut(SERPin, SRCLK.Pin, MSBFIRST, (0xff00 & d)>>8);
shiftOut(SERPin, SRCLK.Pin, MSBFIRST, 0x00ff & d);
digitalWrite(RCLKPin, HIGH);
Serial.println(itoa(d,buf,16));
if (!dir) d<<=1; else d>>=1; // Shift
if (d&0x8000) dir=1; // Set direction.
if (d&0x0001) dir=0;
}
此示例arduino草图扩展了前一个示例,保持原始操作但是 现在驾驶2个七个段显示。七个段显示器只是 用于表示数字的LED的布置。在数据表中 LED在标准位置分配了一封信;这些是字母'a' through 'g' and 'dp'(对于小数点)。制作编码更容易它是最好的 to assign 'a'-'g'到输出和DP到B7的B0-B6。注意使路由a PCB更轻松,您可以根据需要分配输出,然后持有阵列 转换值(显示数字)必须更改。
在这个例子中"走路一件事"但现在进一步8位 转移呼叫进行。注意一切都转移到了 换档功能的8位较低。
// Demonstration code for 74HC595 16 bit output and 2x7 segment displays
在t rclk.Pin = 3; // pin 12 on the 74hc595 latch - nSS
在t SRCLK.Pin = 6; // pin 11 on the 74hc595 shift register clock - SCK
在t 塞Pin = 4; // pin 14 on the 74hc595 data - MOSI
unsigned long d; // Data to be sent to the shift reg.
在t dir,num; // Direction of walking 1, output number.
char buf[12]; // General purpose buffer.
// Define an array to translate number to 7segment
char segment[10] = { // segment bit pos: dp g f e d c b a
0x3f, // zero
0x06, // one
0x5b, // two
0x4f, // three
0x66, // four
0x6d, // five
0x7c, // six
0x07, // seven
0x7f, // eight
0x67 // nine
};
void setup() {
Serial.begin(9600); // start serial port (debug).
pinMode(RCLKPin, OUTPUT); // Set 595 control PINs to output.
pinMode(SRCLKPin, OUTPUT);
pinMode(SERPin, OUTPUT);
Serial.println("74HC595 Demo 4xchips for 16 bit register and 2x7seg.");
d=1;
num = 0;
}
void loop() {
unsigned char lnum,rnum;
if(num++>99) num=0;
lnum = num / 10;
rnum = num % 10;
digitalWrite(RCLKPin, LOW);
shiftOut(SERPin, SRCLK.Pin, MSBFIRST, segment[lnum]);
shiftOut(SERPin, SRCLK.Pin, MSBFIRST, segment[rnum]);
shiftOut(SERPin, SRCLK.Pin, MSBFIRST, (0xff00 & d)>>8);
shiftOut(SERPin, SRCLK.Pin, MSBFIRST, 0x00ff & d);
digitalWrite(RCLKPin, HIGH);
Serial.println(ltoa(d,buf,16));
if (!dir) d<<=1; else d>>=1; // Shift
if (d&0x8000) dir=1; // Set direction.
if (d&0x1) dir=0;
delay(200);
}
它并不值得使用74HC595的Arduino图书馆作为搬运 是否需要将数据放入芯片中所需的所有工作。唯一额外的代码 您需要的是在使用之前和之后控制锁存输出时钟(RCLK) shiftOut.
arduino.图书馆代码模块可用,但它们使用ShiftOut as 上面的代码。所以它可能并不值得使用它们,因为你需要做的就是 设置RCLK低电平,使用ShiftOut发送数据,然后设置RCLK高。图书馆 只会整理代码一点。我还读到了74hc595图书馆可以 不满足超过8位 - 不确定这是否真实,但如果它是这样的,那么 绝对使用此页面中示例中显示的方法。
单击图像或链接 打开 74HC595. data sheet 在 a new window.
您可以使用595驱动LED,但必须保持输出电流
整个芯片的低(70mA)。以下讨论详情如何
执行此操作并建议可靠的电流限制电阻值。笔记
LED输出电流也取决于所驱动的LED(参见
discussion below).
使用Web上有很多设计 74HC595作为高电流LED驱动器。关键问题是:应该使用它 这根本呢?其中一些"designers"?完全错误读取数据 工作表并以高电流操作输出。和所有可以去的芯片一样 超出测试限制,这些限制可能是设备的保守 但是对于可靠的设计,您不想违反数据表,因为 在某些时候(可能是1000个单位的时候)单位将开始 失败 - 纠正可能非常昂贵。
"该芯片......每销可以输出多达70mA";
它不是。数据表已被误读;实际值(70mA)是为了 通过芯片的总电流。虽然任何引脚的最大值是35mA的 整个芯片的总电流不应超过70mA。
另请注意,在该指示中,有一个陈述
LATCH PIN LOW禁用输出 - 垃圾,它没有 - 所有它都是"not
update the output" - 没有禁用。
控制销OE 禁用输出(参见 这里 有关OE的信息)。实际操作是 锁存器引脚上的上升沿将数据设置为输出。
通过设计得到正确的东西比测试更重要 几个筹码,并说它有效!数据表显示已测试的内容 保证操作和长期可靠性。是的,条件可能有点 保守派和少于可以实现的,是的,芯片可以为a工作 虽然在极端过度驱动,但它不值得冒险"real" design.
所以你应该使用74HC595作为一个 高电流 引领 driver?
因此,答案是否(对于高电流输出)。任何电子产品 阅读数据表的设计者将看到最大输出电流 整个芯片为70mA,含义8 LED为每个可以输出的最大值 LED是70E-3/8 = 8.75。实际上摩托罗拉数据表所列每个输出引脚±6ma (其他数据表唐't staye这个) - 这可能是允许最新的 内部FET操作。解决方案是使用FET或促进输出 晶体管或晶体管阵列。
如果任一度,您可能会逃离驱动LED:
当您看到一个使用330Ω(RD)电阻的设计以及与和LED系列使用330Ω(RD)电阻 由595的输出驱动,然后是应该驱动的电流是:
i =(5-1.7)/ 330 = 10mA,(VTOT - VDIODE)/ RD
假设红色LED vf = 1.7V
下表显示了330Ω电流限制电阻的电流 不同的LED颜色(带5V电源)。
引领类型 | vf(v) | 当前(MA) ( Rd = 330Ω ) |
当前(MA) ( Rd = 470Ω ) |
---|---|---|---|
红色LED (standard) forward voltage | 1.7 | 10 | 7.0 |
红色LED (Bright) forward voltage | 1.9 | 9.3 | 6.5 |
橙子 / 黄色的 LED forward voltage | 2.0 | 9 | 6.4 |
绿色的 引领 forward voltage | 2.1 | 8.7 | 6.1 |
明亮的 White ~ 蓝色LED forward voltage | 3.2〜3.6 | 5.4〜4.2 | 3.8〜2.9 |
您可以看到这些设计不会以最大输出驱动LED (通常为20mA - 检查每个LED数据表是否允许)。但是在这方面 长凳,带标准LED,它们看起来足够亮了!也是7段 每个红色LED段的显示屏看起来良好的7mA(RD =470Ω)。
对于330Ω电流限制电阻:
然而,对于每个输出的10mA,将使用超出80mA的使用 595的设计限制。唯一一个将是规格的唯一白色 或蓝色LED(5.4 x 8 =〜48mA)。
对于470Ω电流限制电阻:
通过改变为470Ω电流限制电阻,相应的电流 绘制减少,所有输出都在设备8 x 7ma的规格范围内) = 56mA(最大设计输出必须低于70mA - 请参阅数据表)。
有一点房间可以减少电阻,但LED将是 动力。然而,问题是你真的需要最大的亮度吗?
结论
可能是最好的方法(对于长期可靠性)是选择高位 亮度型并相应地调整电阻。但是安全的路线是 为所有电流限制电阻使用470Ω。
另一种解决方案是使用74HC595的高电流版本。一个 合适的版本是 tipc6595(或tipc6c595) - 能够有250mA的(是) 每个引脚输出! - 这是一个高电源移位寄存器。但你要去 发现它比595更贵!
与所有串行接口一样,最终结果是数据的外观 从端到端的输出。使用8位数量的序列头开始 它然后在输出处重建它。做这个过程所花费的时间是 the limiting factor.
如果您只是设置指示灯或打开和关闭慢速继电器, 然后,这不是一个问题,但是,如果您正在进行更复杂的操作 如驱动PWM输出或其他高速操作,那么带宽是 重要信息(此芯片不是最佳PWM - 使用专用PWM设备。 TLC5940便于PWM扩展)。
如果要以特定速率打开和关闭输出,那么您可以 制定所需的运营速度。例如,你想去的例子 100khz(打开100khz的输出OFF)。当您序列化数据时 必须速度快8倍(加上频闪信号的比特),即〜800kHz。 如果您有16个输出,那么它将需要更新率〜1600khz或 ~1.6MHz.
获得一个微控制器以1.6MHz的频闪率将是不可能的 (对于一个20MHz设备,它将无法做任何其他事情 - 显然是一个非常 高速设备可以实现这一点,但内部SPI模块通常可以 operate at 20MHz.
这听起来像是矛盾的,但我没有't. The internal 模块可以非常快地操作,因此可以快速输出串行数据的突发。 这并不意味着较慢的处理器可以跟上。这是什么 确定整体数据速率i.e.将有高速爆发和 然后处理器决定对中断反应的等待期 从SPI模块生成。它是确定的处理器速度 throughput.
您可以使用内部SPI模块更快地输出数据,以便 处理器操作未在595更新中消耗。但是限制性 因子现在成为您可以快速更新SPI模块,这取决于 中断定时和处理器速度即它正在做的其他东西。这 其他限制因素是HC595(25MHz)的速度为一些 微控制器可以比这更快运行!但是74Ahc可以去 100MHz!
这些只是在设计这种系统时思考的项目 在这里没有进一步调查。
在旧的,老年日,当高端设计包括8位 系统(类似于8位微控制器)唯一的设计技术是 购买个人组件,如:
上述每个芯片是单独的,个别设备和问题 was:
答案是每个设备都有8位总线,因此必须使用该总线 传输系统周围的数据。
下一个问题是:
答案是您必须能够以特定的方式关闭输出 时间(处理器指令周期中的设置时段)例如。在处理器期间 读取操作需要激活相关设备。处理器将为 具有专用读取信号输出通常标记为有效低RD。注意A. 类似的信号用于写入NWR。
通过设置所有其他设备的所有输出启用(输出 是无效的)使所有其他设备都不驱动公共汽车,然后是您 拉动ADC输出使能低,因此只有ADC驱动总线 - 在此 处理器可以在需要时读取ADC输出的方式。
所以OE是来自该设计过程的遗产。你可以的优势 继续向主总线添加设备(在扇出限制内 处理器)只要您可以控制设备的输出使能。那 是为什么74HC595中有一个OE控制引脚。
提示: 我在网上看到的一个不寻常的想法是为了使用 OE控制输入作为电流输出控制器I.E.IDMER(如果 使用输出作为LED驱动器)。您所做的只是将PWM信号馈送到OE 输入和Voila,即时可调度(当然这会影响所有输出 74HC595一次)。
使用ADS1115精度16位ADC进行教程进行低功耗。
arduino.模拟输出:如何创建最精确的PWM模拟输出以及如何创建模拟PWM正弦波。
了解DigitalWrite()的工作原理......现在使用17倍宏宏!
如何使用TCS230(/ TCS3200)彩色检测器芯片并轻松将其添加到您的任何项目中。
使用ADXL345 Acellerometer,您可以检测到16G!您还可以了解如何使用它来点击检测等。
HMC5883L - 如何制作数字罗盘,了解HMC5883L和QMC5883L之间的差异以及它们是否兼容。
新的! Comments
让你说到你刚刚阅读的东西!留下下面的框中的评论。