当IO限制在uC上时,如何将逻辑从uC移开?


8

例如,如果您有一个带有4个数字IO引脚的Arduino,您如何独立点亮> 4个LED或读取> 4个按钮的状态?


您在标题中询问有关PIC的信息,然后参考Arduino!
莱昂·海勒2012年

2
@LeonHeller:然后要求澄清和/或自己编辑问题。尽管在这种情况下,可以为PIC / Arudino加上“ uC”。
克里斯·拉普兰特

2
我同意硬件维护成本较低。
jippie 2012年

3
@jippie-然后怪胎的答复是:“什么是女友?” :-)
stevenvh 2012年

1
我建议重新考虑您接受的答案。Ignacio的信号不正确(有三个信号,而不是两个),Bruno的信号更完整(例如Ignacio并未提及输入),并且具有节省额外引脚的原始解决方案。
stevenvh 2012年

Answers:


4

诸如74595之类的移位寄存器将使您仅通过2个连接即可获得许多输出:数据引脚和时钟引脚。将数据引脚设置为要移入寄存器的下一个值,然后向时钟引脚发送脉冲。


那很棒。因此,我已经阅读了一下,只是为了澄清,使用其中的一个,我可以使用2个arduino引脚来运行8个输出吗?我想我也不能将它们用作输入?
cheesysam

3
@cheesysam-“使用两个,您可以有16个输出。使用三个,24个,依此类推,”。那是不对的。无论您要连接多少个设备,您都需要3个引脚:数据,时钟和锁存器。布鲁诺的答案更为准确。另外,不要谈论74595,这是原始的TTL技术,该技术已经死了几十年。您需要74HC595。
stevenvh 2012年

1
@stevenvh:“ ...其中之一,我可以有8个输出...”。另外,您确定他们不需要74AC595吗?74F595?74LVX595?
伊格纳西奥·巴斯克斯

1
@Ignacio-“有两个..”令人困惑,就像我一样,可以理解为“有两个I / O”。抱歉。74F595?对于16 MHz控制器的时钟?我不这么认为。74F非常耗电,而且速度不会给您带来任何好处。74LVX仅为3.3 V,因此不与Arduino接口。74HC有什么问题?这是标准逻辑系列。
stevenvh 2012年

2
“ 74HC怎么了?” 绝对没有。省略“ XX”怎么了?
伊格纳西奥·巴斯克斯

7

布鲁诺给出了一个很好的答案,但是我想做一些说明。

臭名昭著70毫安
74HC595经常被用作I / O扩展,并且如通常用于控制一系列LED。通常被忽视的是,您可能会以这种方式超出规范地进行操作。数据表中说,总电源电流不应超过70 mA(绝对最大额定值(AMR)),因此,最好在一定程度上远离该值。因此,10 mA时8个LED太多了,而在20 mA时,您将比AMR高出不少于130%!该限制可能是由于键合线的电流容量所致,然后太大的电流可能不仅会使零件的性能下降,而且如果该线会折断,则会永久性地使其失效。

但是昨晚我醒来是因为我有一个主意。Icc和接地电流都限制为70 mA,那么为什么不将总电流或80 mA分开,让Icc占一半,而接地电流占另一半?您所要做的就是将LED的4个接地(高电平有效),将另外4个Vcc(低电平有效)接地。然后,前者的电流来自Icc,其他人的电流接地。这样就可以使用15 mA LED。(它是如此简单,以至于我觉得自己真是个白痴,没想到早一点。)

我以为组合时钟
Bruno通过将移位寄存器的时钟与锁存器的时钟相结合节省了一个额外的I / O引脚。似乎我误解了他的答案。我仍然想扩展此选项。

那会发生什么呢?数据表第5页上的表显示

移位寄存器的内容通过;移位寄存器的先前内容被传输到存储寄存器和并行输出级

(由我突出显示)
因此锁住的不是数据,而是前一个数据。这不是一个真正的问题,只需确保移入一个额外的虚拟位来锁存最后一个数据,否则所有引脚都会出错。

合并时钟还意味着在移入新数据时,输出将始终切换。锁存器的功能实际上是为了避免这种情况。在许多情况下,如果可以快速完成,这将不是问题,但在最坏的情况下,您可能会得到不希望的效果。最坏的情况是使用74HC595以非常高的扫描频率多路复用显示+移位寄存器链非常长+除1之外全为1,一个LED熄灭+一个暗室。由于该LED经常在黑暗的房间中看到所有1的通过,因此它可能会非常微弱地点亮。

或者,如果您将高频多路复用与继电器控制输出相结合。全零,然后为1的继电器,可能意味着继电器的输出不够长,无法拉入。

诚然,这些都是极端情况,但是如果您要多路复用,否则我会尽可能将串行时钟和锁存时钟分开,否则更新速度会很高。


1
+1你昨晚有个好主意!到目前为止,从未在任何地方提到此问题。另一方面,我认为您误解了布鲁诺的答案。他的意思是将74XX595和74XX165的时钟信号组合在一起,以及将74XX595和74XX165的锁存信号组合在一起。
m.Alin,2012年

@ m.Alin-是的,似乎我做到了。感谢您指出了这一点。我将编辑答案,但有可能。
stevenvh 2012年

当然,这绝对是其他人推荐的可能性。值得解决。
m.Alin

@ m.Alin-我认为以前没有使用它的原因是用户不知道70 mA的限制,或者不在乎:-(。我现在要去专利局!;-)
stevenvh 2012年

3
回来了 办公室关闭了。他们都在教堂里。
stevenvh 2012年

6

我同意Ignacio关于使用74XX595,串行并行输出移位寄存器进行输出扩展的观点,但实际上您将需要3个连接,一个用于数据,一个用于时钟,以及一个锁存器使能,以从内部移位寄存器传输数据到输出锁存器。

74LS595图

为了扩展输入,可以使用74XX165并行输入串行移位寄存器,每个74XX165最多可以有8个按钮。

在此处输入图片说明

这种方法的好处是,您可以菊花链式连接多个移位寄存器,从而增加输入或输出的数量,更好的是,您可以混合使用74XX595和74XX165,并允许任意数量的输入或输出。

除此之外,您还可以共享时钟和锁存信号,从而减少了所需的连接数量并大大简化了软件。这样,对于任何数量的该移位寄存器,您仅需要4个连接:

  • 时钟(与所有移位寄存器共享)
  • 锁存使能(与所有移位寄存器共享)
  • 数据输入(连接到链中最后一个移位寄存器的串行输出)
  • 数据输出(连接到链中第一个移位寄存器的串行输入)

编辑

在搜索图表时,我在该网站上发现了一种非常巧妙的方法,可以将所需的连接数减少到3个。它包括使用相同的引脚进行数据输入和输出。

该软件将为每个时钟脉冲执行以下操作:

  1. 将引脚配置为输出
  2. 设置数据值
  3. 发送时钟脉冲
  4. 将引脚配置为输入
  5. 读取数据

图表


1
过于热衷的人只能通过一个输出引脚控制移位寄存器输出的字符串,例如输入输出字符串。问我我怎么知道:-)。这通过在数据和锁存器上使用R / C延迟来实现,时钟直接连接到输出引脚。确切的排序取决于时钟和锁存器的相对边沿触发极性,但是通常将它们设计为以这种方式一起工作。
罗素·麦克马洪

就像我在回答中说的那样,您也可以同时组合两个时钟,因此只需要两个引脚即可。这是一个聪明的主意,但我不会第二次赞成。一次就够了:-)
stevenvh 2012年

我认为没有必要将74HC595的最后输出转移到74HC165。有人可以解释吗?据我了解,没有这种连接,16个时钟脉冲就足够了,设置2个74HC595的输出(16个输出)并读取2个74HC165的输入(16个输入)。

@Dario:从74HC595馈入74HC165的最后输出是一种“免费赠品”的方式,它允许控制器知道链长不会超过特定长度,从而确定链已连接以及连接的长度。 。如果在启动时将所有的“ 595”低位时钟输入是可以接受的,并且如果第一个“ 165”具有至少一个高输入,则代码甚至可以确定有多少个“ 595”和“ 165”。
supercat

5

尼克提到了I / O扩展器,它们绝对值得研究。Digikey列出了上千种,我将以I2C接口为例,因为这需要最少的I / O引脚。最少两个。

恩智浦PCA9505具有40个可配置的I / O引脚,相当于五个74HC595s。这是一个稍微昂贵的解决方案,但是您可以得到更多的功能:

  • 任何I / O引脚都可以配置为输入或输出
  • 所有I / O引脚上都有100kΩ上拉电阻(PCA9506没有上拉电阻,这可能与低功耗应用有关)
  • 所有输出可同时吸收15 mA电流,总封装电流为600 mA
  • 电平变化中断输出使输入的连续扫描变得多余
  • 仅两条线连接到微控制器。

进一步阅读
GPIO扩展器,NXP手册
PCA9505数据表


4

对于没有额外IC的解决方案,可以使用诸如MultiplexingCharliplexing之类的技术

多路复用(未显示限流电阻):

多路LED

多路复用的工作方式非常简单-在上面的示例中,如果要点亮LED1,我们将引脚C1设置为输出高电平,将引脚R1设置为输出低电平,所有其他引脚可以为高电平或Hi-Z(设置为输入,高电平)阻抗,使它们看起来“断开”)
如果我们想点亮LED5,我们将引脚C2设置为输出高电平,将R2设置为输出低电平。

驱动n个LED所需的引脚数可以通过2n个引脚来计算,因此,例如对于16个LED,我们需要(√16)* 2 = 8个引脚。

Charlieplexing:

Charlieplexing

替代(更简洁)的原理图布局(由Supercat建议):

Charlieplexing 2

这有点复杂,但是使用较少的引脚来驱动更多数量的LED。例如,如上例所示,我们仅可以使用5个引脚来驱动20个LED(相比之下,至少10个具有“正常”矩阵多路复用功能的引脚(不要与使用IC混淆,在这种情况下,所需的引脚数为log2) (nLED)。

对于外部解决方案,您可以使用诸如移位寄存器多路复用器之类的东西, 例如74HC595和74HC151。
移位寄存器采用时钟控制的串行数据输入流,并并行输出(Serial In Parallel Out SIPO)或以其他方式
输出(PISO)。它们通常有8个输出(或输入),但您可以随意链接任意数量以扩展的东西。缺点是可以更新的速度除以每个输入的输出数量(例如,对于8个输出的一个寄存器,如果您具有8MHz的输入时钟,则可以以1MHz更新,对于16个输出为500kHz,等等)

这些技术也可以反向进行输入。


此答案显示了如何对多路输入按钮使用Charlieplexing:electronics.stackexchange.com/a/37362/8627
jippie 2012年

绘制Charlieplexed显示的一种更简单的方法是简单地将其绘制为NxN网格,对角线不填充。
supercat

@supercat-我只是捏捏了Google图片中的第一个示例。我刚刚添加了另一个示例-这是您想要的布局吗?
奥利·格拉泽

@OliGlaser:是的,尽管我建议将电阻器移至行-列连接处。如果这样做,则只要高侧或低侧驱动器都可以容纳9个LED,就可以一次驱动9个LED。或者,可以将电阻器留在原处,但在每个行-​​列结处添加一个晶体管(对于所示示意图,NPN的基极在行上,发射极在列上,集电极连接到正极)。添加晶体管将大大降低同时运行9个LED所需的高端驱动强度。
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.