聯(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溫度傳感器與 68HC11 型單片機(jī)的連接
SMT16030溫度傳感器與 68HC11 型單片機(jī)的連接
H. Liefting
這個操作說明書描述了Smartec溫度傳感器如何與68HC11單片機(jī)連接。
支持兩種輸入形式: 捕獲輸入和規(guī)則輸入。
A. 使用捕獲輸入
SMARTEC溫度傳感器有一個占空因數(shù)輸出:
全周期
為了計(jì)算占空因數(shù),必須獲得兩個測量結(jié)果。一個是一個全周期所用的時間,另一個是信號為高電平('1')的時間。兩種時間都可以使用輸入捕獲計(jì)時器來測量。
當(dāng)輸入由邏輯'1'跳變?yōu)?/font>'0'時計(jì)時器啟動。信號由'0'到'1'時,存儲計(jì)時器中的內(nèi)容。周期末端當(dāng)信號由再次'1'到 '0'時,再次存儲計(jì)時器中的內(nèi)容?,F(xiàn)在我們可以計(jì)算占空因數(shù)了。
每0.5ms可以獲得一次全周期所用的時間 (t ) 和信號為高電平('1')時的時間 (t
)
利用這些時間來計(jì)算傳感器的溫度. 傳感器的規(guī)格書中給出了下面的公式:
占空因數(shù) (d.c.)= 0.31924 + 0.00472 x 溫度 (℃)
所以溫度是:211.9 x ( d.c. - 0.31924)。為了簡便,在方程兩邊乘以2 (65536)來出去小數(shù)部分:
溫度 x 65536 = 211.9 x ( 2 x d.c. - 20922),
或
309 x 溫度 = 2 x d.c. – 20922
變量 d.c. x 2可以計(jì)算如下::信號是高電平的時間除以全周期時間。使用 'fdiv' 指令來進(jìn)行除法操作。'fdiv' 指令乘完除數(shù)2
之后將劃分兩個16-bit數(shù)。這正是我們需要的。在從計(jì)算結(jié)果中減20922。之后我們獲得309*溫度。25度的溫度將產(chǎn)生一個數(shù)值25 x 309 = 7725。使用這些數(shù)可以簡化進(jìn)一步的計(jì)算。
傳感器輸出信號頻率在1 kHz和4 kHz 之間。 這表明每毫秒都能獲得一個測量值。能夠充分滿足一般需求。我們測量不止一個值,而是測量100個周期然后取平均值。
*************************************************
* 溫度測量
*************************************************
* 在輸入信號的”still_to_do”階段測量結(jié)果累加
* -周期總數(shù)表示為”periodsum”
* -信號總數(shù)中信號為'1' 的時間表示為”signalsum”
* 在每個周期的結(jié)束時,”still_to_do”低于電平1
* 如果保持信號”still_to_do”降為零, 測量完成求和將不再增加
* 經(jīng)過一段時間調(diào)整,'meas_on' 標(biāo)志位將被重置
* 開始測量:
* - 'meas_on' 標(biāo)志位必須設(shè)置為 '1'
* -在測量過程中,必須用測量的平均周期數(shù)來初始化'still_to_do' *
* - 周期總數(shù)和信號總數(shù)必須設(shè)為0
程序段
* 溫度測量的數(shù)據(jù)區(qū)
DATA space
still_to_do rmb 1 |number of periods to accumulate
meas_on rmb 1 |flag to indicate the measurement is running
periodsum rmb 3 |accumulates period times
signalsum rmb 3 |accumulates '1' time of the signal
* 存儲以便內(nèi)部應(yīng)用
periodstart rmb 2 |startingtime of a period
starttime1 rmb 2 |time at which the signal became '1'
* 溫度測量初始化
程序段
clr meas_on
clr still_to_do |no measurement active
ldab #$7E |initialize the interrupt vector
stab tic1int
ldd #sensorint
std tic1int+1
ldx #regsbeg |start measuring a falling edge
bclr tctl2-regsbeg,x,edg1a
bset tctl2-regsbeg,x,edg1b
ldab #ic1f clear possibly pending interrupt
stab tflg1-regsbeg,x
bset tmsk1-regsbeg,x,ic1i
jmp tempend |end of the initialization
* 溫度測量子程序
程序段
*******輸入中斷程序 *******
sensorint equ $
ldx #regsbeg |let IX point at the I/O registers
* **次設(shè)置中斷標(biāo)志位
ldab #ic1f
stab tflg1-regsbeg,x
* 確定是上升沿還是下降沿
brclr tctl2-regsbeg,x,edg1a,sensorint1
*如果是上升沿, 我們是在測量中間階段
* 記錄下上升沿時間
ldd tic1-regsbeg,x
std starttime1
* 等待下降沿
bclr tctl2-regsbeg,x,edg1a
bset tctl2-regsbeg,x,edg1b
bra sensorint9
* 如果處于下降沿,我們處于周期的結(jié)束
* 一個周期的結(jié)束同時也是另一個周期的開始
sensorint1 equ $
tst meas_on |check if the measurement should be taken
beq sensorint4
* 當(dāng)進(jìn)行測量的時候
* 累計(jì)信號為“1”的總時間
ldd tic1-regsbeg,x
subd starttime1
addd signalsum+1
std signalsum+1
ldaa signalsum
adca #0
staa signalsum
* 存儲總的周期時間
ldd tic1-regsbeg,x
subd periodstart
addd periodsum+1
std periodsum+1
ldaa periodsum
adca #0
staa periodsum
* one more period done, one less to do
dec still_to_do
bne sensorint4
*如果需要測量更多的周期,測量是準(zhǔn)備好的
clr meas_on
* 記錄下新的周期開始的時間
sensorint4 ldd tic1-regsbeg,x
std periodstart
* 等待一個上升沿
bset tctl2-regsbeg,x,edg1a
bclr tctl2-regsbeg,x,edg1b
sensorint9 rti
* 開始測量100個周期
startmeas equ $
tpa |save the condition-code register on the stack
psha |(using A)
sei |temporarily block the interrupts
ldaa #100
staa still_to_do
ldd #0
std periodsum |clear the results
staa periodsum+2
std signalsum
staa signalsum+2
ldab #1 |start the measurement
stab meas_on
pula |retrieve the condition-code register
tap |from the stack (using A)
rts
***** 主程序的應(yīng)用程序
程序段
* 測量溫度,并將結(jié)果放在D中。結(jié)果表示為攝氏溫度* 309的數(shù)值
grad equ 309
meas_temp equ $
pshx |save IX on the stack
bsr startmeas |start a measurement of 256 periods
meas_temp0 tst meas_on |wait until the measurement is ready
bne meas_temp0
mess_temp1 ldab periodsum |scale both times back to values that
orab signalsum |will fit in 16 bits
beq meas_temp2 |do this by dividing both values by 2
lsr periodsum |until both are within the 16-bit range
ror periodsum+1
ror periodsum+2
lsr signalsum
ror signalsum+1
ror signalsum+2
bra mess_temp1
meas_temp2 ldx periodsum+1
ldd signalsum+1
fdiv |calculate the duty-cycle
xgdx |put the result into D
subd #20922 |then correct (see explanation in handbook)
pulx |retrieve IX from the stack
rts
B. 使用規(guī)則輸入信號
輸入捕獲計(jì)時器是SMARTEC溫度傳感器的優(yōu)選輸入。但.SMARTEC傳感器也能夠和規(guī)則輸入連接。程序要對輸入進(jìn)行掃描,然后確定掃描信號的信號/周期比率。這要通過積累抽樣次數(shù)、信號為“1“的次數(shù)、然后用后面的除以前面的。
使用這種方法時,要考慮以下幾點(diǎn)。
測量結(jié)果的分辨率由用來計(jì)算占空因數(shù)的抽樣數(shù)目來決定。由于掃描處理很緩慢,在一個合理的時間內(nèi)不可能積累大量的抽樣信號。小數(shù)量的抽樣將取得一個不太**的占空因數(shù)和溫度。多次的掃描可以得到大量的抽樣。但是在這樣的情況下,測量值對溫度的響應(yīng)不夠好。
記住非常重要的一點(diǎn),傳感器信號與抽樣處理之間完全沒有聯(lián)系。如果傳感器信號頻率是(或是整數(shù)倍的)等于掃描信號頻率,你會得到一個錯誤的結(jié)果。注意:傳感器信號頻率隨溫度變化很大。確保掃描是在傳感器信號周期內(nèi)隨機(jī)進(jìn)行的。
下面的編碼可以由主程序調(diào)用來測量溫度。在這個例子中假定測量程序作為主掃描循環(huán)的一部分,以固定間隔被調(diào)用。為了確保測量程序是在smartec’s周期內(nèi)的隨機(jī)時間被調(diào)用,測量程序中引入了一個隨機(jī)延遲。如果你能保證測量程序是隨機(jī)被訪問的,也可以不引入隨機(jī)延遲。測量值來自所有測量結(jié)果的累計(jì),所以溫度的讀數(shù)將是相對大的數(shù)量取樣的平均,也不會對溫度的改變迅速響應(yīng)。如果需要快速檢測溫度變化,那么不要累計(jì)測量結(jié)果,但要在每次測量前清空累加器。
*************************************************
* *大長度隨機(jī)發(fā)生器
*************************************************
* 隨機(jī)發(fā)生器由一個7位的移位寄存器實(shí)現(xiàn),此移位寄存器的bit5和bit6異或后反饋給bit0.
DATA space
seed rmb 1 |the shift register's seed
PROGRAM space
** 初始化
ldaa #1
staa seed |init. the register to anything but 0
jmp randomend
******* get a random number (1..127) from the generator into (B)
getrandom equ $
ldab seed |get current seed
aslb |shift left to XOR bit6 with bit5
eorb seed
aslb
aslb |resulting bit is now in the carry flag
rol seed |rotate new bit into shift register
ldab seed |get the new random number
andb #$7F
rts
randomend equ $
*************************************************
* 溫度測量
*************************************************
* 多次累計(jì)
* - 在periodsum中有多少個取樣
* - 在signalsum中為1的信號數(shù)
* 任何時候兩個累加器中的值都超過 65535 (16 bits) ,兩個寄存器中的值都除以2.
程序段
tempstart equ $ |the starting address of this module
* 溫度測量數(shù)據(jù)區(qū)
DATA space
periodsum rmb 3 |counts samples taken
signalsum rmb 3 |counts samples valued '1'
* 溫度測量初始化
PROGRAM space
ldd #0
std periodsum |clear the counters
staa periodsum+2
std signalsum
staa signalsum+2
jmp tempend |end of the initialization
*溫度測量的子程序
程序段
******* 從傳感器取一次樣
take_sample equ $
ldab porta |get the signal into bit0 of accumulator (B)
asrb
asrb
andb #bit0 |mask out only the smartec signal
clra |add sample to accumulator
addd signalsum+1
std signalsum+1
ldaa signalsum
adca #0
staa signalsum
ldd #1 |add one more sample to the sample coun
addd periodsum+1
std periodsum+1
ldaa periodsum
adca #0
staa periodsum
rts
*******從傳感器連續(xù)多次取樣
******* 取樣次數(shù)放入 (B)中
take_samples equ $
pshb |take the required number of samples
bsr take_sample
pulb
decb
bne take_samples
take_samples0 ldab periodsum |scale both accumulators back to values that
orab signalsum |will fit in 16 bits
beq take_samps9 |do this by dividing both values by 2
lsr periodsum |until both are within the 16-bit range
ror periodsum+1
ror periodsum+2
lsr signalsum
ror signalsum+1
ror signalsum+2
bra take_samples0
take_samps9 rts
* 溫度測量, 結(jié)果放在 D中. 結(jié)果是
* 度數(shù) (攝氏的溫度) * 309
meas_temp equ $
pshx
jsr getrandom |get a random number into (B)
meas_temp0 decb |and use that to generate a random delay
bne meas_temp0
ldab #50
bsr take_samples
ldx periodsum+1
ldd signalsum+1
fdiv |calculate the duty-cycle
xgdx |put the result into D
subd #20922 |then correct (see explanation in handbook)
pulx |retrieve IX from the stack
rts
tempend equ $ |end of this module
* the number of bytes this module requires in the PROGRAM area
tempsize equ tempend-tempstart