欧美一区二区三区在线TV,亚洲Av无码国产精品色午夜软件,人妻内射中文字幕,精品人妻无码免费视频乱码,蜜桃午夜精品福利一区二区三区,国产欧美日韩黄色

聯(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-04-30 18:31
瀏覽次數(shù):12418
摘要:

用英特爾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ì)采樣率沒(méi)有影響。暫存器增量的速度是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é)果之間必須沒(méi)有相關(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)

汉阴县| 宜良县| 天柱县| 蕉岭县| 凭祥市| 浮梁县| 青川县| 体育| 黑山县| 南乐县| 宝兴县| 浦江县| 福安市| 渑池县| 五原县| 宁化县| 哈巴河县| 西华县|