新闻中心

EEPW首页 > 物联网与传感器 > 设计应用 > AS6221EvalKit:精度最高的数字温度传感器开发使用

AS6221EvalKit:精度最高的数字温度传感器开发使用

作者:AndyXoX 时间:2025-09-28 来源:EEPW 收藏

1   硬件介绍

AS6221 是市场上精度最高的数字系统(+/- 0.09℃)。它具备完整的数字化系统,可以快速准确的获取测试位置的温度信息,准确的还原温度值并且通过标准I2C接口输出。可实现理想的健康温度监测,或应用于各种恒温场景的温度监控。

●   超高的测量精度±0.09℃(20℃至42℃)

●   超低功耗(6μA@4Hz/0.1μA@Standby)

●   支持电池供电的使用场景

●   支持预警模式,可以灵活设置阈值,实现精确的温度监控高集成化设计,设计灵活

●   集成完整的数字模块,支持标准IIC 通讯模式

●   支持8 组IIC 地址,可以多颗器件系统配合使用小尺寸,使用简单

●   产线完整单体一致性测试,无需标定/ 校准·WLCSP 封装,尺寸:1.5×1.0 mm

1759025631126508.png

1.1 AS6221内部架构

AS6221是完整的高精度数字系统。它由一个硅基双极模拟前端、一个ADC和一个数字传感器组成,通过IIC通信数字总线与其他设备通讯。器件支持多路IIC地址设定,支持中断预警模式。

1759025712573010.png

2   硬件连接

2.1 开发板选择(PB_03F_kit)

PB_03F_kit开发板的IIC硬件介绍如下:硬件支持2路I2C,可配置MASTER或SLAVE。

硬件TX FIFO 深度8 字节,硬件RX FIFO 深度8字节。

PCLK 时钟等于HCLK,可分频,不建议分频。当系统休眠时,I2C 信息会丢失,唤醒后需要重新配置。

所有可fmux 的 IO 都可以复用为I2C。I2C 使用时需要接上拉电阻,比如2.2 kΩ或4.7 kΩ。

FULLMUX 模式(FULLMUX 是指将GPIO 复用为其他模块引脚):

除TEST_MODE、P16、P17、P1 之外的其他GPIO都支持GPIO FULLMUX 功能,可根据应用GPIO 配置为UART,I2C、PWM 等功能。

image.png

2.2 连接方式(IIC通讯模式 / 数据解析)

2.2.1 AS6221 Eval Kit 模块引脚介绍:

Pin符号说明备注

1759025932231140.png

注:不要将引脚5接到VSS,此引脚只用于ALERT功能

1759025963567596.png

2.2.2 I2C地址选择方式:

使用跳线帽设置I2C 的地址,且两个位置的跳线帽不能打开。

配置方式如下所示:

1759026021983317.png

2.2.3 MCU与模块连接方式:

SDA->P33

CLK->P34

ALERT警报功能未使用,不连接。(根据实际情况自行配置)

1759026097761851.png

2.2.4 模块输出数据解析

1. TVAL(0×0 寄存器地址):当前获取的温度值。

2. CONFIG(0×1 寄存器地址):当前配置的相关信息。

3. TLOW(0×2 寄存器地址):温度下限警报值。

4. THIGH(0×3 寄存器地址):温度上限警报值。

1759026268911570.png

➀温度值TVAL数据解析

为获取模块的温度值,需要读取TVAL(0×0 寄存器地址)的值,输出的温度数值为2 字节数据(例:0×b,0×22)

LSB = (1 / 128)℃ = 0.0078125 ℃

实际数值=读取到的数值* LSB = 2850(0×b22[hex]) * LSB ≈ 22.265 ℃

1759026362171132.png

➁配置CONFIG数据解析

例:获取的数据为0×40,0×20;即0100 0000 0010 0000。

根据下表,可知每位代表的含义,以及是否可修改相关属性;

1759026410387800.png

1759026426141206.png

➂TLOW / THIGHT数据解析

例:TLOW获取的值为0×25,0×80;即75℃。THIGHT获取的值为0×28 0×00;即80℃

若要使用TLOW,THIGHT;需配置ALERT中断引脚,相关转换过程如下。

1759026468740058.png

3   代码编写

修改跳线帽位置使从机(模块)I2C 地址如“上图”的第一种方式(0×44)

主要代码如下:

i2c_demo.c 代码如下:

view plaincopy to clipboardprint?

1. #include “OSAL.h”

2. #include “i2c_demo.h”

3. #include “log.h”

4.

5. #include “gpio.h”

6. #include “clock.h”

7.

8. #include “pwrmgr.h”

9. #include “error.h”

10. #include “key.h”

11.

12. #include “fl ash.h”

13. #include “i2c.h”

14.

15.

16. #include “pwrmgr.h”

17. #include “error.h”

18.

19.

20. #define I2C_MASTER_SDA P33

21. #define I2C_MASTER_CLK P34

22.

23. #define slave_i2c_addr 0x44 // 从机设备地址

24. #define Tval_ADDR 0 // 温度寄存器的地址

25. #define Config_ADDR 1

26. #define Tlow_ADDR 2

27. #define Thight_ADDR 3

28.

29. static void* master_pi2c;

30. static uint8_t i2c_TaskID;

31.

32. #define I2C_MASTER_RX_DATA_LEN 2

33.

34. uint8 I2C_RX_data[I2C_MASTER_RX_DATA_LEN]= {0}; // 接收温度数据

35. uint8 I2C_Config_data[I2C_MASTER_RX_DATA_LEN]= {0};

36. uint8 I2C_Tlow_data[I2C_MASTER_RX_DATA_LEN]= {0};

37. uint8 I2C_Thight_data[I2C_MASTER_RX_DATA_LEN]= {0};

38.

39. // 从I2C 从设备读取数据

40. static int I2CRead(void* pi2c, uint8* data,uint8 len,uint8 slave_addr,uint8 Addr)

41. {

42.     int ret ;

43.     ret=hal_i2c_read(pi2c,slave_addr,Addr,data,len);

44.

45.     return ret;

46. }

47.

48. // 初始化I2C

49. void I2c_Demo_Init(uint8 task_id)

50. {

51.     i2c_TaskID = task_id;

52.     LOG(“i2c demo start...rn”);

53.     // 初始化SDA CLK 相关引脚(Input / 上拉)

54.     hal_gpio_pin_init(I2C_MASTER_SDA,IE);

55.     hal_gpio_pin_init(I2C_MASTER_CLK,IE);

56.     hal_gpio_pull_set(I2C_MASTER_SDA,STRONG_PULL_UP);

57.     hal_gpio_pull_set(I2C_MASTER_CLK,STRONG_PULL_UP);

58.    hal_i2c_pin_init(I2C_0, I2C_MASTER_SDA, I2C_MASTER_CLK); // 开启硬件I2C_0

59.    master_pi2c=hal_i2c_init(I2C_0,I2C_CLOCK_400K);

60.

61.     if(master_pi2c==NULL)

62.     {

63.         LOG(“I2C master init failrn”);

64.     }

65.     else

66.     {

67.         LOG(“I2C master init OKrn”);

68.     }

69.     osal_start_timerEx(i2c_TaskID, KEY_I2C_READ_DATA_EVT, 10);

70.     }

71.

72. // 任务进程

73. uint16 I2c_ProcessEvent( uint8 task_id, uint16events )

74. {

75.     if(task_id != i2c_TaskID)

76.     {

77.         return 0;

78.     }

79.

80.     if( events & KEY_I2C_READ_DATA_EVT)

81.     {

82.         uint8_t Tval,Config,Tlow,Thight;

83.

84.         // 将获取到的数据,保存到相关数组中

85.         Tval = I2CRead(master_pi2c,I2C_RX_data,I2C_MASTER_RX_DATA_LEN,slave_i2c_addr,Tval_ADDR);

86.         Config = I2CRead(master_pi2c,I2C_Config_data,I2C_MASTER_RX_DATA_LEN,slave_i2c_addr,Config_ADDR);

87.         Tlow = I2CRead(master_pi2c,I2C_Tlow_data,I2C_MASTER_RX_DATA_LEN,slave_i2c_addr,Tlow_ADDR);

88.         Thight = I2CRead(master_pi2c,I2C_Thight_data,I2C_MASTER_RX_DATA_LEN,slave_i2c_addr,Thight_ADDR);

89.

90.

91.         if(Tval==PPlus_SUCCESS)

92.         {

93.         LOG(“I2C_Tval_data=[“);

94.

95.         for(uint8 i=0; i<I2C_MASTER_RX_DATA_LEN; i++)

96.          {

97.              LOG(“0x%x,”,I2C_RX_data[i]);

98.         }

99.

100.         LOG(“]rn”);

101.

102.

103.         LOG(“I2C_Config_data=[“);

104.

105.         for(uint8 i=0; i<I2C_MASTER_RX_DATA_LEN; i++)

106.         {

107.             LOG(“0x%x,”,I2C_Config_data[i]);

108.         }

109.

110.         LOG(“]rn”);

111.

112.         LOG(“I2C_Tlow_data=[“);

113.

114.         for(uint8 i=0; i<I2C_MASTER_RX_DATA_LEN; i++)

115.         {

116.             LOG(“0x%x,”,I2C_Tlow_data[i]);

117.         }

118.

119.         LOG(“]rn”);

120.

121.

122.         LOG(“I2C_Thight_data=[“);

123.

124.         for(uint8 i=0; i<I2C_MASTER_RX_DATA_LEN; i++)

125.         {

126.             LOG(“0x%x,”,I2C_Thight_data[i]);

127.         }

128.

129.         LOG(“]rn”);

130.

131.         //1000ms 获取一次数据

132.             osal_start_timerEx(i2c_TaskID, KEY_I2C_READ_DATA_EVT, 1000);

133.         }

134.

135.         return (events ^ KEY_I2C_READ_DATA_EVT);

136.     }

137.

138.     LOG(“NO Datarn”);

139.

140.     return 0;

141. }

3.1 获取的各个寄存器的原始数据,如下图所示

1759026638244645.png

3.2 对数据进行处理,并输出

view plaincopy to clipboardprint?

1.数据处理后的相关代码:

2.

3.    if( events & KEY_I2C_READ_DATA_EVT)

4.    {

5.        uint8_t Tval;

6.

7.         // 将获取到的数据,保存到相关数组中

8.         Tval = I2CRead(master_pi2c,I2C_RX_data,I2C_MASTER_RX_DATA_LEN,slave_i2c_addr,Tval_ADDR);

9.

10.         if(Tval==PPlus_SUCCESS)

11.         {

12.

13.             // 转换后的数据

14.             char Rx[4];

15.                 sprintf(Rx,”%02x%02x”,I2C_RX_data[0],I2C_RX_data[1]);

16.             char *endptr;

17.             long int Data = strtol(Rx, &endptr, 16);

18.             double T = (double)Data * 0.0078125;

19.

20.             usart_printf(“T = %.3frn”,T); // 串口输出温度数据

21.

22.              //500ms 获取一次数据

23.              osal_start_timerEx(i2c_TaskID, KEY_I2C_READ_DATA_EVT, 500);

24.         }

25.

26.         return (events ^ KEY_I2C_READ_DATA_EVT);

27.     }

28.

29.     return 0;

30. }

31.

32.

33. 部分代码的实现:

34.

35. #include <stdarg.h>

36.

37. void usart_printf(char *format,...)

38. {

39.     char String[100]; // 定义输出字符串

40.     va_list arg; // 定义一个参数列表变量va_list 是一个类型名,arg 是变量名

41.      va_start(arg,format); / / 从format 位置开始接收参数表放在arg 里面

42.

43.      //sprintf 打印位置是String,格式化字符串是format,参数表是arg,对于封装格式sprintf要改成vsprintf

44.     vsprintf(String,format,arg);

45.

46.     va_end(arg); // 释放参数表

47.     hal_uart_send_buff (UART0, (uint8_t*)String,strlen(String)); //uart.c 的函数

48.

49. }

输出当前室内温度数据:

1759026710852073.png

当手紧握模块时,温度迅速上升:

1759026733737171.png

(本文来源于《EEPW》


关键词: 202509 温度传感器

评论


相关推荐

技术专区

关闭