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