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

89S52與ADC0804 輸入電壓失真問題

尚未結案
ctmos
一般會員


發表:1
回覆:1
積分:0
註冊:2013-07-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2013-07-04 15:40:34 IP:61.219.xxx.xxx 訂閱
各位先進大大們,

小弟目前做專題,遇到一些問題,想請教各位大大

使用的編譯器是keil uVision4

我利用C語言寫if else的範圍判斷式,利用DAQ card 同時輸入兩個電壓值進入ADC0804 ,經過範圍判斷式後,將結果表現為LED輸出

但是現在,假設我輸入值是3.5V 顯示的燈 卻會是4~4.5V才會亮的燈,請問失真的原因是硬體的問題還是程式的問題?

請各位前輩們幫幫忙!!


電路圖,如附件所示~

程式碼如下:


#include
#define WR P1_7
#define INTR P1_6
#define ADC P3
#define WR2 P1_5
#define INTR2 P1_4
#define ADC2 P2
main()
{
while(1)
{
WR2=0;
WR=0;
WR=1;
while(INTR==1);
{
WR=0;
WR2=0;
WR2=1;
while(INTR2==1);
{
if((26<=ADC && ADC<53) && (26<=ADC2 && ADC2<53))
P0= 0x7f;
else if((53<=ADC && ADC<77) && (53<=ADC2 && ADC2<77))
P0= 0xbf;
else if((77<=ADC && ADC<102) && (77<=ADC2 && ADC2<102))
P0= 0xdf;
else if((102<=ADC && ADC<128) && (102<=ADC2 && ADC2<128))
P0= 0xef;
else if((128<=ADC && ADC<153) && (128<=ADC2 && ADC2<153))
P0= 0xf7;
else if((153<=ADC && ADC<186) && (153<=ADC2 && ADC2<186))
P0= 0xfb;
else if((186<=ADC && ADC<204) && (186<=ADC2 && ADC2<204))
P0= 0xfd;
else if((204<=ADC && ADC<230) && (204<=ADC2 && ADC2<230))
P0= 0xfe;
else {P0= 0x00;}
}
}
}
}

附加檔案:51d526f22e439_111.png
編輯記錄
ctmos 重新編輯於 2013-07-04 15:41:59, 註解 無‧
ctmos 重新編輯於 2013-07-04 15:42:00, 註解 無‧
ctmos 重新編輯於 2013-07-04 15:43:42, 註解 無‧
ctmos 重新編輯於 2013-07-05 10:17:34, 註解 無‧
ctmos 重新編輯於 2013-07-05 10:21:32, 註解 無‧
ctmos 重新編輯於 2013-07-05 10:24:36, 註解 無‧
kib72377
高階會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2013-07-04 22:19:07 IP:27.100.xxx.xxx 未訂閱
 你的程式邏輯有問題.

你希望什麼條件做什麼動作 說清楚先.




if((26<=ADC && ADC<53) && (26<=ADC2 && ADC2<53)) 像這樣頻繁操作ADC是很容易出問題的.
(因為光這一式,adc的值你就撈了2次,adc2也是2次,誰知道這2次的值會不會變?連後面的一串加起來十幾次,等於拿十幾次的亂數在作比較阿..)
先設2個臨時變數x,y來儲存 adc,adc2的值,然後再拿x,y去做比較...

編輯記錄
kib72377 重新編輯於 2013-07-05 19:48:36, 註解 無‧
kib72377 重新編輯於 2013-07-05 19:51:01, 註解 無‧
ctmos
一般會員


發表:1
回覆:1
積分:0
註冊:2013-07-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2013-07-05 10:31:14 IP:1.172.xxx.xxx 訂閱
感謝前輩的回答,前輩您好,

目前我利用ADLINK的DAQ card 結合 labview程式 定值輸出兩個電壓值,在經由兩顆ADC 輸入至89S52當中,透過上述所撰寫的程式,讓89s52完成我所指定的亮燈


假設我輸入兩個都是0.5V(換算後為26)~小於1V(換算後為53)範圍的電壓值,我希望他是能夠亮0x7f這個LED燈

如果是輸入兩個都是1V(換算後為53)~小於1.5V(換算後為77)範圍的電壓值,我希望他能夠亮0xbf這個LED燈

依此列推下去,做到4~4.5V範圍的電壓值,他能亮0Xfe這個LED燈~



目前後學遇到的問題是我輸入約0.8V左右,他的電燈就會顯示到0xbf這個LED燈上

之後的每一個範圍亮燈,都無法如我設定的值那樣跑,最大就是輸入兩個都是3.5V 則會亮4~4.5V範圍的這個0XfeLED燈

之後輸入3.6、3.7.....4,5V的電壓值, LED燈都沒有反應,請問會造成這樣失真的原因是哪個地方出問題了呢?

希望各位前輩能夠指點迷津,謝謝!!


PS:我有用三用電錶量測過從DAQ card進來的電壓值,都與我在 labview上輸入的電壓值一樣~





編輯記錄
ctmos 重新編輯於 2013-07-05 10:33:24, 註解 無‧
ctmos 重新編輯於 2013-07-05 10:34:11, 註解 無‧
系統時間:2017-10-24 13:58:31
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!