事情是這樣開始的。買了個電動牙刷,幾十塊錢那種:收到的實物長這樣:牙刷手柄上有1個按鍵和6個LED燈:拆開看看電路板:可以看出,電路板上用的單片機,只有8個腳,卻要控制1個按鍵、6個LED燈、1個震動的馬達電機:初看之下,GPIO應該是不夠用的。單片機除去電源腳(正極)和GND腳(負極),只剩最多6個GPIO腳。那么是怎么做到夠用的?原來,經(jīng)過巧妙的電路設計,這款電動牙刷實現(xiàn)了用3個GPIO控制6個LED燈,節(jié)省了GPIO。這個巧妙的電路如下:6個LED燈為相同的型號,為方便查看,用紅綠兩種顏色區(qū)分兩種不同的方向。
一、原理分析這個電路用到了單片機GPIO的三種狀態(tài):
- 高電平
- 低電平
- 高阻態(tài)
二、總結提升以上其實是用了一種叫“查理復用”(Charlieplex)的方法。為什么叫查理復用?很簡單,因為這個方法來源于美信半導體公司的工程師Charlie Allen。查理復用是一種能夠在驅動LED,特別是驅動大量LED時有效地節(jié)約GPIO的方法。使用該方法,n個GPIO可以驅動 n*(n-1) 個LED,所以:
- 使用2個GPIO可以驅動2個LED。
- 使用3個GPIO可以驅動6個LED。
- 使用4個GPIO可以驅動12個LED。
- 以此類推。
- 單片機GPIO的三個狀態(tài):高電平、低電平、高阻態(tài)。
- LED具有單向導電性。
- 任意兩個GPIO引腳之間串入兩個LED,這兩個LED為并聯(lián),且LED方向相反。
- 當你想要點亮某個特定的LED時,就將其兩端所連接到的GPIO引腳分別設定為高電平和低電平,其它剩余的GPIO引腳設定為高阻態(tài)。
- 前面電動牙刷中6個LED燈的電路,就是這么設計的。
三、繼續(xù)進階如果要同時亮起兩個以上的LED,怎么辦?交替點亮他們就行,只要交替切換的速度夠快,由于人眼的視覺暫留效應,看起來就是同時亮起的。值得一提的是,如果要同時亮起的LED較多,比如大規(guī)模的LED點陣,那么還要注意一些新的問題,頗有門道。本文不再展開,感興趣的讀者可以自行查詢修煉,繼續(xù)進階。
四、最后要感謝這款電動牙刷,讓我有機會寫“查理復用”。只是最近更新又變慢了,畢竟寫公眾號不掙錢,還是努力上班,爭取買個貴的電動牙刷呀!





