聯(lián)系人:黃小姐
聯(lián)系電話:0755-25848978, 83738778
傳真號(hào)碼:0755-83738639
公司地址:深圳市寶安區(qū)西鄉(xiāng)街道寶源路深圳市名優(yōu)工業(yè)產(chǎn)品展示采購中心B座1區(qū)五樓508號(hào)
Email:sales@sandat.com
郵編:518102
公司網(wǎng)址:http://www.sandat.com
SMT16030溫度傳感器如何與MCS51單片機(jī)連接
用英特爾MCS-51 單片機(jī)測量占空因數(shù)
Paul C. de Jong and Ferry N. Toth
測量占空因數(shù)*快的方法是借助硬件的幫助。MCS-51單片機(jī)因?yàn)檠b備了兩個(gè)內(nèi)部計(jì)時(shí)器/計(jì)數(shù)器,因此為這樣使用提供了可能性。
端口INT0 (P3.2)和INT1 (P3.3)能通過硬件直接控制計(jì)時(shí)器/計(jì)數(shù)器。因此我們把它們看作“快速輸入”其他所有引腳只能通過軟件來控制計(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è)通過硬件測量占空因數(shù)的匯編程序。B)一個(gè)通過軟件測量的程序。*后我們將討論哪種情況可以改善分辨率。
A1. 通過INT0 引腳實(shí)現(xiàn)硬件控制的測量
當(dāng)使用硬件測量占空因數(shù)時(shí),關(guān)于CPU的任務(wù)執(zhí)行方面會(huì)有一些限制:計(jì)時(shí)器TIMER0和 TIMER1都被占用,通常TIMER1為通訊產(chǎn)生波特率。測量時(shí),CPU不允許發(fā)送或接收任何數(shù)據(jù)。
使用這種快速**的測量方法還有另一個(gè)限制,通過CPU空閑前的中斷信號(hào)來實(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 將通過中斷信號(hào)再次啟動(dòng)。這樣,CPU在中斷信號(hào)下會(huì)作出迅速反映。這種特殊的測量方法要求CPU不能運(yùn)行其他任何后臺(tái)程序,那樣會(huì)使測量和后臺(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只能由軟件來控制。TIMER1用來測量總的測量時(shí)間。一次測量完成后占空因數(shù) P由下面公式來決定。
contents of TIMER0
p= ---------------------------
contents of TIMER1
當(dāng)使用中斷信號(hào)使測量開始和停止時(shí),在信號(hào)跳變處可探測到的分辨率在1μs以內(nèi)。在輸入信號(hào)下降沿產(chǎn)生一個(gè)中斷信號(hào)(當(dāng)中斷標(biāo)志是激活的)。
用流程圖(fig. 2)說明測量。首先,設(shè)定兩個(gè)計(jì)時(shí)器的內(nèi)容。當(dāng)檢測到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)行。因此它測量輸入信號(hào)是1的時(shí)間。TIMER1在整個(gè)測量過程中都處于工作狀態(tài)。注意TIMER1啟動(dòng)3μs太遲了,因?yàn)橐粋€(gè)中斷處理要花費(fèi)3μs。但在停止時(shí)同樣也采用這種方式,所以在*后結(jié)果中消除了延遲。
關(guān)于測量時(shí)間,需要選擇固定周期數(shù)或固定測量時(shí)間。因?yàn)橹芷诳梢栽?/font>300μs到800μs之間變化,所以固定周期數(shù)是一個(gè)低效率的選擇。對(duì)周期短的信號(hào)的測量時(shí)間也會(huì)很短所以結(jié)果會(huì)受到取樣噪聲的干擾。因此對(duì)應(yīng)于16bits的機(jī)器周期選擇一個(gè)固定的測量時(shí)間。測量將在TIMER1產(chǎn)生溢出之后完成。這樣獲得17bits的結(jié)果,這些結(jié)果還需要復(fù)雜的軟件處理。使用帶有一個(gè)偏移的TIMER1初始化(測量前)解決了這個(gè)問題。這個(gè)偏移與兩個(gè)周期傳感器信號(hào)的*大長度相符合(時(shí)間上大概是1.6ms)。從17bits的結(jié)果中減去偏移量,就得到16bits的數(shù)據(jù)。
當(dāng)TIMER1產(chǎn)生一個(gè)溢出時(shí),測量必須停止(見圖2中右邊的分支)。傳感器信號(hào)的下一個(gè)1-0跳變發(fā)生時(shí),中斷使能標(biāo)志位被重置并且空閑模式再次被調(diào)用。中斷發(fā)生之后,TCON寄存器中的 TR0 和 TR1被清零。
對(duì)TIMER1中的偏移修正之后,利用兩個(gè)計(jì)時(shí)器中的內(nèi)容來計(jì)算占空比。
圖2 分辨率為一個(gè)機(jī)器周期的占空因數(shù)測量的流程圖
A2. 通過INT0 引腳串行通信測量
上一節(jié)所介紹的方法是使用8051空閑模式在中斷的瞬間(輸入信號(hào)的下降沿)和對(duì)TIMER0開始取樣的瞬間之間來產(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í)測量溫度和實(shí)現(xiàn)串行通信。可能需要串行通信像計(jì)時(shí)器一樣中斷它自己來產(chǎn)生波特率。使用33MHz 的8051能同時(shí)實(shí)現(xiàn)1200波特通信和占空因數(shù)測量,而不需要增加加硬件,如圖3所示。
這樣,Timer 1的溢出率需要用來產(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)來決定SMT160輸出信號(hào)的周期。
Timer 0保留其功能來累計(jì)周期信號(hào)的高電平。
當(dāng)然,由于我們使用了三個(gè)中斷處理器(INT0, TF1, Serial)中斷反應(yīng)時(shí)間不再是連續(xù)的。因此測量結(jié)果的分辨率將會(huì)衰減三倍。然而,這可以通過采用較高時(shí)鐘速度的處理器來進(jìn)行補(bǔ)償。
圖3同步測量和串行通信
A3.利用Timer 2測量占空因數(shù); 捕獲寄存器
許多8051派生處理器,包括8052和16 bit的 8051XA,都有一個(gè)附加的計(jì)時(shí)器,Timer 2 (圖. 4),Timer 2是一個(gè)**的16位的計(jì)時(shí)器/計(jì)數(shù)器,帶有一個(gè)捕獲/重載寄存器。在我們的應(yīng)用中,捕獲寄存器的功能是瞬時(shí)載入Timer 2(捕獲)的值,并將值保存起來,直到中斷處理器讀取它。消除了中斷反應(yīng)時(shí)間的影響,規(guī)定中斷反應(yīng)時(shí)間要小于中斷比率。
圖4 利用計(jì)時(shí)器2和計(jì)時(shí)器0測量占空因數(shù)
使用計(jì)時(shí)器2測量SMT160信號(hào)周期,Timer 0則用來測量高電平的時(shí)間。Timer 1用做串行接口波特率發(fā)生器。有時(shí),TIMER0不能為測量SMT16030的高電平時(shí)間留做備用,例如當(dāng)采用實(shí)時(shí)操作系統(tǒng)(RTOS)。實(shí)時(shí)操作系統(tǒng)的調(diào)度程序常需要一個(gè)時(shí)鐘信號(hào)來產(chǎn)生每個(gè)處理過程的時(shí)間片。在這種情況下Timer 0被實(shí)時(shí)操作系統(tǒng)使用,通過外加一個(gè)異或門(圖. 5),Timer2就足以測量SMT160的占空因數(shù),通過將觸發(fā)器的OUT端接到Timer 2的中斷處理器,上升沿和下降沿都可以獲取。
圖5 只用計(jì)時(shí)器2測量占空因數(shù)
A4.使用可編程記數(shù)器陣列(PCA)測量占空因數(shù)
8051FX派生系列有一個(gè)附加硬件:可編程記數(shù)器陣列。包括一個(gè)計(jì)時(shí)器和5個(gè)捕獲寄存器。計(jì)時(shí)器可以通過編程運(yùn)行在頻率Osc/12 或 Osc/4下。與普通8051相比,使用FX類型能夠在同樣測量時(shí)間里達(dá)到三倍的測量分辨率。
圖6 使用PCA測量占空因數(shù)
此外,捕獲寄存器可以通過編程來捕獲信號(hào)的上升沿或下降沿轉(zhuǎn)換,或兩者同時(shí)捕獲。所以不需要一個(gè)附加的異或門。因?yàn)榇瞬东@寄存器同時(shí)可用于上升沿和下降沿,所以使用這個(gè)系列的處理器中斷反應(yīng)時(shí)間不是必需的(圖. 6)。這意味著中斷處理器能夠可以通過**程序語言,如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;
}
我們通過主程序與中斷處理器連接。使用下列程序。
#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ù)測量,直到測量完成。檢測誤差并顯示結(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. 軟件測量
只有I/ O端口P3.2和 P3.3可以用來檢測中斷。因此,當(dāng)傳感器與其他I/ O端口相連,只有使用軟件才能測量占空因數(shù)。此外還需要兩個(gè)計(jì)數(shù)器。雖然是軟件控制,但也可能用到一個(gè)硬件計(jì)時(shí)器。TIMER0能夠計(jì)算測量時(shí)間??焖俚能浖绦蛴脕頊y量傳感器信號(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è)寄存器連接起來(低字節(jié)溢出檢測,根據(jù)測試結(jié)果對(duì)高字節(jié)增量)。提供了可供選擇的方案:當(dāng)輸入信號(hào)是低電平時(shí),HIGH_COUNTER等待直到信號(hào)變?yōu)楦唠娖?。這個(gè)時(shí)間可以用來計(jì)算HIGH_COUNTER(圖 7)。圖中展示了一個(gè)被稱作TEMPORARY_HIGH_COUNTER的暫存器的使用。此暫存器包含了一個(gè)周期內(nèi)輸入信號(hào)為高電平時(shí)的取樣數(shù)目。當(dāng)輸入信號(hào)變?yōu)榈碗娖剑瑫捍嫫鱐EMPORARY_HIGH_COUNTER中的值被累加到HIGH_COUNTER中,在這個(gè)計(jì)算時(shí)段,傳感器信號(hào)不再被取樣。
這對(duì)占空因數(shù)有一個(gè)限制。但計(jì)算只花費(fèi)15μs,對(duì)一個(gè)周期在600μs左右的信號(hào)來說,即使占空因數(shù)等于0.95,也不會(huì)出現(xiàn)問題。測量時(shí)間的計(jì)算存儲(chǔ)在硬件計(jì)時(shí)器/計(jì)數(shù)器TIMER0中,TIMER0使用軟件在輸入信號(hào)1-0跳變時(shí)來啟動(dòng)和停止。
圖7 a)占空因數(shù)軟件測量流程圖(測量高電平的部分)
b) 7a中的時(shí)間圖.。時(shí)間間隔時(shí)通過**高速存儲(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= 測量時(shí)間 (=N *T p)
N = 一次測量內(nèi)的周期數(shù)
輸入信號(hào)的周期在300μs (40℃)和800μs (-40 ℃ 或 120 ℃)之間。測量時(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.平均測量結(jié)果的理解
使用通用的A/D轉(zhuǎn)換器來平均測量結(jié)果不會(huì)提高分辨率。在特定條件下,平均測量結(jié)果可以提高占空因數(shù)測量的平均值。測量結(jié)果之間必須沒有相關(guān)性。當(dāng)SMT160信號(hào)周期不是處理器計(jì)時(shí)器周期的整數(shù)倍時(shí),這一點(diǎn)更為重要。我們可以通過使用頻率計(jì)數(shù)器測量下降沿的抖動(dòng)來確定這一點(diǎn),將閾值時(shí)間設(shè)為τms.。這種抖動(dòng)體現(xiàn)了τ的一個(gè)功能。這種效果可以在帶有數(shù)據(jù)終端緩沖器功能的示波器上顯示出來。這種功能允許在觸發(fā)后的第n個(gè)下降沿處放大。正如你所看到的一樣,抖動(dòng)隨著n的增大而增大。當(dāng)這個(gè)抖動(dòng)時(shí)間大于單片機(jī)計(jì)時(shí)器的周期時(shí),連續(xù)占空因數(shù)測量就不再具有相關(guān)性。這意味著當(dāng)檢測到連續(xù)測量之間的某一*小延遲后,分辨率將會(huì)與取樣數(shù)目的平方根成正比。
圖8 抖動(dòng)作為一個(gè)門時(shí)間功能
上圖是使用時(shí)鐘為1.25 MHz的微處理器實(shí)際測量的。用這種設(shè)備,量化噪聲大致等于兩次測量間隔1 ms的熱噪聲。這說明,對(duì)于不相關(guān)的占空因數(shù)測量,必須要有1 ms的時(shí)間間隔。由于具有電磁干擾等原因不同的設(shè)備噪音可能會(huì)有不同的特點(diǎn)。用圖中可以估計(jì)出使用4 MHz的微處理器(例如使用PCA的可以以16 MHz運(yùn)行的 8051FA),測量之間的零延遲也可以應(yīng)用。這樣可以獲得*大測量速度。