这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【NXPFRDM-MCXA156开发板测评】温度计

共3条 1/1 1 跳转至

【NXPFRDM-MCXA156开发板测评】温度计

菜鸟
2025-01-21 17:54:37     打赏

【NXP FRDM-MCXA156 开发板测评】温度计

本文介绍了恩智浦 FRDM-MCXA156 开发板 P3T1755DPJ 板载传感器的相关测试方案,实现环境温度的串口打印;进一步采用LabVIEW上位机实现温度采集和保存。


1.介绍


FRDM-MCXA156 开发板板载 P3T1755DPJ (I3C/I²C)高精度温度传感器。

board_I3C.jpg

P3T1755 是一款温度范围为 -40 °C 至 +125 °C 的温度数字转换器。它使用片上带隙温度传感器和具有超温检测功能的 A-D 转换技术。该设备包含一个用于存储器件设置的配置和数据寄存器的数量,例如器件操作模式,以及一个温度寄存器用于存储数字温度读数,该读数可由控制器通过 2 线串行 I3C(高达 12.5 MHz)和 I2C(高达 3.4 MHz)接口。

I2C 接口支持多达 32 个目标地址和警报功能,当温度超过编程限值。

I3C 接口支持 IBI(带内中断),其中 P3T1755 将其地址发送到仲裁地址 I3C 总线上的标头,以通知控制器中断。它不需要额外的中断引脚。

P3T1755 可以针对不同的运行条件进行配置。它可以在正常模式下设置为定期监控环境温度,或在关闭模式下以最大限度地降低功耗。温度寄存器始终存储 12 位 2 补码数据,温度分辨率为 0.0625 °C。


产品框图

P3T1755DP_block_diagram.jpg

特征
温度精度

  • ±0.5°C 精度温度传感器

  • 内部 12 位模数转换器(分辨率 0.0625°C)

  • 可编程温度过低和过温警报

性能

  • 工作电压为 1.4 V 至 3.6 V

  • 低静态电流:6 μA (最大值)

市场细分

  • 消费/工业:P3T1755DP

  • 汽车:P3T1755DP/Q900 (AEC-Q100)

包装

  • TSSOP:3.0 mm x 3.0 mm

应用


汽车

  1. 汽车音频解决方案

  2. 汽车高性能计算

  3. 联网无线电

  4. 数字仪表

  5. 驾驶员监控系统 (DMS) 和乘员监控系统

  6. 电动助力转向 (EPS)

  7. 电动泵

  8. 电动汽车 (EV) 牵引逆变器

  9. 供暖、通风和空调 (HVAC)

  10. 摩托车发动机控制单元 (ECU) 和小型发动机控制

  11. 胎压监测系统 (TPMS)

  12. 变速箱和变速箱


通信基础设施

  1. 用于数据中心的服务器的接口 IC


消费者

  1. 空调 (AC)

  2. 主要家用电器


工业

  1. 汽车燃气表

  2. 汽车雷达解决方案

  3. 建筑能源管理控制器

  4. 建筑安全探测器

  5. 建筑安全和监控

  6. 断路器

  7. 数字标牌

  8. 电子驾驶舱

  9. 电表

  10. 储能系统 (ESS)

  11. 电动汽车供电设备 (EVSE)

  12. 车队管理

  13. 前视摄像头

  14. 通用航空电子设备

  15. 热量表

  16. Home 控制面板

  17. 工业 HMI

  18. 中级飞控

  19. 运动控制和机器人技术

  20. 电机驱动器

  21. 病人监护仪

  22. POS 终端

  23. 可编程逻辑控制器 (PLC) 和远程 I/O

  24. 呼吸护理

  25. 智能照明

  26. 交通票务

  27. 生命体征监护仪


外围电路

circuit_P3T1755.jpg

温漂曲线

Accu_Temp.jpg

测量范围内的温度精度极高,且稳定性较好。

时序图

Timing_diagram.jpg

I3C 通信时序图

I3C_timing_diagram.jpg

读数据配置

read_device_config.jpg

详见:P3T1755DP 数据手册 .


I3C 原理图


开发板上 I3C 传感器的原理图如下

SCH_I3C_Sensor.jpg

2.工程测试


使用 IDE 打开工程目录,构建、编译、调试、上传至开发板,使用串口助手软件读取温度数据。

打开 Demo 例程 SDK\boards\frdmmcxa156\driver_examples\i3c\master_read_sensor_p3t1755


代码

#include <string.h>
/*  SDK Included Files */
#include "fsl_debug_console.h"
#include "fsl_p3t1755.h"
#include "fsl_i3c.h"
#include "board.h"
#include "app.h"

/*******************************************************************************
* Definitions
******************************************************************************/
#define I3C_TIME_OUT_INDEX 100000000U

#define SENSOR_ADDR 0x08U
#define CCC_RSTDAA  0x06U
#define CCC_SETDASA 0x87

#ifndef EXAMPLE_I2C_BAUDRATE
#define EXAMPLE_I2C_BAUDRATE 400000
#endif
#ifndef EXAMPLE_I3C_OD_BAUDRATE
#define EXAMPLE_I3C_OD_BAUDRATE 1500000
#endif
#ifndef EXAMPLE_I3C_PP_BAUDRATE
#define EXAMPLE_I3C_PP_BAUDRATE 4000000
#endif

/*******************************************************************************
* Prototypes
******************************************************************************/
static void i3c_master_callback(I3C_Type *base, i3c_master_handle_t *handle, status_t status, void *userData);
/*******************************************************************************
* Variables
******************************************************************************/
volatile status_t g_completionStatus;
volatile bool g_masterCompletionFlag;
i3c_master_handle_t g_i3c_m_handle;
p3t1755_handle_t p3t1755Handle;

const i3c_master_transfer_callback_t masterCallback = {
   .slave2Master = NULL, .ibiCallback = NULL, .transferComplete = i3c_master_callback};

/*******************************************************************************
* Code
******************************************************************************/
static void i3c_master_callback(I3C_Type *base, i3c_master_handle_t *handle, status_t status, void *userData)
{
   if (status == kStatus_Success)
   {
       g_masterCompletionFlag = true;
   }

   g_completionStatus = status;
}

status_t I3C_WriteSensor(uint8_t deviceAddress, uint32_t regAddress, uint8_t *regData, size_t dataSize)
{
   status_t result                  = kStatus_Success;
   i3c_master_transfer_t masterXfer = {0};
   uint32_t timeout                 = 0U;

   masterXfer.slaveAddress   = deviceAddress;
   masterXfer.direction      = kI3C_Write;
   masterXfer.busType        = kI3C_TypeI3CSdr;
   masterXfer.subaddress     = regAddress;
   masterXfer.subaddressSize = 1;
   masterXfer.data           = regData;
   masterXfer.dataSize       = dataSize;
   masterXfer.flags          = kI3C_TransferDefaultFlag;

   g_masterCompletionFlag = false;
   g_completionStatus     = kStatus_Success;
   result                 = I3C_MasterTransferNonBlocking(EXAMPLE_MASTER, &g_i3c_m_handle, &masterXfer);
   if (kStatus_Success != result)
   {
       return result;
   }

   while (!g_masterCompletionFlag)
   {
       timeout++;
       if ((g_completionStatus != kStatus_Success) || (timeout > I3C_TIME_OUT_INDEX))
       {
           break;
       }
   }

   if (timeout == I3C_TIME_OUT_INDEX)
   {
       result = kStatus_Timeout;
   }
   result = g_completionStatus;

   return result;
}

status_t I3C_ReadSensor(uint8_t deviceAddress, uint32_t regAddress, uint8_t *regData, size_t dataSize)
{
   status_t result                  = kStatus_Success;
   i3c_master_transfer_t masterXfer = {0};
   uint32_t timeout                 = 0U;

   masterXfer.slaveAddress   = deviceAddress;
   masterXfer.direction      = kI3C_Read;
   masterXfer.busType        = kI3C_TypeI3CSdr;
   masterXfer.subaddress     = regAddress;
   masterXfer.subaddressSize = 1;
   masterXfer.data           = regData;
   masterXfer.dataSize       = dataSize;
   masterXfer.flags          = kI3C_TransferDefaultFlag;

   g_masterCompletionFlag = false;
   g_completionStatus     = kStatus_Success;
   result                 = I3C_MasterTransferNonBlocking(EXAMPLE_MASTER, &g_i3c_m_handle, &masterXfer);
   if (kStatus_Success != result)
   {
       return result;
   }

   while (!g_masterCompletionFlag)
   {
       timeout++;
       if ((g_completionStatus != kStatus_Success) || (timeout > I3C_TIME_OUT_INDEX))
       {
           break;
       }
   }

   if (timeout == I3C_TIME_OUT_INDEX)
   {
       result = kStatus_Timeout;
   }
   result = g_completionStatus;

   return result;
}

status_t p3t1755_set_dynamic_address(void)
{
   status_t result                  = kStatus_Success;
   i3c_master_transfer_t masterXfer = {0};
   uint8_t g_master_txBuff[1];

   /* Reset dynamic address. */
   g_master_txBuff[0]      = CCC_RSTDAA;
   masterXfer.slaveAddress = 0x7E;
   masterXfer.data         = g_master_txBuff;
   masterXfer.dataSize     = 1;
   masterXfer.direction    = kI3C_Write;
   masterXfer.busType      = kI3C_TypeI3CSdr;
   masterXfer.flags        = kI3C_TransferDefaultFlag;
   result                  = I3C_MasterTransferBlocking(EXAMPLE_MASTER, &masterXfer);
   if (result != kStatus_Success)
   {
       return result;
   }

   /* Assign dynmic address. */
   memset(&masterXfer, 0, sizeof(masterXfer));
   g_master_txBuff[0]      = CCC_SETDASA;
   masterXfer.slaveAddress = 0x7E;
   masterXfer.data         = g_master_txBuff;
   masterXfer.dataSize     = 1;
   masterXfer.direction    = kI3C_Write;
   masterXfer.busType      = kI3C_TypeI3CSdr;
   masterXfer.flags        = kI3C_TransferNoStopFlag;
   result                  = I3C_MasterTransferBlocking(EXAMPLE_MASTER, &masterXfer);
   if (result != kStatus_Success)
   {
       return result;
   }

   memset(&masterXfer, 0, sizeof(masterXfer));
   g_master_txBuff[0]      = SENSOR_ADDR << 1;
   masterXfer.slaveAddress = SENSOR_SLAVE_ADDR;
   masterXfer.data         = g_master_txBuff;
   masterXfer.dataSize     = 1;
   masterXfer.direction    = kI3C_Write;
   masterXfer.busType      = kI3C_TypeI3CSdr;
   masterXfer.flags        = kI3C_TransferDefaultFlag;
   return I3C_MasterTransferBlocking(EXAMPLE_MASTER, &masterXfer);
}

/*!
* @brief Main function
*/
int main(void)
{
   status_t result = kStatus_Success;
   i3c_master_config_t masterConfig;
   p3t1755_config_t p3t1755Config;
   double temperature;

   BOARD_InitHardware();

   PRINTF("\r\nI3C master read sensor data example.\r\n");

   I3C_MasterGetDefaultConfig(&masterConfig);
   masterConfig.baudRate_Hz.i2cBaud          = EXAMPLE_I2C_BAUDRATE;
   masterConfig.baudRate_Hz.i3cPushPullBaud  = EXAMPLE_I3C_PP_BAUDRATE;
   masterConfig.baudRate_Hz.i3cOpenDrainBaud = EXAMPLE_I3C_OD_BAUDRATE;
   masterConfig.enableOpenDrainStop          = false;
   masterConfig.disableTimeout               = true;
   I3C_MasterInit(EXAMPLE_MASTER, &masterConfig, I3C_MASTER_CLOCK_FREQUENCY);

   /* Create I3C handle. */
   I3C_MasterTransferCreateHandle(EXAMPLE_MASTER, &g_i3c_m_handle, &masterCallback, NULL);

   result = p3t1755_set_dynamic_address();
   if (result != kStatus_Success)
   {
       PRINTF("\r\nP3T1755 set dynamic address failed.\r\n");
   }

   p3t1755Config.writeTransfer = I3C_WriteSensor;
   p3t1755Config.readTransfer  = I3C_ReadSensor;
   p3t1755Config.sensorAddress = SENSOR_ADDR;
   P3T1755_Init(&p3t1755Handle, &p3t1755Config);

   while (1)
   {
       result = P3T1755_ReadTemperature(&p3t1755Handle, &temperature);
       if (result != kStatus_Success)
       {
           PRINTF("\r\nP3T1755 read temperature failed.\r\n");
       }
       else
       {
           PRINTF("\r\nTemperature:%f \r\n", temperature);
       }
       SDK_DelayAtLeastUs(1000000, CLOCK_GetCoreSysClkFreq());
   }
}


效果


串口打印

UART_print_Temperature.gif

3.LabVIEW 数据采集


使用 LabVIEW 上位机软件实现串口数据提取、绘图、采集和保存

LabVIEW_Tab1.gif

同时获取当前时间,

LabVIEW_Tab2.gif

数据存储


时刻与温度数据合并为二维数组,并保存为 dat 格式文件

txt_save.jpg

LabVIEW 框图

block_view.jpg

4.总结


本文介绍了恩智浦 FRDM-MCXA156 开发板 P3T1755DPJ 板载传感器的相关测试方案,烧录官方Demo例程,实现串口打印温度数值;进一步采用LabVIEW上位机实现温度采集和保存,为该系列芯片的相关实际应用提供参考。


开发板工程及LabVIEW工程见附件 I3C_labview.zip





关键词: FRDM-MCXA156     测评     传感器     P3T17    

专家
2025-01-21 20:37:43     打赏
2楼

感谢分享


专家
2025-01-21 21:00:09     打赏
3楼

感谢分享


共3条 1/1 1 跳转至

回复

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