會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客



« 1 (2) 3 »


Re: PIC12LF1572 ADC 出來的數值錯誤
資深會員
註冊日期:
2007/06/05 21:45
所屬群組:
註冊會員
文章: 1031
等級: 28; EXP: 35
HP : 0 / 683
MP : 343 / 24897
離線
300附近, 沒錯啊!

0.95/3.2 * 1024 = 304

2016/08/31 14:48
轉換PDF檔 列印


Re: PIC12LF1572 ADC 出來的數值錯誤
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14850
等級: 73; EXP: 60
HP : 1089 / 1815
MP : 4950 / 82490
離線
我不懂你所說的電表的值? 與轉出來的值?

樓上的有算給你看,轉換出來的值應該是對的。

2016/09/01 10:38
轉換PDF檔 列印


Re: PIC12LF1572 ADC 出來的數值錯誤
新會員
註冊日期:
2016/08/02 14:12
所屬群組:
註冊會員
文章: 16
等級: 2; EXP: 74
HP : 0 / 43
MP : 5 / 420
離線
謝謝Jason跟Ryang兩位解答,

原來得到的值3xx是正常的, 原本一直以為得到的就會是9xx,

不過外部電壓沒辦法定電壓(電池損耗),

獲得的OUTPUT也會隨時間改變,

另外就是得到的值小數點出不來的問題F@@

謝謝你們的解答!

2016/09/01 13:50
轉換PDF檔 列印


Re: PIC12LF1572 ADC 出來的數值錯誤
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14850
等級: 73; EXP: 60
HP : 1089 / 1815
MP : 4950 / 82490
離線
這 ADC 因為使用的參考電壓是電池電壓,所以轉出來的數直也會等比率的變化。所以電池電壓下降轉換出來的輸直一樣不變的。

你可以照公式算算看。

2016/09/01 13:59
轉換PDF檔 列印


Re: PIC12LF1572 ADC 出來的數值錯誤
資深會員
註冊日期:
2007/06/05 21:45
所屬群組:
註冊會員
文章: 1031
等級: 28; EXP: 35
HP : 0 / 683
MP : 343 / 24897
離線
好了....

現在其實 ADC 轉換沒問題....

你說的"...不過外部電壓沒辦法定電壓(電池損耗),."
這個問題,也是可以補救的....

補救方法是...要先有一個"準"的(參考)值.
這個值就是FVR....
(這堨u講原理,要如何設定及達成,請自行參考相關datasheet...)

FVR 英文 Fixed Voltage Reference, 就是告訴我們,它就是一個
"準的",可以拿來參考的值....

如何使用呢?
1. 先看一下原來的ADC公式
Voltage = ADC Value / 1024 * Vref
註: 通常 Vref = VDD (你的電池 3.2V--不固定)

所以你 得到ADC Value= 304 則電壓為
Voltage = 304 / 1024 * 3.2 = 0.95 V
304 是輸入電壓相對得出(會對映輸入做變化)
1024 是固定的(10bits解析度的ADC)
3.2 電池電壓....
嗯,問題來了,今天量測ADC時電池還是3.2V,但明天,一周後,
一個月後,半年一年後...
可能變3.18, 3.15, 3.12, 3.09, 3.05, 3.00...愈來愈少...

你同樣是0.95V,但電池只剩3.00V , 得到ADC值為
0.95 / 3.00 * 1.024 = 324
但你的公式(燒進MCU程式)還一樣是(用電池3.2V來算)
Voltage = ADC / 1024 * 3.2 = 1.01 V
哇,糟了,計算結果1.01V與0.95V不一樣了(差了約6%)....

2. 講半天, FVR終於要上場了...
簡單的ADC公式,因為 外部電池會隨時慢慢沒電(沒固定),怎辦?
*一般產品會用電源供應器(固定電壓)---那就沒問題,不用討論.
VDD = 電池電壓 = 不固定 ...難到就不用嗎?
當然不是,而是改變一下,找一個準的參考,再根據"準確值"來
換算你要輸入電壓....

先舉一個例子: 假設 我們要量手機的長度(未知),
現在有好幾把尺,都沒有告訴你,它是 公制/英制/或XX制
另外呢,旁邊有合金的金屬塊,它的長度(固定)是 20.48公分
1. 先量 合金的金屬塊(20.48公分)
你用有刻度但不知單位的尺, 得到 64個單位(看起來好像沒用)
2. 再量 手機
A: 假設 量到 48個單位
剛剛量 合金,得到 64個單位 是20.48公分
現在手機 是48單位,就是3/4,得到 是15.36公分
公式是 手機長度 = 48/64 * 20.48 = 15.36公分
B: 再驗證一下,量手機寛度, 得到 30單位
手機寛度 = 30/64 * 20.48 = 9.6公分

好了,在量手機中,從頭到尾,我們都沒有提到那把尺,
總長多少, 每單位刻度是多少? 但需要有一個很重要的東西,
一個已知且"固定"的參考物(合金金屬塊(固定)20.48公分)

同樣的問題,我們現在回到ADC上,....
FVR故名思意(Fixed)就是提供一個"固定"的參考物(電壓)...
比照剛剛上面提到的,量手機的方法...
1. 先量 (合金)"固定"參考物(FVR)
註: FVR 可以是1.024,2.048,4.096...(但會小於VDD)
在此用FVR=2.048V(要用1.024V也是可以,只是比例與誤差問題)
不管 外在 電池電壓是多少?
A: 假設電池電壓為 3.2V
則 FVR Voltage = ADC /1024 * 3.2
2.048 = ADC / 1024 * 3.2
ADC = 2.048 / 3.2 * 1024 = 655.36
取整數 655
B: 再測 輸入電壓, 假設是0.95V
則 ADC = 0.95/3.2* 1024 = 304
* 再次提醒,我們不能用 3.2V(固定)公式反推
Voltage = 304/ 1024 * 3.2
因為 電池電壓 3.2V 會慢慢變(少)....
這時,又用 合金 計算方法...
剛剛量 FVR = 2.048V 得到 ADC值為 655
現在得 Sensor ADC值為 304
反推 Sensor Voltage = 304/655 * 2.048 = 0.95V
這時我們看一下公式
304 是Sensor輸出(ADC輸入電壓)對映值
655 會隨著電池電壓改變(可以與下方做比較...)
2.048 是固定的 FVR設好就固定(除非VDD太小)

再驗證一下:
假設 電池電壓從3.2V已經慢慢沒電變3.0V
Sensor輸出一樣是0.95V, 我們換算結果,還是一樣嗎?

A: 假設電池電壓為 3.0V
則 FVR Voltage = ADC /1024 * 3.0
2.048 = ADC / 1024 * 3.0
ADC = 2.048 / 3.0 * 1024 = 699.05
取整數 699 ---隨著電池電壓不同而改變
B: 再測 Sensor電壓, 假設一樣是0.95V
則 ADC = 0.95/3.0* 1024 = 324
電池電壓3.0, 一樣是0.95V測得,不再是304

這時一樣用 合金 轉換公式
剛剛量 FVR = 2.048V 得到 ADC值為 699
現在得 Sensor ADC值為 324
反推 Sensor Voltage = 324/699 * 2.048 = 0.949288V
一樣差不多是 0.95V

加入FVR之後不管, 電池是3.2V還是3.0V(或其他電壓)
同樣 sensor 0.95V ADC轉換 得出最後結果 都是 0.95V
(量測誤差及浮點數值計算問題不在此討論)

結論:
原先: 只量一次(Sensor 輸出 0.95V)
用"固定"電池電壓反推,會因為電池慢慢沒電,
最後轉換結果而不準...

改進: 量兩次(ADC轉換兩次),先量FVR,再量 Sensor
由於FVR是一個"準確"可參考電壓,同樣的Sensor輸出
雖然電池電壓(VDD)改變,最後 計算結果都相同(0.95V)
1. 量FVR, 保存 FVR ADC
2. 量Sensor
3. 計算結果 Voltage = Sensor ADC / FVR ADC * 2.048
註: VFR 可設為 1.024V, 2.048V, 4.096V (會小於VDD)

2016/09/01 16:34
轉換PDF檔 列印


Re: PIC12LF1572 ADC 出來的數值錯誤
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14850
等級: 73; EXP: 60
HP : 1089 / 1815
MP : 4950 / 82490
離線
感謝 jason680 的詳細說明。

2016/09/02 13:49
轉換PDF檔 列印


Re: PIC12LF1572 ADC 出來的數值錯誤
新會員
註冊日期:
2016/08/02 14:12
所屬群組:
註冊會員
文章: 16
等級: 2; EXP: 74
HP : 0 / 43
MP : 5 / 420
離線
感謝Jason非常清楚的說明,

我理解FVR的用意了,但還是有些問題想請教您..

在FVR_Initialize上面,我設定FVRCON = 0xC5;

也就是
1.Fixed Voltage Reference is enabled
2.Fixed Voltage Reference output is ready for use
3.Temperature indicator is disabled
4.VOUT = VDD – 2VT (Low Range)
5.Comparator FVR Buffer Gain is 1x, with output VCDAFVR = 1x VFVR
6.ADC FVR Buffer Gain is 1x, with output VADFVR = 1x VFVR

在此時,FVR設定值為1X也就是1.024的狀態

此時我電表量VDD(電池)電壓是2.8V
(這邊PIC內部有方法可以GET VDD嗎?)

因此我得到的值就為

FVRADC = 1.024 / 2.8 * 1024 = 374.5
Sensor ADC 得到 304
反推 Sensor Voltage = 304 / 374.5 * 1.024 = 0.83V
(量測的實際應該為0.96V)

還是有一段落差...是哪個環節不對呢?

非常感謝您願意花費時間提供協助!

2016/09/02 15:31
轉換PDF檔 列印


Re: PIC12LF1572 ADC 出來的數值錯誤
資深會員
註冊日期:
2007/06/05 21:45
所屬群組:
註冊會員
文章: 1031
等級: 28; EXP: 35
HP : 0 / 683
MP : 343 / 24897
離線
再多看幾遍吧....
(我自已也都看很多遍---以防寫錯/寫漏了...)

不要用假設的問題,問真實情形....

304 是 用3.2V電池量到的...
當電池是 2.8V時,又怎會是 304 ?
如果 304 永遠 都對應 0.95V,那事情就簡單了
304 * K = 0.95V , 那 K 再簡單不過了...

-------------------------------
另外要反推VDD也很簡單(前面有寫出來),就不提了...
A * K = B
(K固定), B變小, A相對也會變小
註: 可用B求得A, 也可以用A求出B...

除非你要檢測VDD(電池大小),"告警電池電壓太低"...
否則這個Sensor ADC轉換是不需要求出VDD的值
(算愈多速度愈慢,誤差愈多)....

2016/09/02 15:51

jason680 於 2016年09月02日 16:41:03
轉換PDF檔 列印


Re: PIC12LF1572 ADC 出來的數值錯誤
新會員
註冊日期:
2016/08/02 14:12
所屬群組:
註冊會員
文章: 16
等級: 2; EXP: 74
HP : 0 / 43
MP : 5 / 420
離線
您說的沒錯,我這邊做的的確不夠嚴謹

接著接上電源供應器來做測試,發現在同樣的情況下

不同電壓會得到不同的輸入值

2.7V 不動作
2.8V 301
2.9V 332
3.0V 934
3.1V 942
3.2V 956

數值竟會隨著電壓而改變

而且2.9-3.0V會跳一個很大的級距..

這些數值是沒處理過的uint_16輸出值!

2016/09/05 10:24
轉換PDF檔 列印


Re: PIC12LF1572 ADC 出來的數值錯誤
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14850
等級: 73; EXP: 60
HP : 1089 / 1815
MP : 4950 / 82490
離線
這數值看起來有問題,不會又如此大的變化。

2016/09/05 12:30
轉換PDF檔 列印



« 1 (2) 3 »



無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
Microchip連結
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project