久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

EEPW首頁 > 物聯網與傳感器 > 設計應用 > AS6221EvalKit:精度最高的數字溫度傳感器開發使用

AS6221EvalKit:精度最高的數字溫度傳感器開發使用

作者:AndyXoX 時間:2025-09-28 來源:EEPW 收藏

1   硬件介紹

AS6221 是市場上精度最高的數字系統(+/- 0.09℃)。它具備完整的數字化系統,可以快速準確的獲取測試位置的溫度信息,準確的還原溫度值并且通過標準I2C接口輸出??蓪崿F理想的健康溫度監測,或應用于各種恒溫場景的溫度監控。

●   超高的測量精度±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 溫度傳感器

評論


相關推薦

技術專區

關閉