2504|0

171

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

基于F103与X-NUCLEO-IKS01A3之高低温度报警功能 [复制链接]

  本帖最后由 sylar^z 于 2019-8-17 22:07 编辑

    本次高低温度报警设计基于F103核心板与X-NUCLEO-IKS01A3传感器开发板。唤醒功能通过X-NUCLEO-IKS01A3上的STTS751传感器来实现。

    STTS751是一款低压数字温度传感器。供电电压2.25V-3.6V,遵循SMBus 2.0通讯协议,可以通过标准I2C进行通讯。STTS751带高温限值、低温限值及高温极限值报警。因原理相同,本次测试中只使用了高温限值报警及低温限值报警功能。

    在之前移植完驱动的程序(参看《 基于STM8S-DISCOVERY的X-NUCLEO-IKS01A3传感器驱动移植》)基础上进行功能添加。

 

     首先对之前的程序作了一些改动,使能了STTS751传感器,并设置了检测STTS751的INT的中断的引脚PB7。接着就是添加报警功能。在完成对STTS751的初始化之后,设置STTS751的高低温限值来启用报警功能,并配置相应的参数及中断输出。然后是检测唤醒中断及事件处理(在OLED屏显示高温报警或低温报警)。

 

     X-NUCLEO-IKS01A3上的STTS751_INT_PIN

1.设置STTS751的输出频率

2.设置高温限值报警、低温限值参数

因为1℃在高8为的bit0,所以设置报警的温度需要乘以256。读取显示温度时则需要除以256来得到真实温度。

3.设置唤醒中断通过INT1输出

    INT pin同时绑定高温限值报警、低温限值报警及高温极限值报警使用。当检测到中断后,通过读取对应的事件状态寄存器来确定事件源。

    中断使能标志位为MASK1。

 


相关代码:

 

  //使能STTS751温度报警功能

  if (EnvFuncDrv[FunctionIndex[ENV_TEMPERATURE]]->SetOutputDataRate(&stts751_obj_0, 4.0f) != BSP_ERROR_NONE)

  {

    return BSP_ERROR_COMPONENT_FAILURE;

  }

  if (STTS751_TEMP_SetLowTemperatureThreshold(&stts751_obj_0, LOW_TEMPERATURE_THRESHOLD) != BSP_ERROR_NONE)

  {

    return BSP_ERROR_COMPONENT_FAILURE;

  }

  if (STTS751_TEMP_SetHighTemperatureThreshold(&stts751_obj_0, HIGH_TEMPERATURE_THRESHOLD) != BSP_ERROR_NONE)

  {

    return BSP_ERROR_COMPONENT_FAILURE;

  }

  if (STTS751_TEMP_SetEventPin(&stts751_obj_0, 1U) != BSP_ERROR_NONE)

  {

    return BSP_ERROR_COMPONENT_FAILURE;

  }

  if (STTS751_TEMP_GetTemperatureLimitStatus(&stts751_obj_0, &HighLimit, &LowLimit, &ThermLimit) != BSP_ERROR_NONE)

  {

    ret = BSP_ERROR_COMPONENT_FAILURE;

  }


 

4.事件确认及处理

    检测STATUS寄存器中的THIGH、TLOW与THRM标志位,为1,则表示检测到有报警。执行报警处理,在OLED屏显示是高温报警还是低温报警。

 

每次报警产生后    INT引脚变低电平。在通过SMBus/I2C通讯产生ARA后变回的高电平。这个机制比较适合做LED灯等的闪烁提示。

 


 

  相关代码:

程序中温度的采集周期为250ms,因此报警时做了一个200ms显示,50ms不显示的闪烁提示功能。

 

  if (STTS751_TEMP_Get_DRDY_Status(&stts751_obj_0, &Status) != BSP_ERROR_NONE)

  {

    ret = BSP_ERROR_COMPONENT_FAILURE;

  }

  else

  {

    ret = BSP_ERROR_NONE;

  }

 

  if (EnvFuncDrv[FunctionIndex[ENV_TEMPERATURE]]->GetValue(&stts751_obj_0, &Value) != BSP_ERROR_NONE)

  {

    ret = BSP_ERROR_COMPONENT_FAILURE;

  }

  else

  {

    ret = BSP_ERROR_NONE;

    temperature = (int32_t)(Value * 10);

    OLED_show_envValue(1, &temperature);

  }

 

  if(TempLimitEventDetected)

  {

    TempLimitEventDetected = 0;

   

    if (STTS751_TEMP_GetTemperatureLimitStatus(&stts751_obj_0, &HighLimit, &LowLimit, &ThermLimit) == BSP_ERROR_NONE)

    {

      if(HighLimit != 0U)

      {

        OLED_ShowStr(1, 6, "HighLimit", 1);

      }

      else if(LowLimit != 0U)

      {

        OLED_ShowStr(1, 6, "LowLimit", 1);

      }

     

      TempLimitTick = HAL_GetTick();

    }

  }

  else if((HAL_GetTick() - TempLimitTick) > 200)

  {

    TempLimitTick = HAL_GetTick();

    OLED_ShowStr(1, 6, "         ", 1);

  }


 

效果图:

设置的高低温报警限值分别是28和32度。

 

附源码: CORE-STM32F103C8_FOR_X-NUCLEO_IKS01A3-STTS751_TEMP_LIMIT.rar (9.82 MB, 下载次数: 6)

STTS751: stts751.pdf (683.5 KB, 下载次数: 3)

 

点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表