联系人:黄小姐
联系电话:0755-25848978, 83738778
传真号码:0755-83738639
公司地址:深圳市宝安区西乡街道宝源路深圳市名优工业产品展示采购中心B座1区五楼508号
Email:sales@sandat.com
邮编:518102
公司网址:http://www.sandat.com
SMT16030温度传感器与 68HC11 型单片机的连接
SMT16030温度传感器与 68HC11 型单片机的连接
H. Liefting
这个操作说明书描述了Smartec温度传感器如何与68HC11单片机连接。
支持两种输入形式: 捕获输入和规则输入。
A. 使用捕获输入
SMARTEC温度传感器有一个占空因数输出:
全周期
为了计算占空因数,必须获得两个测量结果。一个是一个全周期所用的时间,另一个是信号为高电平('1')的时间。两种时间都可以使用输入捕获计时器来测量。
当输入由逻辑'1'跳变为'0'时计时器启动。信号由'0'到'1'时,存储计时器中的内容。周期末端当信号由再次'1'到 '0'时,再次存储计时器中的内容。现在我们可以计算占空因数了。
每0.5ms可以获得一次全周期所用的时间 (t ) 和信号为高电平('1')时的时间 (t
)
利用这些时间来计算传感器的温度. 传感器的规格书中给出了下面的公式:
占空因数 (d.c.)= 0.31924 + 0.00472 x 温度 (℃)
所以温度是:211.9 x ( d.c. - 0.31924)。为了简便,在方程两边乘以2 (65536)来出去小数部分:
温度 x 65536 = 211.9 x ( 2 x d.c. - 20922),
或
309 x 温度 = 2 x d.c. – 20922
变量 d.c. x 2可以计算如下::信号是高电平的时间除以全周期时间。使用 'fdiv' 指令来进行除法操作。'fdiv' 指令乘完除数2
之后将划分两个16-bit数。这正是我们需要的。在从计算结果中减20922。之后我们获得309*温度。25度的温度将产生一个数值25 x 309 = 7725。使用这些数可以简化进一步的计算。
传感器输出信号频率在1 kHz和4 kHz 之间。 这表明每毫秒都能获得一个测量值。能够充分满足一般需求。我们测量不止一个值,而是测量100个周期然后取平均值。
*************************************************
* 温度测量
*************************************************
* 在输入信号的”still_to_do”阶段测量结果累加
* -周期总数表示为”periodsum”
* -信号总数中信号为'1' 的时间表示为”signalsum”
* 在每个周期的结束时,”still_to_do”低于电平1
* 如果保持信号”still_to_do”降为零, 测量完成求和将不再增加
* 经过一段时间调整,'meas_on' 标志位将被重置
* 开始测量:
* - 'meas_on' 标志位必须设置为 '1'
* -在测量过程中,必须用测量的平均周期数来初始化'still_to_do' *
* - 周期总数和信号总数必须设为0
程序段
* 温度测量的数据区
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
* 存储以便内部应用
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
* **次设置中断标志位
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
* 如果处于下降沿,我们处于周期的结束
* 一个周期的结束同时也是另一个周期的开始
sensorint1 equ $
tst meas_on |check if the measurement should be taken
beq sensorint4
* 当进行测量的时候
* 累计信号为“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
*如果需要测量更多的周期,测量是准备好的
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
***** 主程序的应用程序
程序段
* 测量温度,并将结果放在D中。结果表示为摄氏温度* 309的数值
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. 使用规则输入信号
输入捕获计时器是SMARTEC温度传感器的优选输入。但.SMARTEC传感器也能够和规则输入连接。程序要对输入进行扫描,然后确定扫描信号的信号/周期比率。这要通过积累抽样次数、信号为“1“的次数、然后用后面的除以前面的。
使用这种方法时,要考虑以下几点。
测量结果的分辨率由用来计算占空因数的抽样数目来决定。由于扫描处理很缓慢,在一个合理的时间内不可能积累大量的抽样信号。小数量的抽样将取得一个不太**的占空因数和温度。多次的扫描可以得到大量的抽样。但是在这样的情况下,测量值对温度的响应不够好。
记住非常重要的一点,传感器信号与抽样处理之间完全没有联系。如果传感器信号频率是(或是整数倍的)等于扫描信号频率,你会得到一个错误的结果。注意:传感器信号频率随温度变化很大。确保扫描是在传感器信号周期内随机进行的。
下面的编码可以由主程序调用来测量温度。在这个例子中假定测量程序作为主扫描循环的一部分,以固定间隔被调用。为了确保测量程序是在smartec’s周期内的随机时间被调用,测量程序中引入了一个随机延迟。如果你能保证测量程序是随机被访问的,也可以不引入随机延迟。测量值来自所有测量结果的累计,所以温度的读数将是相对大的数量取样的平均,也不会对温度的改变迅速响应。如果需要快速检测温度变化,那么不要累计测量结果,但要在每次测量前清空累加器。
*************************************************
* *大长度随机发生器
*************************************************
* 随机发生器由一个7位的移位寄存器实现,此移位寄存器的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 $
*************************************************
* 温度测量
*************************************************
* 多次累计
* - 在periodsum中有多少个取样
* - 在signalsum中为1的信号数
* 任何时候两个累加器中的值都超过 65535 (16 bits) ,两个寄存器中的值都除以2.
程序段
tempstart equ $ |the starting address of this module
* 温度测量数据区
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
*******从传感器连续多次取样
******* 取样次数放入 (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
* 温度测量, 结果放在 D中. 结果是
* 度数 (摄氏的温度) * 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