李老师布置的题目
温度传感器
一. 实验要求
温度传感器采用实验开发板控制温度传感器DS18B20,将温度曲线及数值变化实时显示在LCD屏上。
二. 系统组成
阐述整个硬件系统的组成与连接关系(MSP430、传感器、上位机等);
画图,图中包含各个硬件模块以及模块之间的关键信号线
2.1 硬件系统
整个硬件系统为单线总线系统,使用单总线主机控制一个或多个从设备。DS18B20始终是从机。当总线上只有一个从机时,该系统称为“单点”系统;如果总线上有多个从机,则该系统为“多点”系统。本实验为单点系统。
所有的数据和命令首先通过1线总线传输最低有效位。
2.2 DS18BB20综述
2.2.1 DS18B20供电
DS18B20电源范围为3.0伏至5.5伏,其测量温度范围为-55°C至+125°C(-67°F至+257°F)。图1的方框图表示DS18B20主要有三个主要的数据部件:①64位激光ROM;②温度灵敏元件和③非易失性温度告警触发器TH(高温)和TL(低温)。器件供电方式有两种(见图2、图3),①寄生电源:依靠单线的通信线DQ,DQ=1充电、DQ=0断电。②VDD:用外部电源供电,本实验采取此类供电方式。
图1 DS1820方框图
图2强上拉在温度变换期内向DS1820供电
图3使用VDD提供温度变换所需电流
根据定义,单线总线只有一条数据线。每个设备(主设备或从设备)通过漏极开路或3状态端口与数据线接口。这允许每个设备在设备不传输数据时“释放”数据线,以便总线可供其他设备使用。DS18B20的1线端口(DQ引脚)是漏极开路,1线总线需要大约5k的外部上拉电阻;因此,1线总线的空闲状态是高的。这就允许在变换时间内其它数据在单线上传送。此外,在单线总线上可以放置任何数目的 DS18B20,寄生电源供电单线总线连接多个DS18B20时为保证足够驱动功率需要在I/O线上提供一强的上拉或者通过使用MOSFET把I/O线直接拉到电源。如果它们都使用外部电源,那么通过发出跳过(Skip) ROM命令和接着发出变换 (Convert) T命令,可以同时完成温度变换。[注意:只要外部电源处于工作状态,GND (地)引脚不可悬空。]
图4 硬件接法
DS18B20暂存器如图5所示,总共9字节。字节0和字节1分别包含温度寄存器的LSB和MSB,这些字节是只读的。字节2和3提供对TH(高报警阈值)和TL(低报警阈值)寄存器的访问。字节4包含配置寄存器数据,用于配置精度。字节5、6和7保留给设备内部使用,不能被覆盖。字节8是只读的,用于CRC校验。包含暂存存储器字节0到7的CRC代码。
使用Write scratchpad[4Eh]命令将数据写入暂存存储器的字节2、3和4;数据必须从字节2的最低有效位开始传输到DS18B20。为了验证数据的完整性,可以在写入数据后读取暂存存储器(使用read scratchpad[BEh]命令)。读取暂存存储器时,数据从字节0的最低有效位开始通过1线总线传输。要将TH、TL和配置数据从暂存存储器传输到EEPROM,主机必须发出Copy scratchpad[48h]命令。
当设备断电时,EEPROM寄存器中的数据被保留;在加电时,EEPROM数据被重新加载到相应的暂存存储器位置。数据也可以随时使用Recall E2[B8h]命令从EEPROM重新加载到暂存存储器。主机可以在调用E2命令后发出读时隙,DS18B20将通过在调用进行时发送0和在调用完成时发送1来指示调用的状态。
图5 DS18B20 暂存器(Memory Map)
三. 软件设计
包含但不限于:软件功能、程序框图(流程图)、软件总体方案设计、软件子模块设计;
软件子模块设计包括:MSP430功能模块设计、上位机模块设计等
A. msp430设计
MSP430F5529开发板上的102x64LCD采用的是SPI通信模式
B.DS18B20设计
经过单线接口访问DS1820的协议(protocol)如下:初始化→ROM操作命令→存贮器操作命令→处理/数据
经过单线接口访问DS1820的协议(protocol)如下:
初始化
ROM操作命令
存贮器操作命令
处理/数据
3.1初始化
单线总线上的所有处理均从初始化序列开始。初始化序列包括总线主机发出一复位脉冲,接着由从属器件送出存在脉冲。结合图2来看, 在初始化过程中,总线主机通过将1线总线拉低至少480us来传输(TX)复位脉冲。然后总线主机释放总线并进入接收模式(RX)。当总线被释放时,5k上拉电阻器将1线总线拉高。当DS18B20检测到该上升沿时,它将等待15us到60us,然后通过将单线总线拉低60us到240us来传输存在脉冲
图6 初始化过程“复位和存在脉冲"
代码:
/**********************************************************
在初始化过程中,总线主机通过将1线总线拉低至少480us来传输(TX)复位脉冲。然后总线主机释放总线并进入接收模式(RX)。当总线被释放时,5k上拉电阻器将1线总线拉高。当DS18B20检测到该上升沿时,它将等待15us到60us,
然后通过将单线总线拉低60us到240us来传输存在脉冲
函数名称:Init_18B20
功 能:对DS18B20进行复位操作
参 数:无
返回值 :初始化状态标志:1–失败,0–成功
*********************************************************/
unsigned int DS18b20_Init(void)
{
unsigned Check_val;
DQ_out;
DQ_0;
delay_us(600);
DQ_1;
delay_us(60);
DQ_in;
_NOP();
if ( DQ_val == 1)
{
Check_val = 0; /* 初始化失败 */
}
if ( DQ_val == 0)
{
Check_val = 1; /* 初始化成功 */
}
delay_us(10);
DQ_out;
DQ_1;
delay_us(100);
return (Check_val);
}
3.2 ROM命令
总线主机检测到存在脉冲后,发出ROM命令对每个从设备的64位ROM代码进行操作,如果单线总线上存在许多特定的设备,则允许主设备挑选出特定的设备。这些命令还允许主设备确定总线上存在的设备的数量和类型或者是否有任何设备经历过报警状态。有五个ROM命令,每个命令有8位长。在发出DS18B20功能命令之前,主设备必须发出适当的ROM命令。ROM命令的操作流程图如图7所示。几种常用的ROM命令为:
• Read ROM (读 ROM) [33h]
• Match R0M( “符合"ROM) [55h]
• Skip ROM( “跳过"ROM ) [CCh]
在单点总线系统中,此命令通过允许总线主机不提供64位ROM编码而访问存储器操作来节省时间。如果在总线上存在多于一个的从属器件而且在Skip ROM命令之后发出读命令,那么由于多个从片同时发送数据,会在总线上发生数据冲突(漏极开路下拉会产生“线与"的效果)。
代码:
/**********************************************************
函数名称:Skip
功 能:发送跳过读取产品ID号命令
参 数:无
返回值 :无
*********************************************************/
void Skip(void)
{
Write_18B20(0XCC);//跳过ROM配置,总线只挂一个寄存器时用(ROM指令)
}
• Search ROM (捜索 ROM) [FOh]
• Alarm Search (告警捜索)[ECh]
温度高于TH或低于TL,只要DS1820 —上电,告警条件就保持在设置状态,直到另一次温度测量显示出非告警值,或者改变TH或TL的设置使得测量值再一次位于允许的范围之内。贮存在EEPROM内的触发器值用于告警。
图7 ROM指令流程图
3.3 DS18B20功能命令
在总线主机使用ROM命令寻址到DS18B20之后,主机可以发出其中一个DS18B20功能命令。这些命令允许主机写入和读取DS18B20的暂存存储器内存,启动温度转换并确定电源模式。DS18B20功能命令汇总在表1中。
表1 DS1820命令集
指 令 说 明 约定代码 发出约定代码后单总线的操作 注
温度变换命令
温度变换 启动温度变换 44h 读温度“忙”状态 1
存 储 器 命 令
读暂存存储器 从暂存存储器读 字节 BEh 〈读9字节数据〉
写暂存存储器 写字节至暂存存 储器地此2和3 处(TH和TL温 度触发器) 4Eh (写数据至地此2和地此3的2个字节〉
复制暂存存储器 把暂存存储器复 制入非易性存储 器(仅地此2和 地此3) 43 h 〈读复制状态〉 2
重新调出E2 把贮存在非易失 性存储器内的数 值重新调入暂存 存储器(温度触 发器) E3h (读温度“忙”状态〉
读电源 发DS1820电源方
式的信号至主机 B4h (读电源状态〉
注:1.温度变换需要2秒钟。在接收到温度变换命令之后,如果器件未从VDD引脚取得电源,那么DS1820的I/O引线必须至少保持2秒的高电平以提供变换过程所需的电源。这样,在温度变换命 令发出之后,至少在此期间内单线总线上不允许发生任何其他的动作。
2.在接收到复制暫存存储器的命令以后,如果器件没有从VDD引脚取得电源,那么DS1820的I/O 引脚必须至少维持10ms的高电平,以便提供复制过程中所需的电源。这样, 在复制暂存存储器命令发出之后,至少在这一期间之内单线总线上不允许发生任何其他的动作。此命令写至DS1820的暂存存储器,以地址2开始。接着写的两个字节将被保存在暂存存储器 地址2和3之间中。发出一个复位便可在任何处终止写操作。
代码:
/*********************************************************************
///采集模式配置///转换Convert(void)
*此命令启动单个温度转换。转换后,产生的热数据存储在暂存存储器内存中的2字节温度寄存器中,
DS18B20返回低功耗空闲状态。
*如果设备在寄生电源模式下使用,则在发出此命令后的10秒内(最长时间),
主机必须在转换期间(tCONV)启用单线总线上的强上拉,如DS18B20通电部分所述。
*如果DS18B20由外部电源供电,则主机可以在Convert T命令后发出读取时隙,
DS18B20将在温度转换过程中发送0,在转换完成时发送1。
在寄生电源模式下,由于总线在转换过程中被强拉升拉高,因此不能使用这种通知
函数名称:Convert
功 能:发送温度转换命令
参 数:无
返回值 :无
/
void Convert(void)
{
Write_18B20(0x44);//启动温度转换
}
/**
采集模式配置//读温度寄存器Read_SP
//读暂存存储器(Read Scratchpad) [BEh]
此命令读暂存存储器的内容。
读开始于字节0,并继续经过暂存存储器,直至第九个字节(字节8, CRC)被读出为止。
如果不是所有位置均可读,那么主机可以在任何时候发出一复位以中止读操作。
函数名称:Read_SP
功 能:发送读ScratchPad命令
参 数:无
返回值 :无
************************************************************************/
void Read_SP(void)
{
Write_18B20(0xbe);//读暂存寄存器
}
/***************************************************************************
函数名称:ReadTemp
功 能:从DS18B20的ScratchPad读取温度转换结果
参 数:无
返回值 :读取的温度数值
****************************************************************************/
uint ReadTemp(void)
{
uchar temp_low;
uint temp;
temp_low = Read_18B20(); //低八位,LSB
temp = Read_18B20(); //
temp = (temp<<8) | temp_low; //温度转化为小数
return temp;
}
/**********************************************************************
//ReadTemp
//DS18B20采集函数
//当主机不知道总线上DS1820寄生电源供电还是外部VDD供电的情况时,
总线上主机通过发出跳过(Skip) ROM[CCh]的操作约定,
然后发出 读电源命令[B4h],可以决定是否有需要强上拉的DS1820在总线上。在此命令发出后,
主机接着发出读 时间片。如果是寄生供电,DS1820将在单线总线上送回"0";
如果由VDD引脚供电,它将送回"1"。 如果主机接收到一个"0",
它知道它必须在温度变换期间在I/O线上供一个强的上拉。
函数名称:Do1Convert
功 能:控制DS18B20完成一次温度转换
参 数:无
返回值 :测量的温度数值
**********************************************************************/
uint Do1Convert(void)
{
uchar i;
do
{
i = Init_18B20();
}
while(i);
Skip();
Convert();
for(i = 20;i > 0;i–)
__delay_cycles(20000000); //延时800ms //GAIDONG
do
{
i = Init_18B20();//初始化
}
while(i);
Skip();//跳过ROM配置
Read_SP();//读暂存寄存器
return ReadTemp(); //返回温度
}
3.4单线信号,读/写时隙
总线主机在写入时隙期间将数据写入DS18B20,并在读取时隙期间从DS18B20读取数据。每个时隙通过1线总线传输一位数据。
3.4.1写入时隙
有两种类型的写入时隙:“写入1”时隙和“写入0”时隙。总线主机使用写入1时隙将逻辑1写入DS18B20,使用写入0时隙将逻辑0写入DS18B20。所有写入时隙的持续时间必须至少为60µs,单个写入时隙之间的恢复时间至少为1µs。这两种类型的写入时隙都是由主机将1线总线拉低启动的(请参见图8)。
要生成写入1时隙,在将1线总线拉低后,总线主设备必须在15µs内释放1线总线。释放总线时,5kΩ上拉电阻器会将总线拉高。要生成写入0时隙,在将1线总线拉低后,总线主机必须在时隙期间(至少60µs)继续保持总线低。
DS18B20在主机启动写入时隙后的15µs到60µs的时间段内对单线总线进行采样。如果在采样窗口期间总线为高电平,则向DS18B20写入1。如果测线低,则向DS18B20写入0。
图8 读/写时隙时序图
四. 读取时隙
DS18B20只能在主机发出读取时隙时向主机发送数据。因此,主机必须在发出read Scratchpad[BEh]或read Power Supply[B4h]命令后立即生成读取时隙,以便DS18B20可以提供请求的数据。此外,主机可以在发出Convert T T[44h]或调用E2[B8h]命令后生成读取时隙,以了解操作的状态,如DS18B20功能命令部分所述。
所有读取时隙的持续时间必须至少为60µs,时隙之间的恢复时间至少为1µs。读取时隙由主设备将1线总线拉低至少1s,然后释放总线(见图8)。在主机启动读时隙后,DS18B20将开始在总线上传输1或0。DS18B20通过使总线处于高位传输1,通过将总线拉低传输0。当总线处于空闲状态时,总线将被释放到空闲状态。DS18B20的输出数据在下降沿启动读取时隙后15秒内有效。因此,主机必须释放总线,然后在插槽开始后15秒内采样总线状态。图9说明,对于一个读时隙,TINIT、TRC和TSAMPLE的总和必须小于15µs。图10显示了通过保持TINIT和TRC尽可能短的方式以及通过在接近15s周期结束时的读取时隙期间定位主样本时间,系统定时裕度最大化。
图9 详细的主读取1定时
图10建议主读取1定时
根据数据手册所给例程2,总线主机写存储器(假定采用寄生供电且只有一个DS1820)用下表2表示。
表2 总线主机写存储器(假定采用寄生供电且只有一个DS1820)
主机方式 数据(LSB)在先 注 释
TX Reset (复位) 复位脉冲
RX Presence (存在) 存在脉冲
TX CCh Skip ROM(跳过ROM)命令
TX 4Eh Write Scratchpad (写暂存存储器)命令
TX (2个数据字节) 写两个字节至暂存存储器(TB和TL)。
TX Reset (复位) 复位脉冲
RX Presence (存在) 存在脉冲
TX CCh Skip ROM (跳过ROM)命令
TX BEh 读暂存存储器命令
RX (9个数据字节) 读整个暂存存储器以及CRC。主机现在重新计算从暂存存储器接收 来的8位数据字节的CRC,并把此CRC与暂存存储器读回的两个 另外字节相比较。如果数据相符,主机继续工作;否则,重复这• 过程。
TX Reset (复位) 复位脉冲
RX Presence (存在) 存在脉冲
TX CCh Skip ROM(跳过ROM)命令
TX 48h Copy Scratchpad (复制暂存存储器)命令;在发出此命令之后, 主机必须等待6ms,以待复制操作的完成。
TX Reset (复位) 复位脉冲
RX Presence (存在) 存在脉冲,操作完成。
五. 实验步骤与结果
按照题目要求,逐一展示实验结果;
文档中,实验结果使用图片或者图表的方式展示;
使用视频记录完整实验过程,与实验报告放在同一个压缩文件中
六. 参考代码
展示程序中的部分关键代码,并加以中文注释;
将完整CCS工程与实验报告放在同一个压缩文件中