1 温度传感器MAX6662
MAX6662是一款12位+符号位温度传感器,在单片封装中还集成了可编程过温报警和三线(SPI兼容)串行接口。它使用内部A/D转换器将其管芯温度转换为数字量。温度数据以13位字的形式存储在温度寄存器中,分辨率为0.062 5 ℃,温度数据可在任意时刻通过串口读取。工作电压范围为+3~+5.5 V,温度范围为-55~+150 ℃。
1.1 MAX6662的引脚定义
如图1所示,MAX6662采用8引脚SO封装。其接口信号描述如下: SCLK为串行时钟输入;CS为片选信号,低电平时使能串行数据的输入、输出;SIO为串行数据输入输出,双向口;ALERT为过温报警,温度过高或过低时默认输出低电平,可编程设置为高;OT为高温报警,温度过高时默认输出低电平,可编程设置为高。其中,ALERT和OT均为漏极开路,使用时需要加上拉电阻。
图1 MAX6662引脚图
1.2 MAX6662工作寄存器
MAX6662有6个工作寄存器:温度寄存器、配置寄存器、THYST寄存器、TMAX寄存器、TLOW寄存器和THIGH寄存器。
(1) 温度寄存器
温度寄存器为只读寄存器,MSB位为符号位(bit15);接下来的12位是温度数据位,最新转换的温度数据以℃为单位存储于温度寄存器,其中高8位表示温度整数位,低4位为小数位;3位最低有效位为温度标志位,显示报警信息,分别为Tover标志、Thigh标志、Tlow标志。
(2) 配置寄存器
配置寄存器只使用了第8~12位,用于配置MAX6662的工作模式,如表1所列。
表1 配置寄存器各位的定义
(3) 温度界限寄存器
TLOW寄存器、THIGH寄存器和THYST寄存器用于设置温度界限来触发ALERT;TMAX寄存器、THYST寄存器用于设置OT的温度极限。这些温度界限寄存器使用9位高位(符号位和8位数据位),双精度格式,1位最小单位,剩余7位保留。
1.3 MAX6662命令字
命令字第1位为高电平,代表传输开始;第2位是读/写位,高电平时读。总共有11个有效命令,温度转换持续进行并且可通过串行口异步读取。一旦读取温度寄存器,正在进行的转换失败并且把之前的转换结果输出。命令字定义如表2所列。
表2 命令字定义
1.4 MAX6662的工作模式
(1) 比较模式
此模式下,对于ALERT,当温度超过TMAX寄存器的值或低于TLOW寄存器的值时,ALERT输出低电平;温度低于THIGH-THYST,或高于TLOW + THYST时,ALERT输出高电平。
对于OT,当温度超过TMAX的值时建立OT(即变低);温度低于TMAX-THYST时,OT输出高电平。
读操作均不能复位OT、ALERT,默认条件下,OT、ALERT均为低有效的输出信号,但可以在配置寄存器中配置为高。
(2) 关断模式
MAX6662的一个特色是可编程的关断模式。将配置寄存器的关断位置1,即可进入关断模式。关断模式下,除了POR电源复位和串口外,其他工作均被禁止;所有寄存器的值都被保留,温度寄存器保留最后的温度转换值。
1.5 MAX6662的通信协议与数据格式
串行接口包括3条信号线:片选CS(低有效)、双向数据线SIO和串行时钟SCLK。其中,CS和SCLK只受主机控制,主机和MAX6662共同控制SIO。当主机发送数据时,数据在上升沿被送入MAX6662。读数据时,数据在下降沿被读出。命令字节和数据字的MSB位首先写入或读出。前8个时钟周期用于传送命令字,命令字由SIO输入MAX6662。该命令字决定接下来16个周期的数据由主机还是MAX6662来控制。如果由MAX6662来控制SIO,则开始于第8个时钟周期的下降沿。通信时序如图2所示。
图2 通信时序
温度寄存器存储12位的转换数据和1位温度符号位,能确定的温度范围为-55~+155 ℃,数据传送格式如表3所列。
表3 数据传送格式
2 应用电路设计
2.1 硬件电路设计
图3 硬件接口电路
MAX6662传感器与MCS51系列单片机AT89S52的硬件接口电路如图3所示。
MAX6662的SIO、SCLK、CS脚分别与AT89S52的P1.0、P1.1、P1.2脚连接,用于模拟三线SPI总线,以实现传感器串行数据的传输。报警端口OT和ALERT均为漏极开路端,使用时需要接上拉电阻,因此均经过10 kΩ的电阻接地;同时分别连接AT89S52的P3.3和P3.2脚,用于触发外部中断,实现报警操作。MAX6662的VCC脚经0.1 μF的电容接地,用于滤除干扰。
2.2 传感器数据的读取
每次有效的数据传输只能使用24个时钟周期,数据的读取分为2步(读取前应首先置CS为低):
① 前8个周期,单片机向传感器发送读取寄存器命令,可以读取传感器所有寄存器的值。此时为单片机向传感器串行发送数据,数据在时钟的上升沿送入传感器。
② 后16个周期,传感器将寄存器的值串行送入数据线SIO,由单片机接收。此时为单片机接收传感器的串行数据,数据在时钟的下降沿送入单片机。即由MAX6662来控制SIO,数据的传输开始于第8个时钟周期的下降沿。
数据读取程序如下:
sbit CS=P1^2;//芯片片选
sbit SCLK=P1^1;//SPI串行时钟
sbit SIO=P1^0;//数据线
void command(uchar com){//写命令字函数
CS=1;//置芯片无效
SCLK=0;//拉低时钟线,使之从低电平开始
delay();//延时10 ms
CS=0;//选择芯片
delay();//延时10 ms
for(i=0;i<8;i++){//发送8位命令字
SIO= com&0x80;//命令字发送,首先发送最高位
SCLK=1;//时钟变换
delay();//延时10 ms
com=com<<1;
if(i!=7)//使第8个时钟周期以高电平结束
SCLK=0;
delay();//延时10 ms
}
}
uint datar(void){//数据的读取
uint dat;
for(i=0;i<16;i++) {
SCLK=0;//下降沿开始数据读取
delay();//延时
dat|=(P1&0x01);//读取串行数据
SCLK=1;//开始一个新的时钟周期
delay();
if(i!=15)
dat=dat<<1;//把读取的数据存入dat
}
CS=1;//禁止芯片
SCLK=0;//保证下次数据传输时钟从低电平开始
return(dat);
}
程序运行结束后,传感器送到单片机中的值就会存入变量dat中,以便后面的数据处理使用。
2.3 传感器数据的写入
向MAX6662传感器中写数据的功能主要是用于配置传感器或是规定报警温度值,每次写入也必须是24个时钟周期。数据的写入也分为2步:
① 前8个周期完成的操作与数据的读取相同,命令字各位在时钟的上升沿送入传感器。
② 后16个周期,主机控制SIO数据线将要写入的数据一位一位地送入数据线SIO。与读取数据不同的是,数据的写入开始于第9个时钟周期的上升沿,因为主机发送数据时,数据在上升沿时送入传感器。
写命令的函数与数据读取相同,数据写入程序如下:
void dataw(void) {
SCLK=0;
delay();//延时
for(i=0;i<16;i++) {
SIO=wdata&0x8000;//取最高位
SCLK=1;//上升沿进行数据传输
delay();//延时
SCLK=0;//时钟变换
delay();
wdata=wdata<<1;//把数据放入wdata的最低位
}
CS=1;//禁止芯片
SCLK=0;
}
初始化时,应首先把数据赋值给wdata,再调用此函数。
结语
本文提出了用单片机3根I/O口线模拟温度传感器MAX6662的SPI总线的方法。经实验验证,完全可行,并且由于MAX6662用于温度测量时具有高精度和附加报警功能,因而在需要精确温度控制和温度测量等方面也会有广泛的应用。