基于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)
|