文章详情

SMT16030温度传感器与 68HC11 型单片机的连接

日期:2019-11-14 08:11
浏览次数:6111
摘要:

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)。为了简便,在方程两边乘以(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 kHz4 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“的次数、然后用后面的除以前面的。

使用这种方法时,要考虑以下几点。

测量结果的分辨率由用来计算占空因数的抽样数目来决定。由于扫描处理很缓慢,在一个合理的时间内不可能积累大量的抽样信号。小数量的抽样将取得一个不太**的占空因数和温度。多次的扫描可以得到大量的抽样。但是在这样的情况下,测量值对温度的响应不够好。

记住非常重要的一点,传感器信号与抽样处理之间完全没有联系。如果传感器信号频率是(或是整数倍的)等于扫描信号频率,你会得到一个错误的结果。注意:传感器信号频率随温度变化很大。确保扫描是在传感器信号周期内随机进行的。

下面的编码可以由主程序调用来测量温度。在这个例子中假定测量程序作为主扫描循环的一部分,以固定间隔被调用。为了确保测量程序是在smartecs周期内的随机时间被调用,测量程序中引入了一个随机延迟。如果你能保证测量程序是随机被访问的,也可以不引入随机延迟。测量值来自所有测量结果的累计,所以温度的读数将是相对大的数量取样的平均,也不会对温度的改变迅速响应。如果需要快速检测温度变化,那么不要累计测量结果,但要在每次测量前清空累加器。

*************************************************

*大长度随机发生器

*************************************************

随机发生器由一个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

粤公网安备 44030602001744号