顯示具有 74HC595 標籤的文章。 顯示所有文章
顯示具有 74HC595 標籤的文章。 顯示所有文章

2022年8月11日 星期四

74HC595驅動8段數碼管的最大串聯數量

74HC5958位串行輸入串/並行輸出的鎖存移位寄存器。它的串入並出特性,非常適合驅動8段數碼管;串入串出特性,非常適合首尾串聯。8段數碼管採用共陰或者共陽都可以,因為74HC595的吸入/灌出電流均達到20mA 

它的使用方法也很簡單,並行輸出接到8段數碼管上,串行輸入與輸出首尾連接即可。單片機提供第一個74HC595的串行輸入,最後一個74HC595的串行輸出懸空。所有的74HC595共用2根時鐘線、 1根使能線。因此,理想情況下單片機提供4IO口,能驅動後續的無限多個74HC595原理圖如下:

但實際情況下, 74HC595驅動8段數碼管,究竟最多能串聯多少呢?

換一種問法:

第一,電路板能夠通過的最大電流?

第二,推挽輸出能夠驅動多少個高阻態輸入?

第三,推挽輸出可以傳輸多長距離?

第四,末端位置的電源線和地線的變化?

 

(圖中左端的數碼管比右端稍暗,是因為限流電阻的關係。所處的位置對它的亮度影響不大。)

 

第一,電路板能夠通過的最大電流?

限流電阻取1K時,每個74HC595大概需要8mA的電流。

電源線寬度為25mil,銅層厚度為1oz,則最大電流為1.7A

因此,可以串聯的74HC595個數為1.7A/8mA=212個。

 

第二,推挽輸出能夠驅動多少個高阻態輸入?

典型的推挽輸出,驅動能力為4mA

74HC595的技術手冊上,高阻態輸入的漏電流為1uA 

一個推挽輸出至少可以驅動4000個高阻態輸入引腳。換言之,單片機的IO口可以驅動400074HC595

(實際上,IO口在電平快速切換的時候,比靜態驅動的情況要稍微複雜一些,需要進行阻抗匹配的處理。

 

第三,推挽輸出可以傳輸多長距離?

推挽輸出為TTL電平,使用它傳輸信號,距離一般不會超過2米。這不是受TTL電平的驅動能力限制,而是因為它需要對地參考,所以很容易受到環境的干擾。

如果工作環境的干擾很小,傳輸距離可以更長一些。

 

第四,末端位置的電源線和地線的變化?

串聯6074HC595小電路板,以500ms時間間隔顯示0 9,實測發現:當數碼管熄滅時,最末端供電電壓為+5V;當數碼管點亮時,最末端供電電壓為+2.91V74HC595的最低工作電壓在+2V因此設每個74HC595電路板的線上電阻為R,串聯個數為x,則有:

x*R*(8mA*x/2)=U

x=60  U=2.1 ,因此R=0.146 

U=3V時, x=71 

因此,受線上壓降和74HC595的最低工作電壓限制,能夠串聯的個數限制為71

 

結論:

綜合以上四點,可以知道74HC595驅動8段數碼管最大串聯數量為71

而實際上,通過將電源和地線變得更加短粗,並且選擇更好的接插件,可以減少線上電阻,從而降低線上壓降;而且由於很少會同時點亮數碼管的所有段,所以實際上能夠串聯的個數比71還要更多一些。 


資料來源: https://www.eefocus.com/marianna/blog/13-12/300939_981a5.html

2022年8月3日 星期三

74HC595移位暫存器,同時控制 16 個輸出

74HC595 是一顆八位元的移位暫存器,同時可以控制八個輸出,我們可以把多顆移位暫存器串接 (Daisy chain) 在一起以擴充腳位,例如: 如果串接兩顆 74HC595 移位暫存器,便可以同時控制 16 個輸出。

74HC595 總共有 16 支接腳,底下這 16 支接腳的圖表說明:


image_thumb4
腳位編號名稱說明
1-7, 15Q0 ~ Q7輸出腳位
8GND接地
7Q7’序列輸出 (Serial Out)
10MRMaster Reset, 清除所有資料, 低電位有效 (Active low)
11SH_CPSHift register clock pin (Clock Pin)
12ST_CPSTorage register clock pin (Latch Pin)
13OEOutput Enable, 允許輸出,低電位有效 (Active low)
14DS序列資料輸入 (Serial data input)
16Vcc供應電壓



步驟一:接上第一顆 74HC595 以及 8 顆 LED
  • 接上 8 顆 LED,將每顆 LED 短腳 (陰極) 直接接到 GND,然後將每顆 LED 的長腳 (陽極) 個別接至 74HC595 的輸出腳位 D0 ~ D7 並串接一顆 220 ohm 電阻
  • 74HC595 接線其一:
    • Vcc (pin 16) 與 MR (pin 10) 接 5V
    • GND (pin 8) 與 OE (pin 13) 接地
  • 74HC595 接線其二:
    • DS (pin 14) 接 Arduino pin 11 (下圖藍線)
    • ST_CP (pin 12, latch pin) 接 Arduino pin 8 (下圖綠線)
    • SH_CP (pin 11, clock pin) 接 Arduino pin 12 (下圖黃線)
  • 假如發現 LED 有震動閃爍的現象,可以在 ST_CP (pin 12, latch pin) 上接一顆 0.1uF 電容以去除閃爍現象
image_thumb21
步驟二:加上第二顆 74HC595,第二顆移位暫存器一樣要接線連到電源與接地
  • Vcc (pin 16) 與 MR (pin 10) 接 5V
  • GND (pin 8) 與 OE (pin 13) 接地
image
步驟三:把兩顆 74HC595 連接起來
只要把第一顆 74HC595 的 SH_CP (Clock Pin) 和 ST_CP (Latch Pin) 兩支腳位接到第二顆 74HC595 上 (下圖中的綠線以及黃線),接著把第一顆 74HC595 的 Q7’ (序列輸出腳) 接到第二顆 74HC595 的 DS (序列資料輸入) 就可以了 (下圖中的藍線)。
image
步驟四:加上第二組 LED
image
電路圖
image
(圖片來源: arduino.cc)
程式碼
底下這支程式 (Shiftout_With_Two_74HC595.pde) 會讓 16 顆 LED 由左往右一顆一顆點亮,實際效果請見範例影片,:
01// Lab12 使用兩顆 74HC595 和三支腳位控制 16 顆 LED
02
03// 接 74HC595 的 ST_CP (pin 12,latch pin)
04int latchPin = 8;
05// 接 74HC595 的 SH_CP (pin 11, clock pin)
06int clockPin = 12;
07// 接 74HC595 的 DS (pin 14)
08int dataPin = 11;
09
10void setup() {
11  // 將 latchPin, clockPin, dataPin 設置為輸出
12  pinMode(latchPin, OUTPUT);
13  pinMode(clockPin, OUTPUT);
14  pinMode(dataPin, OUTPUT);
15}
16
17void loop() {     
18  for (int led = 0; led < 16; led++) {
19    int numberToDisplay  = 1 << led;
20    byte high_Byte = highByte(numberToDisplay);
21    byte low_Byte = lowByte(numberToDisplay);
22     
23    // 送資料前要先把 latchPin 拉成低電位
24    digitalWrite(latchPin, LOW);
25     
26    // 先送高位元組 (Hight Byte), 給離 Arduino 較遠的那顆 74HC595
27    shiftOut(dataPin, clockPin, MSBFIRST, high_Byte); 
28    // 再送低位元組 (Low Byte), 給離 Arduino 較近的那顆 74HC595
29    shiftOut(dataPin, clockPin, MSBFIRST, low_Byte); 
30
31    // 送完資料後要把 latchPin 拉回成高電位
32    digitalWrite(latchPin, HIGH);
33    
34    delay(40);
35  }
36}


因為 shiftOut() 函式一次只能送一個位元組,所以必須將 numberDisplay 拆成兩個位元組分兩次傳送:
1// 先送高位元組 (Hight Byte), 給離 Arduino 較遠的那顆 74HC595
2shiftOut(dataPin, clockPin, MSBFIRST, high_Byte); 
3// 再送低位元組 (Low Byte), 給離 Arduino 較近的那顆 74HC595
4shiftOut(dataPin, clockPin, MSBFIRST, low_Byte); 

再次提醒:在送資料前,記得要先把 latchPin 拉成低電位,緊接著使用 shiftOut() 函式送出資料,送完資料後還要把 latchPin 拉回高電位


shiftOut()


shiftOut()

Description

Shifts out a byte of data one bit at a time. Starts from either the most (i.e. the leftmost) or least (rightmost) significant bit. Each bit is written in turn to a data pin, after which a clock pin is pulsed (taken high, then low) to indicate that the bit is available.
Note: if you're interfacing with a device that's clocked by rising edges, you'll need to make sure that the clock pin is low before the call to shiftOut(), e.g. with a call to digitalWrite(clockPin, LOW).
This is a software implementation; see also the SPI library, which provides a hardware implementation that is faster but works only on specific pins.

Syntax

shiftOut(dataPin, clockPin, bitOrder, value)