如何規劃8051+programmble gain ampliter(PGA)+ADC 的程式流程圖 |
答題得分者是:㊣
|
bossshia
一般會員 發表:38 回覆:51 積分:17 註冊:2005-03-05 發送簡訊給我 |
|
ssejack
高階會員 發表:87 回覆:143 積分:106 註冊:2005-06-27 發送簡訊給我 |
Hi Bossshia
An simple example for auto-range search:
Meter spec. define
range1: /- 1V,
range2: /- 2V,
range3: /- 4V,
range4: /- 8V,
range5: /- 16V,
range6: /- 32V,
range7: /- 64V
Search procedure:
step1: set measurement range to range4.
step2: measurement voltage.
step3: if measurement result were over-range go to step 6
or go to step4.
step4: if the measurement result meet the best resolution
end the measurement procedure or go to step5.
step5: find a range for the best resolution(exp: measurement
result is 2.5V, change range to range3.)then go to step2.
step6: change range to rangeN
N = currently range (maximun range-currently range)/2.
go to step2.
|
㊣
版主 發表:261 回覆:2302 積分:1667 註冊:2005-01-04 發送簡訊給我 |
|
bossshia
一般會員 發表:38 回覆:51 積分:17 註冊:2005-03-05 發送簡訊給我 |
|
ssejack
高階會員 發表:87 回覆:143 積分:106 註冊:2005-06-27 發送簡訊給我 |
|
㊣
版主 發表:261 回覆:2302 積分:1667 註冊:2005-01-04 發送簡訊給我 |
嗯...給你個大概的方向..參考參考吧... 假設A/D為8bit,80H代表 0,FFH代表檔位+full range,00H代表檔位-full range
且硬體都無問題了(假設A/D範圍為0~5V, 2.5V為 0 ) 一開始測量時先將檔位切換在 +60/-60. 當A/D value < 181, >75 時(25V~-25V)則降至+25/-25 檔位. 若不在此範圍內則計算出實際值, 並設法顯示.(可寫為一個Display function) 假設得到A/D value為228, 則代表實際電壓為 (228-128)*60/127=+42.244V 降至檔位 +25/-25時, 當A/D value <154, >102 時(5V~-5V)則降至 5/-5檔位. 否則計算出實際值, 並設法顯示..........以此類推..... 加油囉~~~
------
------------------------------------------------------------------------- 走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!? |
bossshia
一般會員 發表:38 回覆:51 積分:17 註冊:2005-03-05 發送簡訊給我 |
前輩們:以下是小弟寫的自動換檔部分的程式,但是經過測試,也只有電壓1黨和電壓2檔部份的程式有動作,不知道是否還有哪有有誤呢??是否能請前輩們幫小弟檢查一下。(因為小弟的電路中有加上絕對值電路所以不管輸入電壓正或負皆可提供正電壓給ADC轉換) VI_RANGE:指示目前電壓的檔位 AD_VALUE:存放AD轉換值
V_MUL_ADCONV: V_RANGE1: CALL V_FORWARD ;判斷量測電壓的方向性 CLR AGC1_B ;換檔(電壓一檔)量測上限60V CLR AGC1_A ;/ CALL DELAY_0.1mS ;等待通道切換穩定 CALL ADCONV CLR C ;判斷電壓量測範圍 MOV A,AD_VALUE ;/ SUBB A,#103 ;/輸入量測為25V(AGC 2.02V,ADC值103) JC V_RANGE2 ;/ MOV VI_RANGE,#1 RET V_RANGE2: CLR AGC1_B ;換檔(電壓二檔)量測上限25V SETB AGC1_A ;/ CALL DELAY_0.1mS ;等待通道切換穩定 CALL ADCONV CLR C ;判斷電壓量測範圍 MOV A,AD_VALUE ;/ SUBB A,#47 ;/輸入量測為5V(AGC 0.931V,ADC值47) JC V_RANGE3 ;/ MOV VI_RANGE,#2 RET V_RANGE3: CLR AGC1_A ;換檔(電壓三檔)量測上限5V SETB AGC1_B ;/ CALL DELAY_0.1mS ;等待通道切換穩定 CALL ADCONV CLR C ;判斷電壓量測範圍 MOV A,AD_VALUE ;/ SUBB A,#47 ;/輸入量測為1V(AGC 0.939V,ADC值47) JC V_RANGE4 ;/ MOV VI_RANGE,#3 RET V_RANGE4: SETB AGC1_B ;換檔(電壓四檔)量測上限1V SETB AGC1_A ;/ CALL DELAY_0.1mS ;等待通道切換穩定 CALL ADCONV MOV VI_RANGE,#4 RET發表人 - bossshia 於 2005/10/07 14:49:33 |
㊣
版主 發表:261 回覆:2302 積分:1667 註冊:2005-01-04 發送簡訊給我 |
|
bossshia
一般會員 發表:38 回覆:51 積分:17 註冊:2005-03-05 發送簡訊給我 |
|
㊣
版主 發表:261 回覆:2302 積分:1667 註冊:2005-01-04 發送簡訊給我 |
|
bossshia
一般會員 發表:38 回覆:51 積分:17 註冊:2005-03-05 發送簡訊給我 |
前輩 因為小弟的數位電表做法是將ADC量測到的值,傳回電腦作運算,其中就有傳回AD轉換值及目前檔位的值,且都是傳回 AD值:FFH 檔位:2
遇到這種情形,實在讓小弟不知從何解決。
換檔操作:如下圖
ADC_CS REG P1.0 ADC_DI REG P1.1 ADC_CLK REG P1.2 ADC_DO REG P1.3 VPN REG P1.4 IPN REG P1.5 AGC1_B REG P2.3 AGC1_A REG P2.2 VI_RANGE EQU 41H AD_VALUE EQU 42H PN_VALUE EQU 43H ORG 00H JMP MAIN ;=========================串列埠中斷向量位址========================= ORG 23H JMP SERIAL_INT ;=========================主程式起始位址========================= ORG 100H MAIN: MOV SP,#60H ANL P2,#0F0H ;初始化電壓電流量測範圍為最大(使CD4051B選擇通道0) MOV TMOD,#020H ;模式2---8位元自動再載入型計時器 MOV PCON,#080H ;鮑率速度加倍 MOV TH1,#0FAH ;鮑率速度9600 bps SETB TR1 MOV SCON,#050H ;串列傳輸模式為模式1 ANL SCON,#0FCH MOV IE,#90H JMP $ ;===========================ADC0838量測副程式=========================== ADCONV: MOV R1,#05H MOV A,R2 CLR ADC_CLK SETB ADC_CS CLR ADC_DI CLR ADC_CS ADC_L1: RRC A MOV ADC_DI,C SETB ADC_CLK NOP CLR ADC_CLK DJNZ R1,ADC_L1 SETB ADC_CLK ;通道設定時間(開始轉換) NOP CLR ADC_CLK MOV R2,#08 ;轉換完成 將得到的資料儲存到A暫存器 ADC_L2: MOV C,ADC_DO RLC A SETB ADC_CLK NOP CLR ADC_CLK DJNZ R2,ADC_L2 MOV AD_VALUE,A RET ;===========================ADC0838多範圍量測副程式=========================== ;可程式增益放大器滿載4.9V(ADC值250) V_MUL_ADCONV: V_RANGE1: CALL V_FORWARD ;判斷量測電壓的方向性 CLR AGC1_B ;換檔(電壓一檔)量測上限60V CLR AGC1_A ;/ CALL DELAY_0.1mS ;等待通道切換穩定 CALL ADCONV CLR C ;判斷電壓量測範圍 MOV A,AD_VALUE ;/ SUBB A,#103 ;/輸入量測為25V(AGC 2.02V,ADC值103) JC V_RANGE2 ;/ MOV VI_RANGE,#1 RET V_RANGE2: CLR AGC1_B ;換檔(電壓二檔)量測上限25V SETB AGC1_A ;/ CALL DELAY_0.1mS ;等待通道切換穩定 CALL ADCONV CLR C ;判斷電壓量測範圍 MOV A,AD_VALUE ;/ SUBB A,#47 ;/輸入量測為5V(AGC 0.931V,ADC值47) JC V_RANGE3 ;/ MOV VI_RANGE,#2 RET V_RANGE3: CLR AGC1_A ;換檔(電壓三檔)量測上限5V SETB AGC1_B ;/ CALL DELAY_0.1mS ;等待通道切換穩定 CALL ADCONV CLR C ;判斷電壓量測範圍 MOV A,AD_VALUE ;/ SUBB A,#47 ;/輸入量測為1V(AGC 0.939V,ADC值47) JC V_RANGE4 ;/ MOV VI_RANGE,#3 RET V_RANGE4: SETB AGC1_B ;換檔(電壓四檔)量測上限1V SETB AGC1_A ;/ CALL DELAY_0.1mS ;等待通道切換穩定 CALL ADCONV MOV VI_RANGE,#4 RET ;===========================判斷量測電壓的方向性=========================== V_FORWARD: JNB VPN,V_N ;判斷電壓量測方向 MOV PN_VALUE,#0 ;/ RET ;/ V_N: MOV PN_VALUE,#0FFH ;/ RET ;==============================延時0.1mS副程式=========================== DELAY_0.1mS: MOV R3,#48 DJNZ R3,$ DJNZ R4,DELAY_0.1mS RET ;==============================延時40mS副程式=========================== DELAY_40mS: MOV R5,#100 ;延時40ms DL: MOV R6,#200 DJNZ R6,$ DJNZ R5,DL RET ;==============================延時100mS副程式=========================== DELAY_100mS: MOV R5,#249 ;/延時100毫秒 D1_1: MOV R6,#199 ;/ DJNZ R6,$ ;/ DJNZ R5,D1_1 RET ;===========================串列埠中斷副程式=========================== SERIAL_INT: CLR RI MOV A,SBUF AD1: CJNE A,#'D',EXIT ;設定ADC0838之通道選擇及信號源模式 ANL IE,#0EFH JNB RI,$ MOV A,SBUF CLR RI ORL IE,#10H MOV R2,A ACALL V_MUL_ADCONV ;量測副程式 MOV SBUF,#'D' JNB TI,$ CLR TI MOV SBUF,AD_VALUE ;傳回ad值 JNB TI,$ CLR TI MOV SBUF,VI_RANGE ;傳回檔位值 JNB TI,$ CLR TI MOV SBUF,PN_VALUE ;傳回正負值 JNB TI,$ CLR TI EXIT: RETI ;===========================程式結束=========================== END發表人 - bossshia 於 2005/10/08 16:35:09 發表人 - bossshia 於 2005/10/08 16:37:29 |
㊣
版主 發表:261 回覆:2302 積分:1667 註冊:2005-01-04 發送簡訊給我 |
你的serial 中斷副程式有問題. 你並沒有判斷到底是傳輸中斷還是接收中斷.
兩者做的事情應該不同. 依你這邊的情形, 應是傳輸中斷時只做清除旗標的動作就返回. 你這樣的寫法不管是傳輸中斷或接收中斷, 副程式都會做一次. 有可能這邊會當掉喔!
------
------------------------------------------------------------------------- 走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!? |
bossshia
一般會員 發表:38 回覆:51 積分:17 註冊:2005-03-05 發送簡訊給我 |
|
㊣
版主 發表:261 回覆:2302 積分:1667 註冊:2005-01-04 發送簡訊給我 |
你已經把傳送 UART 的指令擺在裡頭了. 當傳送完閉後, 產生中斷. 你的這個中斷程式又執行了一遍.若你的中斷程式未完成前, 資料已經傳送完閉=>中斷=>進入另一個中斷程式.......當超出你的堆疊範圍後程式就回不來了.而你的寫法是等它傳完. SO~~中斷一定會在第一個中斷程式執行完前就發生了=>幾次後程式就當了.... 你在
SERIAL_INT: 這邊先判斷是傳送中斷或讀取中斷 OK? 若是傳送中斷則 CLR TI =>RET 若為讀取中斷才做你的=> CLR RI =>..... 試試看你就知道了.
------
------------------------------------------------------------------------- 走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!? |
bossshia
一般會員 發表:38 回覆:51 積分:17 註冊:2005-03-05 發送簡訊給我 |
前輩 若是小弟將程式改成在傳送資料時不啟動串列中斷,如以下所列的程式。
;===========================串列埠中斷副程式=========================== SERIAL_INT: JB RI,REDATA (修改部分) CLR TI (修改部分) RETI (修改部分) REDATA: MOV A,SBUF CLR RI AD1: CJNE A,#'D',EXIT ;設定ADC0838之通道選擇及信號源模式 ANL IE,#0EFH ;在此關閉串列中斷(修改部分) JNB RI,$ MOV A,SBUF CLR RI MOV R2,A ACALL V_MUL_ADCONV ;量測副程式 MOV SBUF,#'D' JNB TI,$ CLR TI MOV SBUF,AD_VALUE ;傳回ad值 JNB TI,$ CLR TI MOV SBUF,VI_RANGE ;傳回檔位值 JNB TI,$ CLR TI MOV SBUF,PN_VALUE ;傳回正負值 JNB TI,$ CLR TI ORL IE,#10H ;傳送結束後再致能串列中斷(修改部分) EXIT: RETI但是,如果這樣可以解決串列中斷所引起當機的問題,可是小弟再重新量測時結果還是跟修改前一樣。那到底是程式還有哪裡不對勁呢?? |
bossshia
一般會員 發表:38 回覆:51 積分:17 註冊:2005-03-05 發送簡訊給我 |
|
㊣
版主 發表:261 回覆:2302 積分:1667 註冊:2005-01-04 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |