線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3385
推到 Plurk!
推到 Facebook!

如何規劃8051+programmble gain ampliter(PGA)+ADC 的程式流程圖

答題得分者是:
bossshia
一般會員


發表:38
回覆:51
積分:17
註冊:2005-03-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-10-01 13:17:45 IP:219.71.xxx.xxx 未訂閱
小弟正在製作一個具有自動換檔功能的電壓表,目前硬體架構已經設計好了。但是,目前小弟寫的8051程式,還無法達成目的,不知是否程式的架構有問題,能否請各位前輩提供一下相關的程式流程!!感激不盡~~
ssejack
高階會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-10-03 14:33:40 IP:59.105.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-10-03 16:15:42 IP:211.22.xxx.xxx 未訂閱
請大略敘述一下你的程式流程. 建議:為了保險起見, 一般都由最高檔位開始量, < 1/2 range才降檔.
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
bossshia
一般會員


發表:38
回覆:51
積分:17
註冊:2005-03-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-10-03 18:22:36 IP:219.71.xxx.xxx 未訂閱
非常感謝 ssejack 前輩與 ㊣前輩的回應。小弟的電壓檔位分別為 /- (60,25,5,1)V ,這些電壓檔位都是在電路先將電壓衰減20倍,在將電壓放大到4.9V,以供ADC有最大轉換空間。小弟所希望達到的程式流程,可以在量測60的最大檔位時,當量測值小於25V,就換到25V的檔位;在量測25V的最大檔位時,當量測值小於5V,就換到5V的檔位,以此類推。 不知若要結合ssejack 前輩與 ㊣前輩的做法,程式該如何規劃呢?? 煩請前輩們指教!!
ssejack
高階會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-10-04 09:11:57 IP:59.105.xxx.xxx 未訂閱
Hi Bossshia:    正大大說的沒錯! 我舉的例子,輸入須有鉗位保護才不會對線路造成危害!    其實您已有概念啦!只要寫一下code 做實驗吧?

版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-10-05 01:05:54 IP:203.203.xxx.xxx 未訂閱
嗯...給你個大概的方向..參考參考吧...    假設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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-10-07 13:24:44 IP:219.71.xxx.xxx 未訂閱
前輩們:以下是小弟寫的自動換檔部分的程式,但是經過測試,也只有電壓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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-10-07 14:14:09 IP:211.22.xxx.xxx 未訂閱
po程式方式請參考版規. 煩請修改配合!謝謝!
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
bossshia
一般會員


發表:38
回覆:51
積分:17
註冊:2005-03-05

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-10-07 14:51:18 IP:219.71.xxx.xxx 未訂閱
不好意思~~版大前輩 小弟已經將程式重新po過了,請見諒

版主


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-10-08 14:15:01 IP:61.70.xxx.xxx 未訂閱
你如何確定只有1.2檔有動作? 硬體上你如何做換檔的動作? 有完整的程式嗎?方便的話, po一下吧.從這邊看應該是沒有問題. 其他的會不會影響就不知道了.
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
bossshia
一般會員


發表:38
回覆:51
積分:17
註冊:2005-03-05

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-10-08 15:57:16 IP:219.71.xxx.xxx 未訂閱
前輩 因為小弟的數位電表做法是將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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-10-08 21:23:01 IP:61.70.xxx.xxx 未訂閱
你的serial 中斷副程式有問題. 你並沒有判斷到底是傳輸中斷還是接收中斷. 兩者做的事情應該不同. 依你這邊的情形, 應是傳輸中斷時只做清除旗標的動作就返回. 你這樣的寫法不管是傳輸中斷或接收中斷, 副程式都會做一次. 有可能這邊會當掉喔!
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
bossshia
一般會員


發表:38
回覆:51
積分:17
註冊:2005-03-05

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-10-08 22:57:25 IP:219.71.xxx.xxx 未訂閱
前輩~~因為小弟的串列埠中斷副程式,必須要先接收一個判斷數值(1 byte),然後再接收一個ADC0838的通道選擇數值(1 byte),所以程式才會這樣寫。不過,之前在得到ADC0838的通道選擇數值後,只有呼叫一次轉換副程式,再傳回電腦都很正常。所以,小弟就更迷惑了~~

版主


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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-10-08 23:17:07 IP:61.70.xxx.xxx 未訂閱
你已經把傳送 UART 的指令擺在裡頭了. 當傳送完閉後, 產生中斷. 你的這個中斷程式又執行了一遍.若你的中斷程式未完成前, 資料已經傳送完閉=>中斷=>進入另一個中斷程式.......當超出你的堆疊範圍後程式就回不來了.而你的寫法是等它傳完. SO~~中斷一定會在第一個中斷程式執行完前就發生了=>幾次後程式就當了.... 你在 SERIAL_INT: 這邊先判斷是傳送中斷或讀取中斷 OK? 若是傳送中斷則 CLR TI =>RET 若為讀取中斷才做你的=> CLR RI =>..... 試試看你就知道了.
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
bossshia
一般會員


發表:38
回覆:51
積分:17
註冊:2005-03-05

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-10-09 12:33:38 IP:219.71.xxx.xxx 未訂閱
前輩 若是小弟將程式改成在傳送資料時不啟動串列中斷,如以下所列的程式。    
;===========================串列埠中斷副程式===========================            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

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-10-10 02:02:18 IP:219.71.xxx.xxx 未訂閱
前輩 小弟的問題終於解決了~~ 感謝前輩們多日來的指導~~

版主


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

發送簡訊給我
#17 引用回覆 回覆 發表時間:2005-10-10 17:01:17 IP:203.203.xxx.xxx 未訂閱
不好意思!這兩天度假中 沒時間~也沒電腦可以上來看看~~ 呵...問題有解決就好!加油喔!^_^
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
系統時間:2024-05-20 1:59:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!