0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

采用單個ADC端口來讀取多個按鈕狀態(tài)的方法

硬件攻城獅 ? 來源:TsinghuaJoking ? 作者:TsinghuaJoking ? 2023-10-07 15:19 ? 次閱讀

利用單片機ADC端口,可以讀取多個按鈕的狀態(tài)。在設(shè)計過程中,需要綜合考慮到按扭的個數(shù)與讀取的可靠性,特別是對選擇電阻的阻值進行優(yōu)化,使得不同分壓數(shù)值之間相差最大。如果按鍵面板需要通過長的引線與單片機電路相連,還需要對接口電路進行保護以提高電路的EMC特性。

01 讀取按鍵

按鍵是單片機系統(tǒng)中人機交互常用到的方法,通常情況下,通過普通的IO端口可以獲得按鍵開關(guān)狀態(tài)。在某些電子系統(tǒng)設(shè)計中,如果碰到按鈕比較多,但單片機的IO口不夠使用的時候,則需要通過端口擴展的方式來增加讀取按鈕的數(shù)量。比如通過并串轉(zhuǎn)換芯片,8-3編碼芯片等等。

今天看到 公眾號電路啊中的一篇推文:電視機的按鍵功能是用什么電路實現(xiàn)的?經(jīng)典ADC按鍵電路[1] 介紹了在一款電視機中,采用單個ADC端口來讀取多個按鈕狀態(tài)的方法。

一、電路原理

1、電路原理圖

按鍵面板中的三個引線中,其中一個是電路地線,另外兩個是信號線,分別接入主板中MCU的兩路ADC端口。這兩條線在主板上都通過3.3kΩ的電阻接到電源(3.3V)。在面板上,有多個按鈕與電阻的串聯(lián)之后連接在信號線與地線之間。

1da6168a-64d8-11ee-939d-92fbcf53809c.png

▲ 圖1.1.1 工作原理說明圖

并聯(lián)在 一起的按鈕所串聯(lián)的電阻不同,所以每個按鈕按下之后,信號線的電壓就是上拉電阻與按鍵串聯(lián)電阻對電源的分壓。由于每個按鍵串聯(lián)電阻不同,所以對應(yīng)信號線電壓也就不同了。經(jīng)過單片機ADC讀取電壓值之后,在與事先確定下的每個按鍵分壓范圍進行對比,從而可以確定是哪一個按鈕被按下。

【表1-1-1 不同按鍵對應(yīng)的電壓】

75 ohm 1000 ohm 3300 ohm 6800 ohm
0.07 V 0.77 V 1.65 V 2.22 V
SW1 SW2 SW3 SW4

2、按鍵個數(shù)

根據(jù)上述原理,一條ADC端口可以讀取按鈕的個數(shù)是非常多的,它的上限受到以下因素影響:

單片機ADC分辨率;

分壓信號的穩(wěn)定性和噪聲范圍;

機械按鍵接觸電阻;

分壓電阻偏差與穩(wěn)定性等。

為了可靠的通過ADC讀取的模擬分壓電壓來確定按鍵,需要合理選擇分壓電阻,使得每個按鍵所對應(yīng)的電壓之間的間隔越大越好。在上述實際設(shè)計的電路中,每個ADC端口只讀取了四個按鈕的狀態(tài),總共采用了兩個ADC端口讀取了7個(< 8個)按鍵狀態(tài)。

二、電路改進

1、增加接口可靠性

由于按鍵板與電路主板之間通過三根線連接,為了提高電路工作的可靠性,在按鍵電路接口中增加了R、C、TVS來消除靜電、電磁干擾對主控板的影響。

1de39924-64d8-11ee-939d-92fbcf53809c.png

▲ 圖1.2.1 增加有提高EMC接口電路

對于電路中的RC濾波器參數(shù)選擇,需要綜合考慮濾除噪聲的頻率范圍以及電路穩(wěn)定時間。不能夠為了降低噪聲一味增加RC時間常數(shù),還需要考慮按鍵動作時,對應(yīng)的分壓信號達到穩(wěn)定的過渡時間的大小。

02 更多按鍵

在前面案例中,每個ADC只讀取四個按鍵,下面給出一些可以讀取更多按鍵的方案。

一、八個按鍵

1、電路原理圖

下面是在推文經(jīng)典ADC按鍵電路[2]中給出的已經(jīng)批量應(yīng)用的八按鍵ADC讀取電路配置方案。

1df9cfe6-64d8-11ee-939d-92fbcf53809c.png

▲ 圖2.1.1 被批量使用的八個按鍵方案

2、按鍵對應(yīng)的電壓值

按照電路中的電阻參數(shù),可以計算出每個按鍵對應(yīng)的信號分壓電壓值:

【表2-1-1 八個按鍵對應(yīng)的信號電壓】

0 ohm 510 ohm 680 ohm 1000 ohm 1200 ohm 2200 ohm 4700 ohm 15000 ohm
0.00 V 0.32 V 0.67 V 1.05 V 1.38 V 1.79 V 2.27 V 2.78 V
SW1 SW2 SW3 SW4 SW5 SW6 SW7 SW8

1e1408ac-64d8-11ee-939d-92fbcf53809c.png

▲ 圖2.1.2 八個按鍵對應(yīng)的信號電壓

3、方案特點

在這個電路中,后面按鍵對應(yīng)的電阻值是由前面所有串聯(lián)電阻累加和。

這個電路的巧妙之處在于,按鍵具有優(yōu)先級之分。假設(shè)按下了按鍵SW1,那么再按下SW2-SW8中的任何一個都是不起作用的,即SW1的優(yōu)先級最高,SW2次之,以此類推。

二、組合按鍵

上面電路中不允許使用組合按鍵,即通過兩個或者兩個 以上的按摩同時按下代表更多的功能。

1、三個按鍵組合輸入

下面電路中,只使用3按鈕便可以獲得8個狀態(tài)的輸入。

1e1f6314-64d8-11ee-939d-92fbcf53809c.png

▲ 圖2.2.1 利用電阻組合完成多個多個按鈕輸入

需要通過適當(dāng)選擇的阻值,使得八種不同的按鍵組合,所得到的八個電壓之間的間隔最大,這樣才能夠保證ADC通過分壓數(shù)值確定狀態(tài)時更加可靠。

利用程序?qū)M行搜索,搜索范圍(100,10k),搜索步長:50歐姆??梢垣@得一組最優(yōu)電阻取值:

最小的電壓間隔為:0.152V。

下面是八種按鍵組合所得到的電壓,從小到大的電壓值。

['1.19V', '1.37V', '1.53V', '1.68V', '1.83V', '2.05V', '2.43V', '3.30V']

※ 總??結(jié) ※

利用單片機的ADC端口,可以讀取多個按鈕的狀態(tài)。在設(shè)計過程中,需要綜合考慮到按扭的個數(shù)與讀取的可靠性,特別是對選擇電阻的阻值進行優(yōu)化,使得不同分壓數(shù)值之間相差最大。

如果按鍵面板需要通過長的引線與單片機電路相連,還需要對接口電路進行保護以提高電路的EMC特性。


審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 串聯(lián)電阻
    +關(guān)注

    關(guān)注

    1

    文章

    189

    瀏覽量

    14732
  • 電阻
    +關(guān)注

    關(guān)注

    86

    文章

    5403

    瀏覽量

    171253
  • 單片機
    +關(guān)注

    關(guān)注

    6026

    文章

    44451

    瀏覽量

    630775
  • TVS
    TVS
    +關(guān)注

    關(guān)注

    8

    文章

    766

    瀏覽量

    60420
  • adc
    adc
    +關(guān)注

    關(guān)注

    97

    文章

    6345

    瀏覽量

    543341
  • 按鍵電路
    +關(guān)注

    關(guān)注

    1

    文章

    35

    瀏覽量

    21730
  • 分壓電阻
    +關(guān)注

    關(guān)注

    0

    文章

    18

    瀏覽量

    11554

原文標題:單個端口讀取多個按鈕(ADC按鍵電路)

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    請問有什么更好更簡便的方法來測量ADC的靜態(tài)參數(shù)?

    1000mV的DC量測試多個點,然后從中分析ADC的線性度參數(shù)。 網(wǎng)上說這種測試方法不能夠完整反映出ADc的性能參數(shù)。而且,后期可能會改版為AC耦合,就更不能
    發(fā)表于 08-24 11:28

    怎么通過ADC建議如何讀取多個溫度值?

    大家好,現(xiàn)在我可以通過ADC讀取兩個溫度值(即60和90度),我通過計算NTC熱敏電阻表中的值讀取這個溫度。但現(xiàn)在我看不到超過2個溫度,我已經(jīng)定義了至少5個溫度,但能讀懂2,就可以通
    發(fā)表于 09-20 15:45

    請問有什么更快的方法讀取ADC通道嗎?

    我的ADC運行在12MHz,采樣5個通道,實際采樣速率為100kHz。我只是注意到,使用ADCJGETRESULT16.()命令讀取單個信道,以48 MHz的CPU速度獲得一個叫聲1US。閱讀5個
    發(fā)表于 10-30 10:06

    怎樣才能跨多個集線器從LPC5411x枚舉多個串行端口?

    由于 ES_LPC5411x 中的勘誤表 USB.1,需要 TN00031 中的解決方法才能跨多個 USB 集線器實現(xiàn)無晶體 USB。我正在研究從單個設(shè)備支持多個串行
    發(fā)表于 05-06 07:03

    如何使用S32K146定期對單個ADC通道進行采樣?

    ;PDB定時器在讀取ADC轉(zhuǎn)換后重新啟動,但使用這種方法,采樣周期略長于PDB延遲時間。最好的方法是什么?我在參考手冊中讀到 PDB 具有“背靠背”模式,但我相信這是為了按順序
    發(fā)表于 05-30 12:30

    關(guān)于S32K144讀取多個ADC頻道的問題

    以下代碼只讀取一個頻道, 讀取多個頻道 ADC 所需的配置 。 Adc_Ip_Init(ADC
    發(fā)表于 09-14 11:09

    單個PRM驅(qū)動多個VTMs

    單個PRM驅(qū)動多個VTMs 的有用PDF。
    發(fā)表于 01-06 17:58 ?0次下載

    如何采用一根微控制器的端口引線驅(qū)動多個LED

    微控制器的端口引線通??杀患顬楦唠娖交虻碗娖剑幢恢糜谝环N“輸入”或高阻抗狀態(tài)。本電路采用這三種狀態(tài)實現(xiàn)用一根
    發(fā)表于 10-04 16:30 ?934次閱讀
    如何<b class='flag-5'>采用</b>一根微控制器的<b class='flag-5'>端口</b>引線<b class='flag-5'>來</b>驅(qū)動<b class='flag-5'>多個</b>LED

    如何使用Arduino UNO創(chuàng)建簡單的Modbus設(shè)備

    您可以按Modbustester中的“讀取按鈕。該命令將讀取我們新的從設(shè)備的存儲器的8個字節(jié)。在地址400008中,您可以找到按鈕狀態(tài)
    的頭像 發(fā)表于 11-15 10:05 ?1.6w次閱讀

    【GD32】GD32讀取ADC數(shù)據(jù)

    讀取ADC值4.將ADC值轉(zhuǎn)換成電壓值我這里采用PA5進行ADC的channel_5通道1.初始IO引腳/*初始化時鐘*/rcu_perip
    發(fā)表于 12-02 15:06 ?27次下載
    【GD32】GD32<b class='flag-5'>讀取</b><b class='flag-5'>ADC</b>數(shù)據(jù)

    僅使用兩根電線即可感應(yīng)多個按鈕

    對于只需要不到鍵盤或數(shù)字鍵盤的應(yīng)用,這個簡單的電路使用單個多通道1-Wire可尋址開關(guān)(DS2408)和幾個外部元件監(jiān)視多個按鈕開關(guān)。
    的頭像 發(fā)表于 01-14 12:00 ?1321次閱讀
    僅使用兩根電線即可感應(yīng)<b class='flag-5'>多個</b><b class='flag-5'>按鈕</b>

    多個ADC的基準電壓

    要求您將此路徑中的誤差降至最低。單個ADC基準電壓精度差會降低整個系統(tǒng)的性能,分布式負載也是如此,分布式負載由許多單獨的阻性和容性負載組成。有幾種方法可以為此類ADC陣列提供基準電壓:
    的頭像 發(fā)表于 02-25 10:51 ?2381次閱讀
    <b class='flag-5'>多個</b><b class='flag-5'>ADC</b>的基準電壓

    用GPIO讀取按鈕狀態(tài)

    樹莓派的GPIO可以控制發(fā)光二極管,這是GPIO的Output(輸出)能力,它也具有input(讀取)的能力,所以才能叫做I/O(輸入/輸出)端口。今天我們就來用GPIO的引腳讀取
    的頭像 發(fā)表于 07-02 15:06 ?1499次閱讀
    用GPIO<b class='flag-5'>讀取</b><b class='flag-5'>按鈕</b><b class='flag-5'>狀態(tài)</b>

    Windows IoT和Raspberry Pi:讀取按鈕

    電子發(fā)燒友網(wǎng)站提供《Windows IoT和Raspberry Pi:讀取按鈕.zip》資料免費下載
    發(fā)表于 07-10 11:13 ?0次下載
    Windows IoT和Raspberry Pi:<b class='flag-5'>讀取</b><b class='flag-5'>按鈕</b>

    通過SFC 51讀取CPU的指示燈狀態(tài)

    可以通過SFC 51讀取CPU的指示燈狀態(tài),使用的SSL_ID參數(shù)為16#74(16#19)讀取全部指示燈狀態(tài) 或者16#174(16#119)讀取
    的頭像 發(fā)表于 07-24 16:34 ?1458次閱讀
    通過SFC 51<b class='flag-5'>讀取</b>CPU的指示燈<b class='flag-5'>狀態(tài)</b>