亚洲伦理在线,www.黄片在线,成人熟女在线,有吗在线视频

  • <p id="sjllw"><span id="sjllw"><del id="sjllw"></del></span></p>

    <p id="sjllw"><pre id="sjllw"></pre></p>

      
      
      <i id="sjllw"></i>
      <pre id="sjllw"><label id="sjllw"><label id="sjllw"></label></label></pre>
      <p id="sjllw"><span id="sjllw"><del id="sjllw"></del></span></p><i id="sjllw"></i>
      <p id="sjllw"><span id="sjllw"><del id="sjllw"></del></span></p>

            聯(lián)系方式
            聯(lián)系人:黃小姐
            聯(lián)系電話:0755-25848978, 83738778
            傳真號(hào)碼:0755-83738639
            公司地址:深圳市寶安區(qū)西鄉(xiāng)街道寶源路深圳市名優(yōu)工業(yè)產(chǎn)品展示采購(gòu)中心B座1區(qū)五樓508號(hào)
            Email:sales@sandat.com
            郵編:518102
            公司網(wǎng)址:http://www.sandat.com
            文章詳情

            SMT16030溫度傳感器如何與MCS51單片機(jī)連接

            日期:2025-06-26 07:40
            瀏覽次數(shù):12501
            摘要:

            用英特爾MCS-51 單片機(jī)測(cè)量占空因數(shù)

            Paul C. de Jong and Ferry N. Toth

            測(cè)量占空因數(shù)*快的方法是借助硬件的幫助。MCS-51單片機(jī)因?yàn)檠b備了兩個(gè)內(nèi)部計(jì)時(shí)器/計(jì)數(shù)器,因此為這樣使用提供了可能性。

            端口INT0 (P3.2)INT1 (P3.3)能通過(guò)硬件直接控制計(jì)時(shí)器/計(jì)數(shù)器。因此我們把它們看作“快速輸入”其他所有引腳只能通過(guò)軟件來(lái)控制計(jì)時(shí)器/計(jì)數(shù)器。包括傳感器SMT 160在內(nèi)的內(nèi)部硬件結(jié)構(gòu)如圖1所示。

                             圖1  8051內(nèi)部硬件結(jié)構(gòu)

            此應(yīng)用指南描述了:A)四個(gè)通過(guò)硬件測(cè)量占空因數(shù)的匯編程序。B)一個(gè)通過(guò)軟件測(cè)量的程序。*后我們將討論哪種情況可以改善分辨率。

            A1通過(guò)INT0 引腳實(shí)現(xiàn)硬件控制的測(cè)量

            當(dāng)使用硬件測(cè)量占空因數(shù)時(shí),關(guān)于CPU的任務(wù)執(zhí)行方面會(huì)有一些限制:計(jì)時(shí)器TIMER0 TIMER1都被占用,通常TIMER1為通訊產(chǎn)生波特率。測(cè)量時(shí),CPU不允許發(fā)送或接收任何數(shù)據(jù)。

            使用這種快速**的測(cè)量方法還有另一個(gè)限制,通過(guò)CPU空閑前的中斷信號(hào)來(lái)實(shí)現(xiàn)。這很重要,因?yàn)樵谥噶钐幚頃r(shí)會(huì)觸發(fā)中斷,而觸發(fā)中斷的指令首先被完成而且不同指令執(zhí)行時(shí)間不一樣。在空閑期間CPU不動(dòng)作。兩個(gè)計(jì)時(shí)器對(duì)空閑指令不動(dòng)作,這是MCS-51的一個(gè)重要特性。CPU 將通過(guò)中斷信號(hào)再次啟動(dòng)。這樣,CPU在中斷信號(hào)下會(huì)作出迅速反映。這種特殊的測(cè)量方法要求CPU不能運(yùn)行其他任何后臺(tái)程序,那樣會(huì)使測(cè)量和后臺(tái)程序均出錯(cuò)。

            計(jì)時(shí)器/計(jì)數(shù)器選擇工作在16-bits計(jì)時(shí)模式下。因此,計(jì)時(shí)器/計(jì)數(shù)器模式控制寄存器當(dāng)值是19H時(shí)啟動(dòng)。這種模式下TIMER0只有當(dāng)P3.2是邏輯1時(shí)才工作,而TIMER1只能由軟件來(lái)控制。TIMER1用來(lái)測(cè)量總的測(cè)量時(shí)間。一次測(cè)量完成后占空因數(shù) P由下面公式來(lái)決定。

             

            contents of TIMER0

            p=  ---------------------------

            contents of TIMER1

            當(dāng)使用中斷信號(hào)使測(cè)量開始和停止時(shí),在信號(hào)跳變處可探測(cè)到的分辨率在1μs以內(nèi)。在輸入信號(hào)下降沿產(chǎn)生一個(gè)中斷信號(hào)(當(dāng)中斷標(biāo)志是激活的)。

            用流程圖(fig. 2)說(shuō)明測(cè)量。首先,設(shè)定兩個(gè)計(jì)時(shí)器的內(nèi)容。當(dāng)檢測(cè)到0-1跳變時(shí),初始部分開始傳輸。然后,中斷信號(hào)使能標(biāo)記被賦值并且調(diào)用空閑模式。此刻處理器等待中斷。當(dāng)輸入信號(hào)產(chǎn)生下一個(gè)1-0跳變時(shí),產(chǎn)生中斷,設(shè)定計(jì)數(shù)器控制寄存器內(nèi)的TR0 TR1(TCON)?,F(xiàn)在只有當(dāng)P3.2變?yōu)楦唠娖綍r(shí)TIMER0才運(yùn)行。因此它測(cè)量輸入信號(hào)是1的時(shí)間。TIMER1在整個(gè)測(cè)量過(guò)程中都處于工作狀態(tài)。注意TIMER1啟動(dòng)3μs太遲了,因?yàn)橐粋€(gè)中斷處理要花費(fèi)3μs。但在停止時(shí)同樣也采用這種方式,所以在*后結(jié)果中消除了延遲。

            關(guān)于測(cè)量時(shí)間,需要選擇固定周期數(shù)或固定測(cè)量時(shí)間。因?yàn)橹芷诳梢栽?/font>300μs800μs之間變化,所以固定周期數(shù)是一個(gè)低效率的選擇。對(duì)周期短的信號(hào)的測(cè)量時(shí)間也會(huì)很短所以結(jié)果會(huì)受到取樣噪聲的干擾。因此對(duì)應(yīng)于16bits的機(jī)器周期選擇一個(gè)固定的測(cè)量時(shí)間。測(cè)量將在TIMER1產(chǎn)生溢出之后完成。這樣獲得17bits的結(jié)果,這些結(jié)果還需要復(fù)雜的軟件處理。使用帶有一個(gè)偏移的TIMER1初始化(測(cè)量前)解決了這個(gè)問(wèn)題。這個(gè)偏移與兩個(gè)周期傳感器信號(hào)的*大長(zhǎng)度相符合(時(shí)間上大概是1.6ms)。從17bits的結(jié)果中減去偏移量,就得到16bits的數(shù)據(jù)。

            當(dāng)TIMER1產(chǎn)生一個(gè)溢出時(shí),測(cè)量必須停止(見圖2中右邊的分支)。傳感器信號(hào)的下一個(gè)1-0跳變發(fā)生時(shí),中斷使能標(biāo)志位被重置并且空閑模式再次被調(diào)用。中斷發(fā)生之后,TCON寄存器中的 TR0  TR1被清零。

            對(duì)TIMER1中的偏移修正之后,利用兩個(gè)計(jì)時(shí)器中的內(nèi)容來(lái)計(jì)算占空比。

            圖2  分辨率為一個(gè)機(jī)器周期的占空因數(shù)測(cè)量的流程圖

            A2. 通過(guò)INT0 引腳串行通信測(cè)量 

            上一節(jié)所介紹的方法是使用8051空閑模式在中斷的瞬間(輸入信號(hào)的下降沿)和對(duì)TIMER0開始取樣的瞬間之間來(lái)產(chǎn)生一個(gè)恒定延遲(中斷反映時(shí)間)。這是必須的,因?yàn)橹噶钐幚碛|發(fā)中斷時(shí),這個(gè)指令首先被完成,并且不是所有指令的執(zhí)行時(shí)間都是相同的。

            在空閑模式期間,任何指令都不被執(zhí)行,因?yàn)榇藭r(shí)8051的執(zhí)行模塊不可用。但中斷計(jì)時(shí)器和串行模塊在運(yùn)行。這種模式下功耗顯著減少。

            為了實(shí)現(xiàn)恒定的反映時(shí)間。只能有一個(gè)中斷源是可用的(像圖一中所示的)。但有時(shí)我們需要同時(shí)測(cè)量溫度和實(shí)現(xiàn)串行通信??赡苄枰型ㄐ畔裼?jì)時(shí)器一樣中斷它自己來(lái)產(chǎn)生波特率。使用33MHz 8051能同時(shí)實(shí)現(xiàn)1200波特通信和占空因數(shù)測(cè)量,而不需要增加加硬件,如圖3所示。

            這樣,Timer 1的溢出率需要用來(lái)產(chǎn)生波特率。使用32.9856 MHz的晶體計(jì)時(shí)器TIMER1需要計(jì)數(shù)859個(gè)時(shí)鐘才能溢出。假定使用16位模式,Timer 1溢出位產(chǎn)生一個(gè)中斷(TF1)重載分配器的值。因?yàn)槲覀兪褂玫氖且粋€(gè)快速的處理器,所以同樣的中斷處理器能夠在短時(shí)間內(nèi)為軟件計(jì)數(shù)器增量。軟件計(jì)數(shù)器與Timer 1的實(shí)際值相結(jié)合作為一個(gè)時(shí)間基準(zhǔn)來(lái)決定SMT160輸出信號(hào)的周期。

            Timer 0保留其功能來(lái)累計(jì)周期信號(hào)的高電平。

            當(dāng)然,由于我們使用了三個(gè)中斷處理器(INT0, TF1, Serial)中斷反應(yīng)時(shí)間不再是連續(xù)的。因此測(cè)量結(jié)果的分辨率將會(huì)衰減三倍。然而,這可以通過(guò)采用較高時(shí)鐘速度的處理器來(lái)進(jìn)行補(bǔ)償。

            圖3同步測(cè)量和串行通信

            A3.利用Timer 2測(cè)量占空因數(shù)捕獲寄存器

            許多8051派生處理器,包括805216 bit 8051XA,都有一個(gè)附加的計(jì)時(shí)器,Timer 2 (. 4),Timer 2是一個(gè)**的16位的計(jì)時(shí)器/計(jì)數(shù)器,帶有一個(gè)捕獲/重載寄存器。在我們的應(yīng)用中,捕獲寄存器的功能是瞬時(shí)載入Timer 2(捕獲)的值,并將值保存起來(lái),直到中斷處理器讀取它。消除了中斷反應(yīng)時(shí)間的影響,規(guī)定中斷反應(yīng)時(shí)間要小于中斷比率。

            圖4 利用計(jì)時(shí)器2和計(jì)時(shí)器0測(cè)量占空因數(shù)

            使用計(jì)時(shí)器2測(cè)量SMT160信號(hào)周期,Timer 0則用來(lái)測(cè)量高電平的時(shí)間。Timer 1用做串行接口波特率發(fā)生器。有時(shí),TIMER0不能為測(cè)量SMT16030的高電平時(shí)間留做備用,例如當(dāng)采用實(shí)時(shí)操作系統(tǒng)(RTOS)。實(shí)時(shí)操作系統(tǒng)的調(diào)度程序常需要一個(gè)時(shí)鐘信號(hào)來(lái)產(chǎn)生每個(gè)處理過(guò)程的時(shí)間片。在這種情況下Timer 0被實(shí)時(shí)操作系統(tǒng)使用,通過(guò)外加一個(gè)異或門(. 5),Timer2就足以測(cè)量SMT160的占空因數(shù),通過(guò)將觸發(fā)器的OUT端接到Timer 2的中斷處理器,上升沿和下降沿都可以獲取。

            圖5  只用計(jì)時(shí)器2測(cè)量占空因數(shù)

            A4.使用可編程記數(shù)器陣列(PCA)測(cè)量占空因數(shù) 

            8051FX派生系列有一個(gè)附加硬件:可編程記數(shù)器陣列。包括一個(gè)計(jì)時(shí)器和5個(gè)捕獲寄存器。計(jì)時(shí)器可以通過(guò)編程運(yùn)行在頻率Osc/12  Osc/4下。與普通8051相比,使用FX類型能夠在同樣測(cè)量時(shí)間里達(dá)到三倍的測(cè)量分辨率。

            圖6 使用PCA測(cè)量占空因數(shù)

            此外,捕獲寄存器可以通過(guò)編程來(lái)捕獲信號(hào)的上升沿或下降沿轉(zhuǎn)換,或兩者同時(shí)捕獲。所以不需要一個(gè)附加的異或門。因?yàn)榇瞬东@寄存器同時(shí)可用于上升沿和下降沿,所以使用這個(gè)系列的處理器中斷反應(yīng)時(shí)間不是必需的(. 6)。這意味著中斷處理器能夠可以通過(guò)**程序語(yǔ)言,如C語(yǔ)言,來(lái)控制寫入。下面給出了通過(guò)中斷處理器測(cè)量SMT160信號(hào)n個(gè)周期的例子。

            void PCAHandler(void) interrupt 6 using 1 {

               static union Word2Byte CaptureUp, CaptureDo;

               if (PCAOverFlow) { /* PCA Overflow? */

                  PCAOverFlow = FALSE;

                  if (!Ready) {

                     if (OverFlow > 3) { /* 3 overflows => error */

                        SetCaptureOff(); /* Capture off */

                        PCACapture0 = FALSE; /* Clear flags */

                        PCACapture1 = FALSE;

                        Ready = TRUE; /* measurement done */

                Error = TRUE;

                     } else {

                        OverFlow++;

                          };

                     };

                } else {

                  if (PCACapture1) { /* rising edge? */

                     PCACapture1 = FALSE; /* Clear flag */

                     if (!Ready) {

                        CaptureDo.Byte.Hi = CCAP1H; /* save PCA value */

                        CaptureDo.Byte.Lo = CCAP1L;

                        HiTime += (CaptureDo.Word - CaptureUp.Word);

                     }; /* determine low period */

                  } else {

                     PCACapture0 = FALSE;

                     if (!Ready) {

                        CaptureUp.Byte.Hi = CCAP0H;   /* save PCA counter */

                        CaptureUp.Byte.Lo = CCAP0L;

                        if (First) {

            st

                           First = FALSE; /* 1  time just caputure value */

                   HiTime = LoTime = 0;

                           SetPCA1NegEdge(); /* enable falling edges */

                        } else {

                           LoTime += (CaptureUp.Word - CaptureDo.Word);

                           if (--Count == 0) { /* when Count = 0 ready */

                              SetCaptureOff(); /* capture off */

                              PCACapture0 = FALSE; /* clear flags */

                              PCACapture1 = FALSE;

                              PCAOverFlow = FALSE;

                              Ready = TRUE; /* measurement ready */

                           };

                        }; /* determine high period */

                     };

                  };

                  if (!Ready) {

                  };

                  OverFlow = 0; /* we have a signal */

               };

               return;

            }

            我們通過(guò)主程序與中斷處理器連接。使用下列程序。

            #include <pca.h>

            #include <stdio.h>

            #define PERIODS 25

            struct DoubleByte {

              unsigned char Hi, Lo;

            };

            union Word2Byte {

              unsigned short Word;

              struct DoubleByte Byte;

            };

            static volatile bit First, Ready, Error;

            static volatile unsigned int Count = 0, Periods = 51;

            static volatile unsigned char OverFlow;

            static volatile unsigned long HiTime, LoTime;

            void StartCount(void) {

               First = TRUE; /* Initializes all varialbes */

               OverFlow = 0;

               Count = Periods;

               Ready = FALSE;

               Error = FALSE;

               SetPCA0PosEdge(); /* Enable capture */

            }

            void SetPeriods(unsigned APeriods) {

               Periods = APeriods;

            }

            bit IsReady(void) {

               return(Ready);

            }

            bit IsError(void) {

               return(Error);

            }

            float GetDutyCycle(void) {

               return (float)HiTime / (HiTime + LoTime);

            }

            主程序需要初始化中斷處理器一次,然后重復(fù)測(cè)量,直到測(cè)量完成。檢測(cè)誤差并顯示結(jié)果。

            main() {

               SetPeriods(51);

               while(TRUE) {

                  StartCount();

                  while(!IsReady()); continue;

                  if(IsError()) printf("An error has occured\n");

                  else printf(!°The termperature is %f\n!

                     (GetDutycycle() - 0.32) / 0.0047));

               }

            }

            B. 軟件測(cè)量

            只有I/ O端口P3.2 P3.3可以用來(lái)檢測(cè)中斷。因此,當(dāng)傳感器與其他I/ O端口相連,只有使用軟件才能測(cè)量占空因數(shù)。此外還需要兩個(gè)計(jì)數(shù)器。雖然是軟件控制,但也可能用到一個(gè)硬件計(jì)時(shí)器。TIMER0能夠計(jì)算測(cè)量時(shí)間??焖俚能浖绦蛴脕?lái)測(cè)量傳感器信號(hào)為“1”的狀態(tài)。結(jié)果儲(chǔ)存在名字為HIGH_COUNTER的計(jì)數(shù)器中。計(jì)時(shí)器TIMER0每個(gè)機(jī)器周期都增加,機(jī)器周期需要花費(fèi)1μs,軟件取樣率花費(fèi)3μs。要獲得占空因數(shù)p,依據(jù)等式HIGH_COUNTER需要乘3。

             

            HIGH COUNTER X 3

            p=---------------------------

            TIMER0

            通常HIGH_COUNTER 應(yīng)該存儲(chǔ)的數(shù)據(jù)多于8位,因此需要兩個(gè)8位寄存器。這就減小了取樣速度,因?yàn)?,需要兩個(gè)命令把這兩個(gè)寄存器連接起來(lái)(低字節(jié)溢出檢測(cè),根據(jù)測(cè)試結(jié)果對(duì)高字節(jié)增量)。提供了可供選擇的方案:當(dāng)輸入信號(hào)是低電平時(shí),HIGH_COUNTER等待直到信號(hào)變?yōu)楦唠娖?。這個(gè)時(shí)間可以用來(lái)計(jì)算HIGH_COUNTER( 7)。圖中展示了一個(gè)被稱作TEMPORARY_HIGH_COUNTER的暫存器的使用。此暫存器包含了一個(gè)周期內(nèi)輸入信號(hào)為高電平時(shí)的取樣數(shù)目。當(dāng)輸入信號(hào)變?yōu)榈碗娖?,暫存器TEMPORARY_HIGH_COUNTER中的值被累加到HIGH_COUNTER中,在這個(gè)計(jì)算時(shí)段,傳感器信號(hào)不再被取樣。

            這對(duì)占空因數(shù)有一個(gè)限制。但計(jì)算只花費(fèi)15μs,對(duì)一個(gè)周期在600μs左右的信號(hào)來(lái)說(shuō),即使占空因數(shù)等于0.95,也不會(huì)出現(xiàn)問(wèn)題。測(cè)量時(shí)間的計(jì)算存儲(chǔ)在硬件計(jì)時(shí)器/計(jì)數(shù)器TIMER0中,TIMER0使用軟件在輸入信號(hào)1-0跳變時(shí)來(lái)啟動(dòng)和停止。

            圖7 a)占空因數(shù)軟件測(cè)量流程圖(測(cè)量高電平的部分)

            b) 7a中的時(shí)間圖.。時(shí)間間隔時(shí)通過(guò)**高速存儲(chǔ)器計(jì)算HIGH_COUNTER。

            暫存器不需要計(jì)算,所以這個(gè)動(dòng)作對(duì)采樣率沒有影響。暫存器增量的速度是3μs。  

            例:占空因數(shù)調(diào)制信號(hào)的采樣噪聲的標(biāo)準(zhǔn)偏差可以用下面的等式計(jì)算。

            where: t連續(xù)采樣間隔時(shí)間

                  T輸入信號(hào)周期

                  T測(cè)量時(shí)間 (=N *T p)

                  N = 一次測(cè)量?jī)?nèi)的周期數(shù)

             

            輸入信號(hào)的周期在300μs (40)800μs (-40   120 )之間。測(cè)量時(shí)間大約64 ms

             (因?yàn)榇嬖谄扑孕∮?×1μs)。當(dāng)取樣率是1μs時(shí),取樣噪聲在5 ×10和10(5.7*10-5和9.33*10-5)。根據(jù)經(jīng)驗(yàn),數(shù)值的95%都分布在主值的±2σ范圍之內(nèi) (正態(tài)分布).。

            取樣率是3μs時(shí),取樣噪聲是它的三倍。

            C.平均測(cè)量結(jié)果的理解

            使用通用的A/D轉(zhuǎn)換器來(lái)平均測(cè)量結(jié)果不會(huì)提高分辨率。在特定條件下,平均測(cè)量結(jié)果可以提高占空因數(shù)測(cè)量的平均值。測(cè)量結(jié)果之間必須沒有相關(guān)性。當(dāng)SMT160信號(hào)周期不是處理器計(jì)時(shí)器周期的整數(shù)倍時(shí),這一點(diǎn)更為重要。我們可以通過(guò)使用頻率計(jì)數(shù)器測(cè)量下降沿的抖動(dòng)來(lái)確定這一點(diǎn),將閾值時(shí)間設(shè)為τms.。這種抖動(dòng)體現(xiàn)了τ的一個(gè)功能。這種效果可以在帶有數(shù)據(jù)終端緩沖器功能的示波器上顯示出來(lái)。這種功能允許在觸發(fā)后的第n個(gè)下降沿處放大。正如你所看到的一樣,抖動(dòng)隨著n的增大而增大。當(dāng)這個(gè)抖動(dòng)時(shí)間大于單片機(jī)計(jì)時(shí)器的周期時(shí),連續(xù)占空因數(shù)測(cè)量就不再具有相關(guān)性。這意味著當(dāng)檢測(cè)到連續(xù)測(cè)量之間的某一*小延遲后,分辨率將會(huì)與取樣數(shù)目的平方根成正比。

             

            圖8 抖動(dòng)作為一個(gè)門時(shí)間功能

            上圖是使用時(shí)鐘為1.25 MHz的微處理器實(shí)際測(cè)量的。用這種設(shè)備,量化噪聲大致等于兩次測(cè)量間隔1 ms的熱噪聲。這說(shuō)明,對(duì)于不相關(guān)的占空因數(shù)測(cè)量,必須要有1 ms的時(shí)間間隔。由于具有電磁干擾等原因不同的設(shè)備噪音可能會(huì)有不同的特點(diǎn)。用圖中可以估計(jì)出使用4 MHz的微處理器(例如使用PCA的可以以16 MHz運(yùn)行的 8051FA),測(cè)量之間的零延遲也可以應(yīng)用。這樣可以獲得*大測(cè)量速度。

             

            粵公網(wǎng)安備 44030602001744號(hào)