AS6221-EK测评(艾迈斯欧司朗)
分享作者:greenhorn
评测品牌:艾迈斯欧司朗
评测型号:AS6221-EK
发布时间:2025-05-28 15:12:10
0
前言
前段时间申请了艾迈斯欧司朗的AS6221-EK,非常感谢iceasy商城和艾迈斯欧司朗
开源口碑分享内容

一、AS6221-EK介绍

AS6221是市场上精度最高的数字温度传感器系统,具备完整的数字化系统,可以快速准确的获取测试位置的温度信息,准确的还原温度值并且通过标准 I2C 接口输出。

特点如下:

  • 在20℃在40℃温度范围内可实现±0.09℃的测量精度
  • 输出数据速率为4Hz时功耗6uA,待机模式下功耗0.1uA
  • 支持预警模式,可以灵活设置阈值,实现精确的温度监控
  • 集成完整的数字模块,支持标准I2C通信,8组I2C地址可选
  • 产线完整单体一致性测试,无需标定/校准
  • 采用WLCSP封装,尺寸为1.5×1.0mm

AS6221内部架构

AS6221通过硅基双极温度传感器模拟前端将温度值转为电信号传给AD转换器,再由AD转换器输出为数字信号,经过数字处理,最后将温度值存储在寄存器中,可以通过标准I2C通信访问寄存器读取温度值。

二、寄存器介绍

(1)索引寄存器

索引寄存器是一个8位的寄存器,只有Bit0和Bit1可用,其它位都为0且只读,索引寄存器用来寻址特定的寄存器,通过配置索引寄存器Bit0和Bit1来访问不同寄存器,如:0x0用来访问温度寄存器,0x1用来访问配置寄存器。

(2)配置寄存器

配置寄存器是16位的寄存器,用来配置设备的工作模式,其中,Bit5-12和Bit15可用,其它位不可用

BitBit name默认值R/W为0或1时
5Alert Bit(AL)1ROPOL为0时:AL为0,表示温度在N个转换周期都大于THIGH,直到温度在N个转换周期都小于TLOW,AL为1
POL为1时:AL为1,表示温度在N个转换周期都大于THIGH,直到
温度在N个转换周期都小于TLOW,AL为0
6-7Conversion rate bits
(CR[0] CR[1])
CR[0]为0 CR[1]为1RWCR[0]为0且CR[1]为0时:转换率为0.25
CR[0]为1且CR[1]为0时:转换率为1
CR[0]为0且CR[1]为1时:转换率为4
CR[0]为1且CR[1]为1时:转换率为8
8Sleep mode bit(SM)0RWSM为0时:工作模式;SM为1时,睡眠模式
9Interrupt mode bit(IM)0RWIM为0时:比较模式;IM为1时,中断模式
10Polarity bit(POL)0RWPOL为0时:温度大于THIGH时AL位输出0;
POL为1时:温度大于THIGH时AL位输出1;
11-12Consecutive faults bits
(CF[0] CF[1])
0RWCF[0]为0且CF[1]为0时:Consecutive faults(N)为1
CF[0]为1且CF[1]为0时:Consecutive faults(N)为2
CF[0]为0且CF[1]为1时:Consecutive faults(N)为3
CF[0]为1且CF[1]为1时:Consecutive faults(N)为4
15Single shot bit(SS)0RWSS为0时:No conversion ongoing/ conversion finished
SS为1时:Start single shot conversion / conversion ongoing

(3)THIGH、TLOW寄存器

THIGH寄存器和TLOW寄存器用来设置温度阈值,二者都是16位寄存器,其中,Bit4-Bit15可用,上电默认值如下:

以TLOW寄存器默认值为例:二进制 0010 0101 1000 0000 转换为十进制为9600,寄存器一个Bit表示0.0078125℃,9600×0.0078125=75℃

(4)TVAL寄存器

TVAL寄存器存放的是测量的温度值,由两个字节表示,一个Bit表示0.0078125℃,AS6221用户手册说为了也能表示负值,温度值以二进制补码表示,所以二进制最高位为符号位,0正1负。

三、获取温度

(1)使用STM32获取数据

这里使用的开发板是STM32F103C8T6,PB10连接AS6221的SCL引脚,PB11连接AS6221的SDA引脚,I2C地址使用默认的地址。

/*AS6221.c文件*/
#include "stm32f10x.h"


#define AS6221_Clock        RCC_APB2Periph_GPIOB
#define AS6221_Port         GPIOB
#define AS6221_SCL_Pin      GPIO_Pin_10
#define AS6221_SDA_Pin      GPIO_Pin_11
#define AS6221_ADDRESS      0x48

uint8_t Data[2];

void AS6221_Init(void)
{
    RCC_APB2PeriphClockCmd(AS6221_Clock,ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_OD;
    GPIO_InitStruct.GPIO_Pin=AS6221_SCL_Pin | AS6221_SDA_Pin;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(AS6221_Port,&GPIO_InitStruct);
    
    I2C_InitTypeDef I2C_InitStruct;
    I2C_InitStruct.I2C_Mode=I2C_Mode_I2C;
    I2C_InitStruct.I2C_ClockSpeed=100000;
    I2C_InitStruct.I2C_DutyCycle=I2C_DutyCycle_2;
    I2C_InitStruct.I2C_Ack=I2C_Ack_Enable;
    I2C_InitStruct.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;
    I2C_InitStruct.I2C_OwnAddress1=0xFF;
    I2C_Init(I2C2,&I2C_InitStruct);
    
    I2C_Cmd(I2C2,ENABLE);
}

void AS6221_Get(float *Temperature)
{
    I2C_GenerateSTART(I2C2,ENABLE);
    while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT)!=SUCCESS);
    
    I2C_Send7bitAddress(I2C2,((AS6221_ADDRESS<<1) & 0xFE),I2C_Direction_Transmitter);
    while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)!=SUCCESS);
    
    I2C_SendData(I2C2,0x00);
    while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED)!=SUCCESS);
        
    I2C_GenerateSTART(I2C2,ENABLE);
    while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT)!=SUCCESS);
    
    I2C_Send7bitAddress(I2C2,((AS6221_ADDRESS<<1) | 0x01),I2C_Direction_Receiver);
    while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)!=SUCCESS);
    
    while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED)!=SUCCESS);
    Data[0]=I2C_ReceiveData(I2C2);
    
    I2C_AcknowledgeConfig(I2C2,DISABLE);
    I2C_GenerateSTOP(I2C2,ENABLE);
    
    while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED)!=SUCCESS);
    Data[1]=I2C_ReceiveData(I2C2);
    
    I2C_AcknowledgeConfig(I2C2,ENABLE);
    
    *Temperature=((Data[0]<<8) | Data[1])*0.0078125;
}
/*main.c文件*/
#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "AS6221.h"
#include "Delay.h"

float Temperature;

int main(void)
{
    OLED_Init();
    AS6221_Init();
    OLED_ShowString(1,1,"T:  .");
    while(1)
    {
        AS6221_Get(&Temperature);
        OLED_ShowNum(1,3,Temperature,2);
        OLED_ShowNum(1,6,(uint16_t)(Temperature*1000)%1000,3);
        Delay_ms(500);
    }
}

(2)使用ESP8266开发板获取数据

这里ESP8266开发板的D1引脚连接AS6221的SCL引脚,D2引脚连接AS6221的SDA引脚,使用的是Github上的开源程序, AS6221驱动程序

#include "AS6221.h"
#include "Wire.h"

AS6221 temp;

void setup() {
  Wire.begin(4, 5); // ESP8266: SDA=D2(GPIO4), SCL=D1(GPIO5)
  Serial.begin(115200);
  delay(1000); // 等待串口稳定

  // 配置传感器参数(仅保留必要选项)
  as6221_config_t conf = {
    .cr = AS6221_CONV_RATE4,      // 4次/秒采样率(250ms间隔)
    .state = AS6221_STATE_ACTIVE,  // 启用传感器
    .alert_mode = AS6221_ALERT_COMPARATOR, // 比较模式
    .cf = AS6221_CONSEC_FAULTS2    // 连续2次故障触发报警
  };

  temp.init(AS6221_DEFAULT_ADDRESS, conf);
}

void loop() {
  double temperature = temp.getTemp();
  // Serial.print("Temperature: ");
  Serial.println(temperature, 3); // 显示3位小数
  delay(1000);
}

串口绘图仪显示如下

全部评论
暂无评论
0/144