全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2945
推到 Plurk!
推到 Facebook!

I/O實現ADC功能

答題得分者是:ScottWang
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2012-01-03 15:28:15 IP:114.32.xxx.xxx 訂閱
請教各位前輩,請問如何利用MCU的I/O來實現ADC的功能呢^^?
不知道是不是關鍵字的問題,google沒找到我要的><
kib72377
高階會員


發表:1
回覆:217
積分:238
註冊:2004-11-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2012-01-03 18:46:38 IP:219.69.xxx.xxx 未訂閱
 R-2R電阻網路 加  類比 比較器,
用逐次逼近法求解,
參考 A/D轉換器架構去做極可.

如果是想用最少I/O數實現,
那就用 PWM輸出(在給它平均或積分?) 加 類比比較器.

PWM实现ADC和DAC - 鸟的天空


也可以用定電流充放電時間去計數,來充當ADC.
這裡有一篇:(不過進不去,只看到庫存頁面)

利用MCU I/O埠簡易A/D轉換輸入方案實現有譜- 學技術- 新電子科技雜誌


編輯記錄
kib72377 重新編輯於 2012-01-03 03:55:55, 註解 無‧
kib72377 重新編輯於 2012-01-03 03:59:30, 註解 無‧
kib72377 重新編輯於 2012-01-03 04:06:31, 註解 無‧
kib72377 重新編輯於 2012-01-03 09:18:31, 註解 無‧
ScottWang
版主


發表:32
回覆:486
積分:688
註冊:2009-04-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2012-01-03 19:56:53 IP:59.115.xxx.xxx 訂閱
請參考這裡有C sample和電路圖.
http://ikalogic.com/tut_adc.php
------
高壓直流電源供應器,高壓模組,測試LED專用AC LED定電流源,全範圍可調電壓電流,
中低壓直流電源供應器,電壓放大器,電流放大器,帶通濾波器,高精度參考電壓,
標準電壓,恆流源(定電流源),恆壓源(定電壓源),大電流電源供應器.
接受訂製,設計生產各種特殊規格,高精度產品,學校實驗室,研究單位實驗設備,
另可接受其它電子專案設計,HV Power,Vmax=20KV,Imax=2000A.
http://hvpower.myweb.hinet.net/
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2012-01-03 20:08:21 IP:114.32.xxx.xxx 訂閱
謝謝前輩們的幫忙,但需要比較器成本就會提高
小弟的主管是說有到利用計算RC充放電的時間來做ADC的
目前找到比較有關的文章有
http://www.dzsc.com/dzbbs/20060810/200765194820406902.html
http://hi.baidu.com/jim_xie/blog/item/1c650e3fc984b8e854e72397.html

但小弟不太了解的是,假設已經知道充放電時間,要怎麼對應到ADC的數值
是要建table來查表嗎^^?
不知道前輩有沒有相關的經驗呢?

再次謝謝各位
ScottWang
版主


發表:32
回覆:486
積分:688
註冊:2009-04-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2012-01-03 21:15:22 IP:59.115.xxx.xxx 訂閱
我記得很久以前有看過利用89C2051的P1.0(Ain0),P1.1(Ain1)的內部比較器來做類比的輸入資料讀取,詳情倒是忘了,再找看看能否找到.

===================
想到了.
目前想到的做法是:
1. 設定timer.
2. 由89C2051的Port P1.2送出Hi,啟動timer.
3. 由Port P3.6讀取信號,判斷為Hi或Lo,若為Hi,則停止Timer.
4. 抓取timer資料,程式利用公式或查表法進行計算電壓值.
動作簡略說明:
當要偵測Vin輸入的一個電壓時,MCU要先設定Timer,再由P1.2送出Hi電壓,並啟動timer,此Hi電壓經由RC(R1xC1)的時間後,會在P1.0(Ain0)形成另一個變化的電壓,此電壓與P1.1(Ain1)進行比較,若P1.0(Ain0)的電壓低於P1.1(Ain1),則P3.6所讀到的值為Lo,反之為Hi.
當P3.6所讀到的值為Lo時,表示參考電壓小於輸入電壓,因此timer繼續計數,程式繼續做檢查P3.6的工作.
當P3.6所讀到的值為Hi時,即將timer停止,不再計數,並將timer的值取出,再由公式或查表法進行計算電壓值.
目前想到的大概就是這樣,希望對你有些助益.
89C2051的P1.0(Ain0),P1.1(Ain1)的內部比較器,由P3.6內部讀取結果.
http://voltsandbytes.com/8051-tutorial-3-io-port-programming-in-c/
------
高壓直流電源供應器,高壓模組,測試LED專用AC LED定電流源,全範圍可調電壓電流,
中低壓直流電源供應器,電壓放大器,電流放大器,帶通濾波器,高精度參考電壓,
標準電壓,恆流源(定電流源),恆壓源(定電壓源),大電流電源供應器.
接受訂製,設計生產各種特殊規格,高精度產品,學校實驗室,研究單位實驗設備,
另可接受其它電子專案設計,HV Power,Vmax=20KV,Imax=2000A.
http://hvpower.myweb.hinet.net/
編輯記錄
ScottWang 重新編輯於 2012-01-03 06:35:41, 註解 無‧
ScottWang 重新編輯於 2012-01-03 09:48:34, 註解 補充資料.‧
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2012-01-04 19:45:52 IP:114.32.xxx.xxx 訂閱
謝謝前輩的指導,但我所使用的MCU有硬體上的限制,沒有比較器><
小弟今天有實作了一下我PO的第一個連結中5F 6F的方式,有一定程度的效果
程式大略如下:其中的rc_cnt的結果跟ADC值能有某種程度上的對應關係,
可能還是得查表或是找出關係式出來

while(1){
IO_2_In();
while (!Main_pinIO2){
} //wait RC stable
IO_2_Out();
IO_2_Low();
rc_cnt ;

}
}

ScottWang
版主


發表:32
回覆:486
積分:688
註冊:2009-04-27

發送簡訊給我
#7 引用回覆 回覆 發表時間:2012-01-04 21:29:52 IP:59.115.xxx.xxx 訂閱
沒有看到你說的第一個連結裡的5F 6F,但是裡面的作者有提到有加比較器,第2個連結的話,應該才是你要的,沒有加比較器,純粹利用I/O Port和以Timer去計算RC的時間,這種方式倒是不錯,只是沒試過不知其可用的最高頻率為何.

它用3支腳去做說明,但沒有講到ADC的輸入端,所以實際在使用時,應該是只要兩支腳就可以了,一支腳做MCU的輸入,一支腳做開關,做為是否開始計算RC時間時用,先輸出為Lo,做為放電用,再輸出為Hi,準備開始計時,Vin則接一個電阻再接到電容,MCU檢查輸入的那支腳是否變為Hi,若有變為Hi,再去抓出Timer的時間,以做進一步處理.
------
高壓直流電源供應器,高壓模組,測試LED專用AC LED定電流源,全範圍可調電壓電流,
中低壓直流電源供應器,電壓放大器,電流放大器,帶通濾波器,高精度參考電壓,
標準電壓,恆流源(定電流源),恆壓源(定電壓源),大電流電源供應器.
接受訂製,設計生產各種特殊規格,高精度產品,學校實驗室,研究單位實驗設備,
另可接受其它電子專案設計,HV Power,Vmax=20KV,Imax=2000A.
http://hvpower.myweb.hinet.net/

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#8 引用回覆 回覆 發表時間:2012-01-09 17:21:21 IP:60.249.xxx.xxx 訂閱
http://www.zlgmcu.com/philips/yingrong/lpc900/P89LPC901-ADC_DAC-UART.pdf

FYI.
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#9 引用回覆 回覆 發表時間:2012-01-09 17:33:02 IP:114.32.xxx.xxx 訂閱
不好意思沒說清楚,我指的是連結中5樓跟6樓的說明
方法就跟前輩後面那段描述是差不多的意思 ^^


===================引 用 ScottWang 文 章===================
沒有看到你說的第一個連結裡的5F 6F,但是裡面的作者有提到有加比較器,第2個連結的話,應該才是你要的,沒有加比較器,純粹利用I/O Port和以Timer去計算RC的時間,這種方式倒是不錯,只是沒試過不知其可用的最高頻率為何.

它用3支腳去做說明,但沒有講到ADC的輸入端,所以實際在使用時,應該是只要兩支腳就可以了,一支腳做MCU的輸入,一支腳做開關,做為是否開始計算RC時間時用,先輸出為Lo,做為放電用,再輸出為Hi,準備開始計時,Vin則接一個電阻再接到電容,MCU檢查輸入的那支腳是否變為Hi,若有變為Hi,再去抓出Timer的時間,以做進一步處理.
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#10 引用回覆 回覆 發表時間:2012-01-09 17:38:58 IP:114.32.xxx.xxx 訂閱
阿正前輩:

謝謝提供資料^^
我大概看了一下,若沒有誤會他的意思的話,似乎也是用比較器做ADC對嗎^^?

5.2 AD 功能的实现
P89LPC901 内部比较器与 PWM 输出电压逐次比较实现 AD 功能

小弟主要是要做PS3的搖桿,他有12顆類比按鍵,所以才有這需求
再次感謝前輩們的協助

===================引 用 文 章===================
http://www.zlgmcu.com/philips/yingrong/lpc900/P89LPC901-ADC_DAC-UART.pdf

FYI.

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#11 引用回覆 回覆 發表時間:2012-01-09 18:17:01 IP:60.249.xxx.xxx 訂閱
是的. 使用T1 mode6,類比較器(內部比較器) 
example code中convert function(取5次後平均), RC值若與電路不同須另外設delay time.

FYI
===================引 用 taishyang 文 章===================
阿正前輩:

謝謝提供資料^^
我大概看了一下,若沒有誤會他的意思的話,似乎也是用比較器做ADC對嗎^^?

5.2 AD 功能的实现
P89LPC901 内部比较器与 PWM 输出电压逐次比较实现 AD 功能

小弟主要是要做PS3的搖桿,他有12顆類比按鍵,所以才有這需求
再次感謝前輩們的協助

===================引 用 文 章===================
http://www.zlgmcu.com/philips/yingrong/lpc900/P89LPC901-ADC_DAC-UART.pdf

FYI.
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
DavidLo
高階會員


發表:17
回覆:225
積分:168
註冊:2004-07-21

發送簡訊給我
#12 引用回覆 回覆 發表時間:2012-01-10 00:28:47 IP:122.126.xxx.xxx 訂閱
MCU輸入邏輯位準
<0.8V : Logic 0
>2.4V : Logic 1
請問如何確定介於0.8V與2.4V之間的邏輯狀態?

如果是偵測電阻變化
可否將電阻值先轉變為頻率
再送到MCU的Timer輸入?
kib72377
高階會員


發表:1
回覆:217
積分:238
註冊:2004-11-12

發送簡訊給我
#13 引用回覆 回覆 發表時間:2012-01-10 08:15:13 IP:125.233.xxx.xxx 未訂閱
 數位輸入腳的 邏輯準位轉態 的電壓值,
每個ic都不同,甚至同ic不同pin也會不同,
要實際測量過才能抓準數據.
ScottWang
版主


發表:32
回覆:486
積分:688
註冊:2009-04-27

發送簡訊給我
#14 引用回覆 回覆 發表時間:2012-01-10 11:32:32 IP:218.161.xxx.xxx 訂閱
剛開始你沒有說明AD是用在那裡,我以為你是想用在#4第2個連結的AD來做為一般用途的ADC,雖然覺得有些怪怪的,但是並沒有察覺到怪在那裡.
後來你說明了用途,我重新再看了一下在第2個連結裡的內容,那個沒有用比較器的純I/O方式,它的方式只能用於測量電阻,但是卻不能用於測量一般如0~1~2~3~4~5V變化的電壓,因為輸入端的I/O無法判斷其由0~5之間變化的值,即使設定Timer也沒有用,但若是像連結內容所用的判斷電阻,因為電阻的一端是接到I/O,當電壓由0V轉變到5V,然後電流流經電阻的另一端向電容充電,在這個過程裡,可以用Timer來換算充電時間,而電容的兩端電壓,可能充電到I/O可以辨認的Hi最低電壓,例如2.4V,此時MCU停止Timer,這樣就可以由Timer的時間找出電阻與電容和充電電壓的關係.
------
高壓直流電源供應器,高壓模組,測試LED專用AC LED定電流源,全範圍可調電壓電流,
中低壓直流電源供應器,電壓放大器,電流放大器,帶通濾波器,高精度參考電壓,
標準電壓,恆流源(定電流源),恆壓源(定電壓源),大電流電源供應器.
接受訂製,設計生產各種特殊規格,高精度產品,學校實驗室,研究單位實驗設備,
另可接受其它電子專案設計,HV Power,Vmax=20KV,Imax=2000A.
http://hvpower.myweb.hinet.net/
ssejack
高階會員


發表:87
回覆:143
積分:106
註冊:2005-06-27

發送簡訊給我
#15 引用回覆 回覆 發表時間:2012-01-11 12:45:48 IP:1.169.xxx.xxx 未訂閱
插花一下, 用 IO的 VTH 判斷充電電位要小心,因為界於 VTHL / VTHH 太長可能會造成 latch-up 現象,不要省略比較器,或用單電源 OP 應該會比較沒問題! 只是個人意見.
系統時間:2024-11-23 13:24:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!