每個七段 LED 后面都有一個 PADAUK PFS154-S16 微控制器,Tim“cpldcpu”的數字顯示非常智能。
是時候進行另一個具有超低成本微控制器的項目了。 但要設計什么呢?
逐高電子技術開發部整理分享: 自從看到一個 0.03 美元的 MCU 控制價值 40 美元的智能 RGB LED 的項目以來,我一直想知道這是否是使用這些設備的正確場所。 在這個價位上,將一個 MCU 專用于一個 LED 并用它來實現一個精美的節點控制器似乎不是更有意義嗎? 設計自己的協議一直吸引著我。 然而,僅僅復制 WS2812 RGB LED 或類似的東西似乎有點毫無意義……
看到這個(以及這個和這個)可鏈接和可尋址的 7 段顯示器后,很清楚該怎么做:當單個微控制器可以以更低的成本更好地控制單個 7 段顯示器時,為什么要使用三個 WS2811 IC 來控制單個 7 段顯示器 成本?
上圖顯示了一般概念:每個段都有一個串行數據輸入和一個串行數據輸出,可以控制顯示的內容。 來自每個段輸入的數據被轉發到下一個段,以便可以將下一個數字直接連接到前一個數字的輸出。 電源將穿過所有設備。
一個重要的問題是使用哪種協議:為了簡化控制,我將自己的目標設置為允許通過 8N1 配置中的標準 UART 進行控制。 這與例如相反 WS2812 采用非標準協議進行控制,時序具有挑戰性。
硬件
我選擇使用 PADAUK PFS154-S16 作為每個部分的微控制器。 該器件具有閃存和足夠的 I/O,無需多路復用即可控制 7 段顯示器。 成本僅為 0.07 美元,因此比使用多個 WS2811 等替代方案更便宜。 數據輸入引腳連接到 PA0,允許使用引腳更改中斷來檢測傳入傳輸。 數據輸出為PA6,而PB0-PB7用于控制顯示。 示意圖如下所示。
為了避免為每個段添加一個電阻器,我決定僅使用單個限流器件并以多路復用模式運行顯示器,以便一次僅打開一個段。 最初我計劃使用 NSI50010,它是一個兩端電流源。 不幸的是,事實證明,7 段顯示器上的電壓降太大,無法為電流源提供足夠的電壓。 因此,我用電阻器替換了它,并放棄了多路復用。
PCB設計如上所示。 7 段顯示器安裝在背面。 成角度的連接器用于連接顯示器的各個部分。 最初我計劃使用正確的連接器進行編程,但事實證明使用 SOIC8 夾子直接連接到微控制器要容易得多。
后側
前面
上面顯示了兩個組裝好的顯示器。 正如您所看到的,它們整齊地對齊。
固件
該固件是使用 SDCC 開發的。 我使用 Easy PDK 編程器對微控制器進行編程。
協議
事實上,這個項目最有趣的部分是設計通信協議。 為了讓事情變得簡單,我定義了以下要求:
該鏈應可通過標準 UART 接口進行控制。 例如 USB 轉 RS232 適配器。
該接口由單個輸入引腳和輸出引腳組成。 僅允許使用數字級別。
僅允許單向通信。 從鏈條到控制器沒有返回通道。
鏈上的所有元素都會在同一交易中接收更新的信息。 不需要對各個單元進行尋址。
鏈上各段的顯示內容應同步更新。
段應按其在鏈中的序號來尋址。
不需要錯誤檢測或糾正。
第 2-7 項大大簡化了事情,并且與眾所周知的 WS2812 協議非常相似。 我們先解決1。
數據框
WS2812使用的“1N1”串行協議 在單線異步協議中,每次傳輸通常由一個起始條件和 1…n 位的有效負載組成。 上圖展示了查看 WS2812 協議的一種方式:傳輸以低-高轉換作為起始位開始,隨后是單個數據位和一個停止位。 當使用標準 UART 符號時,這對應于正邏輯中的“1N1”協議。 Ts 表示一位的持續時間,它是波特率的倒數。 對于 WS2812,Ts 約為 450 ns,相當于 2.2 Mbaud。 無法直接將 WS2812 連接到標準 UART 輸出的主要原因是信號反轉。 很明顯,1N1 協議在開銷上浪費了大量帶寬。 只有三分之一的傳輸用于實際數據。
標準8N1異步串口協議
串行傳輸通常依賴于 8N1 協議,如上所示。 這里,起始位后面跟著 8 個數據位,因此 80% 的傳輸實際上用于數據。
挑戰在于,起始位后面的位數越多,計時精度要求就越嚴格。 假設我們在一位的中心進行采樣,則最大時鐘偏差需要小于一位時序的 50%。 當最大相對時鐘偏差小于 delta<1/(2*(n+0.5)) 時,可以證明這一點得到滿足,其中 n 是位數。 (推導稍微復雜一些)。
每幀位數與最大允許時鐘偏差之間的關系如上所示。 人們必須考慮到發射器和接收器之間共享容差。 例如,對于 1N1 協議,發送器可能會出現 -17% 的偏差,接收器可能會出現 +17% 的偏差。
很明顯為什么 WS2812 基于 1N1 協議:當時鐘未調整時,需要 +-17% 來考慮制造工藝和操作溫度變化。
對于 8 位數據幀,允許總誤差小于 5%。 這對應于每個設備上時鐘的 +-2.5% 容差。
由于可以調整 PFS154 微控制器上的時鐘,因此可以獲得比 WS2812 更好的容差。 數據表建議,如果器件在 5V 和 25°C 下運行,則為 +-1%,但在所有電壓和溫度條件下為 +-5%。 如果 VDD 保持在 4-6V 之間,容差應明顯低于 +-5%(參見數據表中的圖 4.5)。
最后我注意到每個 7 段顯示器只需要 5 位有效負載。 因此我選擇采用 8N1 協議,但僅使用 5 位。 這允許高達 4% 的時鐘偏差。
狀態機
現在我們已經決定了數據幀的樣子,讓我們來解決整個傳輸的工作原理。 要求是所有設備都可以按順序尋址。 為了簡單起見,沒有實現特定的尋址機制,而是傳輸中數據的順序與鏈中的順序相對應。
這可以通過上面所示的狀態機輕松實現,狀態機可能看起來比實際情況復雜得多。
重置后,每個設備處于稱為“接收”的第一狀態。 當設備處于接收模式時,它將接受傳輸,但不會在其輸出上發送任何內容。 第一個接收到的數據幀將被解釋為顯示更新信息并存儲在內部。 完成接收有效數據幀后,設備將切換到“Forward”狀態。
在轉發狀態下,所有接收到的數據幀都直接轉發到輸出,延遲為0.5 Ts。 收到有效數據幀后,設備將檢查是否收到 EOT 代碼。 如果是,設備將恢復到“接收”狀態并等待新傳輸的開始。 EOT 符號定義為 0x00。
最后需要澄清的一件事:何時應該更新顯示? 為了允許整個鏈同時更新,顯示內容在接收到EOT符號后更新。
上圖顯示了 5 個正在運行的顯示器鏈。 輸入通過 USB 轉 RS232 接口直接由 shell 腳本控制。