这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 企业专区 » TI » 【MSP焕新大作战】课程3+任务1

共2条 1/1 1 跳转至

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

高工
2024-04-17 09:20:46     打赏

一、任务目标

实现温度报警器

二、功能分析

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

根据现有的模块资源,温度的采集通过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





关键词: 课程3     DS18B20    

专家
2024-04-21 19:59:26     打赏
2楼

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


共2条 1/1 1 跳转至

回复

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