论坛» 企业专区» TI

【MSP焕新大作战】课程3+任务1

高工
2024-04-17 09:56 1楼

一、任务目标

实现温度报警器

二、功能分析

温度报警功能的实现涉及的主要是温度的采集和报警形式的选择。

根据现有的模块资源,温度的采集通过18B20温度传感器模块式;

报警形式可以通过板载的LED实现:目前有一个单独LED(红色)用于开启显示,一个RGB LED灯,用于状态展示(红色指示超温,黄色指示过温,绿色指示正常)实现光报警;开发套件中提供了一个有源蜂鸣器,用于声报警,两种报警频率对应两种过温状态;再结合课程2中用到的数码管用于实时温度的显示。

三、硬件原理分析

本课程搭配的新模块主要是18B20温度传感器模块,有源蜂鸣器模块。

咱们先了解一下有源蜂鸣器模块

1.png

本模块式通过一个S8550三极管进行驱动,当IO口输入低电平时蜂鸣器响,所以控制蜂鸣器只需要1个引脚就可以。

接下来看一看18B20温度传感器

2.png

模块中应该对数据线已经上拉了电阻,并且配备了一个LED来指示供电状态。

18B20是一种“单总线”接口的温度传感器。与传统的热敏电阻等测温元件相比,18B20是一种新型的、体积小、使用电压宽、与微处理器接口简单的数字化温度传感器。18B20在使用中不需要任何外围元件,全部传感器元件及转换电路集成在一只形如三极管的集成电路内,测量结果直接输出数字温度信号,以“一根总线”串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力。传感器的管脚顺序从左到右排列:管脚1为GND,管脚2为数据DQ,管脚3为VDD。如果传感器插反,电源将短路,传感器会发烫,容易损坏。

由于DS18B20是单总线器件,所有的单总线器件都要求采用严格的信号时序,以保证数据的完整性。DS18B20时序包括:初始化时序、写(0和1)时序、读(0和1)时序。DS18B20发送所有的命令和数据都是字节的低位在前。

四、软件分析

本节课程的软件设计方面主要是18B20的驱动设计和报警判断程序。

驱动设计

初始化程序-复位和存在脉冲

与DS18B20的所有通信都从一个初始化序列开始,该序列包含一个复位脉冲从主控制器发出,然后是DS18B20的存在脉冲。当DS18B20发送在场脉冲响应复位,它是指示主人它是开着的公共汽车准备开动了。在初始化过程中,总线主通过拉动单总线来传输(TX)复位脉冲最低480μs。然后总线主释放总线并进入接收模式(RX)。当总线被释放时,5kΩ上拉电阻将单总线拉高。当DS18B20检测到这个上升沿,它等待15μs到60μs,然后通过拉低1线总线发送一个存在脉冲60 ~ 240μs。

3.png

写入时间段

有两种写时间段:“写1”时间段和“写0”时间段。总线主机使用“写1”时隙向DS18B20写入逻辑1,使用“写0”时隙向DS18B20写入逻辑0。所有写时隙的持续时间必须至少为60μs,每个写时隙之间的恢复时间必须至少为1μs。这两种类型的写时隙都是由主机拉低1-Wire总线发起的(参见图14)。为了生成一个Write 1时隙,在将1-Wire总线拉低后,总线主必须在15μs内释放1-Wire总线。当总线被释放时,5kΩ上拉电阻将把总线拉高。要生成一个Write 0时隙,在拉低1-Wire总线后,总线主必须在时隙的持续时间内(至少60μs)保持总线的低电平。

DS18B20在主端启动写时隙后的15 ~ 60μs窗口内对1线总线进行采样。如果在采样窗口期间总线是高的,一个1被写入DS18B20。如果线路低,则写入一个0到DS18B20。

4.png

驱动代码如下:

void DS18B20_Start(void) { DS18B20_Rst(); DS18B20_Write_Byte(0xcc); DS18B20_Write_Byte(0x44); } uint16_t DS18B20_GetTemp(void) { uint16_t tem; uint8_t temp,TH,TL; DS18B20_Start(); DS18B20_Rst(); DS18B20_Write_Byte(0xcc); DS18B20_Write_Byte(0xbe); TL=DS18B20_Read_Byte(); TH=DS18B20_Read_Byte(); if(TH>7) { TH=~TH; TL=~TL; temp=0; } else temp=1; tem=TH; tem<<=8; tem+=TL; tem=(float)tem*0.625; if(temp) return tem; else return -tem; }

功能实现中在定时器中断中进行采集和判断,蜂鸣器的不同频率也是通过定时器实现的:

if(LED.Mode_On_Off == 1) { LED.Upcnt++; if(LED.Upcnt%(50*(LED.Mode_speed+1)) == 0) { if(LED.UpFlag == 1) Buzzer_toggle; LED.Upcnt = 0; } } if(Digital.Mode_On_Off == 1) { Digital.Upcnt++; if(Digital.Upcnt%50 == 0) { Digital.Upcnt = 0; temp = DS18B20_GetTemp(); Data_Split(temp); if(temp<270) { LED2_Green_SET; LED2_Red_RESET; LED.UpFlag = 0; Buzzer_SET; } else if(temp>=270 && temp<290) { LED2_Green_SET; LED2_Red_SET; LED.Mode_speed = 2; LED.UpFlag = 1; } else { LED2_Green_RESET; LED2_Red_SET; LED.Mode_speed = 0; LED.UpFlag = 1; } } }

五、实验结果

中级报警:

5.png

高级报警:

6.png


专家
2024-04-21 19:59 2楼

楼主,你程序中访问18B20是如何实现输入出输出转换的?我这里使用GPIO模拟方式,在程序中根据处理从输出转换为输入后,根本就读不到来自18B20的输入数据。

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]