Skip to main content

Grove - ±5A DC/AC 电流传感器 (ACS70331)

Grove - ±5A DC/AC 电流传感器 (ACS70331) 是基于 ACS70331 的高精度 DC/AC 电流传感器。ACS70331EESATR-005B3 是 Allegro 的高灵敏度电流传感器 IC,适用于小于 5A 的电流检测应用。它采用巨磁阻 (GMR) 技术,比传统霍尔效应传感器灵敏度高 25 倍,用于检测通过低电阻集成主导体的电流所产生的磁场。

Grove - ±5A DC/AC 电流传感器 (ACS70331) 可测量高达 5A 的直流电流和交流电流,基础灵敏度为 200mV/A。

tip

在下面的 资源 部分中有一个关于电流的测量数据表供参考。

特性

  • 支持直流和交流负载
  • 1 MHz 带宽,响应时间小于 550 ns
  • 低噪声:1 MHz 时为 8 mA(rms)
  • 1.1 mΩ 主导体电阻,功耗低
  • 高 DC PSRR,可与低精度电源或电池一起使用(3 至 4.5 V 工作)
  • 模拟输出

规格

参数
供电电压3.3V / 5V
工作环境温度-40 – 85℃
存储温度- 65°C – 125°C
工作电压<100V
电流检测范围0 – 5A
灵敏度200mV/A(典型值)
输出接口Grove 模拟
输入接口螺丝端子

工作原理

电流检测有两种类型:直接检测和间接检测。分类主要基于用于测量电流的技术。

直接检测:

  • 欧姆定律

间接检测:

  • 法拉第电磁感应定律
  • 磁场传感器
  • 法拉第效应

Grove - ±5A DC/AC 电流传感器 (ACS70331) 使用磁场传感器技术。磁场传感器技术有三种类型:

  • 霍尔效应
  • 磁通门传感器
  • 磁阻电流传感器

Grove - ±5A DC/AC 电流传感器 (ACS70331) 基于磁阻电流传感器原理,也称为 GMR。磁阻器 (MR) 是一种两端设备,其电阻会随着施加的磁场呈抛物线变化。这种由于磁场导致 MR 电阻变化的现象称为磁阻效应。

ACS70331 QFN 封装的内部结构如图 1 所示。芯片位于主电流路径上方,使得磁场与芯片上的 GMR 元件平面一致。GMR 元件 1 和 2 在正 IP 电流流动时检测 +X 方向的磁场,GMR 元件 3 和 4 在正 IP 电流流动时检测 -X 方向的磁场。这使得能够对电流进行差分测量并排除外部杂散磁场。

图 1. ACS70331 内部结构

四个 GMR 元件以惠斯通电桥配置排列,如图 2 所示,使得电桥输出与四个元件检测到的差分磁场成正比,从而排除公共磁场。

图 2. 惠斯通电桥配置

硬件概览

图 3. 引脚图

支持的平台

Arduino树莓派

入门指南

caution

测试过程中禁止人体接触模块,否则可能有触电危险。

使用 Arduino

所需材料

Seeeduino V4.2Base Shield±5A DC/AC 电流传感器 (ACS70331)
立即购买立即购买立即购买

此外,您可以考虑我们的新产品 Seeeduino Lotus M0+,它相当于 Seeeduino V4.2 和 Base Shield 的组合。

note

1 请轻轻插入 USB 线缆,否则可能损坏接口。请使用内部有 4 根线的 USB 线缆,只有 2 根线的线缆无法传输数据。如果您不确定手头的线缆,可以点击 这里 购买。

2 每个 Grove 模块在购买时都会附带一根 Grove 线缆。如果您丢失了 Grove 线缆,可以点击 这里 购买。

直流演示

硬件连接
  • 步骤 1. 将 Grove - ±5A DC/AC 电流传感器 (ACS70331) 连接到 Base Shield 的 A0 端口。

  • 步骤 2. 将待测电路的正负极连接到螺丝端子的对应正负极。

tip

如果正负极接反,读数将会反转。此传感器在使用前需要校准,因此请不要先给电路通电。

  • 步骤 3. 将 Grove - Base Shield 插入 Seeeduino。

  • 步骤 4. 使用 USB 线缆将 Seeeduino 连接到电脑。

图 4. 在本演示中我们使用直流电源,请将电流设置为 0A 或者不要先通电
软件
caution

如果这是您第一次使用 Arduino,我们强烈建议您在开始之前查看 Arduino 入门指南

#ifdef ARDUINO_SAMD_VARIANT_COMPLIANCE
#define RefVal 3.3
#define SERIAL SerialUSB
#else
#define RefVal 5.0
#define SERIAL Serial
#endif
// 需要一个 OLED 显示屏
// 使用 A0 引脚
#define Pin A5

// 取 500 次的平均值

const int averageValue = 500;

long int sensorValue = 0;

float sensitivity = 1000.0 / 200.0; // 每 200mV 对应 1000mA


float Vref = 1508;

void setup()
{
SERIAL.begin(9600);
}

void loop()
{
// 读取 500 次的值:
for (int i = 0; i < averageValue; i++)
{
sensorValue += analogRead(Pin);

// 在下一次循环前等待 2 毫秒
delay(2);

}

sensorValue = sensorValue / averageValue;


// 板载 ADC 为 10 位
// 不同的电源会导致不同的参考源
// 示例:2^10 = 1024 -> 5V / 1024 ~= 4.88mV
// unitValue= 5.0 / 1024.0*1000 ;
float unitValue= RefVal / 1024.0*1000 ;
float voltage = unitValue * sensorValue;

// 无负载时,Vref=初始值
SERIAL.print("initialValue: ");
SERIAL.print(voltage);
SERIAL.println("mV");

// 计算对应的电流
float current = (voltage - Vref) * sensitivity;

// 打印显示电压 (mV)
// 该电压是对应电流的引脚电压
/*
voltage = unitValue * sensorValue-Vref;
SERIAL.print(voltage);
SERIAL.println("mV");
*/

// 打印显示电流 (mA)
SERIAL.print(current);
SERIAL.println("mA");

SERIAL.print("\n");

// 重置 sensorValue 以便下一次读取
sensorValue = 0;
// 每秒读取一次
delay(1000);
}

  • 步骤 3. 上传示例代码。如果您不知道如何上传代码,请查看 如何上传代码

  • 步骤 4. 打开 Arduino IDE 的 串行监视器,点击 工具->串行监视器,或者同时按下 ctrl+shift+m 键。将波特率设置为 9600

  • 步骤 5. 校准
    当没有电流流动时,传感器仍然会有一个小的输出值。我们称这个值为 零偏移

图 5. 此板的零偏移为 595.70mV,转换为电流为 -4561.48mA

由于存在零偏移,当没有电流时传感器也会有读数。因此我们设置了一个参数 Vref 来修正它,您可以在上面的代码块中找到它。

第 21 行:

float Vref = 1508;  
//Vref 是零漂移值,您需要在使用之前将此值更改为您实际测量的值。

在示例代码中,我们将 Vref 设置为 1508,但零偏移值因板而异。如您所知,我们在此示例中使用的板的零偏移值为 595.70。因此我们修改第 21 行:

float Vref = 596;  
//Vref 是零漂移值,您需要在使用之前将此值更改为您实际测量的值。

现在上传修改后的代码并检查结果:

图 6. 现在电流零偏移变为 0.02mA

当电流输出变为 0mA 或一个很小的值时,您已经完成了校准。

  • 步骤 6. 现在一切准备就绪,您可以开始供电了。请随意使用它,记住这是一个 5A 电流传感器,电流不能超过 5A!

如果您想了解结果的计算公式,请参考 FAQ Q1

交流电示例

caution

使用交流电时,请注意安全,避免触电。

关于硬件连接和校准部分,请参考 直流电示例,唯一的区别是代码。请使用以下代码用于交流负载。

#ifdef ARDUINO_SAMD_VARIANT_COMPLIANCE
#define RefVal 3.3
#define SERIAL SerialUSB
#else
#define RefVal 5.0
#define SERIAL Serial
#endif
//需要一个 OLED 显示屏
//使用引脚 A0
#define Pin A5

// 取 500 次平均值

const int averageValue = 500;

long int sensorValue = 0;

float sensitivity = 1000.0 / 200.0; //1000mA 每 200mV


//float Vref = 244;
float Vref = 1494;

void setup()
{
SERIAL.begin(9600);
}
static float tempval;
void loop()
{

// 读取 500 次值:
for(int i=0;i<20;i++)
{

for (int i = 0; i < averageValue; i++)
{
int temp;
temp= analogRead(Pin);
if(temp>sensorValue)
{
sensorValue=temp;
}
delayMicroseconds(40);
}
tempval+=sensorValue;
}

sensorValue=tempval/20.0;
tempval=0;
// 板载 ADC 是 10 位
// 不同的电源会导致不同的参考源
// 示例:2^10 = 1024 -> 5V / 1024 ~= 4.88mV
// unitValue= 5.0 / 1024.0*1000 ;
float unitValue= RefVal / 1024.0*1000 ;
float voltage = unitValue * sensorValue;

//当没有负载时,Vref=初始值
SERIAL.print("initialValue: ");
SERIAL.print(voltage);
SERIAL.println("mV");

// 计算对应的电流
float current = ((voltage - Vref) * sensitivity)*0.707;

// 打印显示电压 (mV)
// 此电压是对应电流的引脚电压

voltage = unitValue * sensorValue-Vref;
SERIAL.print(voltage);
SERIAL.println("mV");


// 打印显示电流 (mA)
SERIAL.print("current: ")
SERIAL.print(current);
SERIAL.println("mA");

SERIAL.print("\n");


// 重置 sensorValue 为下一次读取
sensorValue = 0;

// 每秒读取一次
delay(1000);
}

常见问题解答 (FAQ)

Q1# 当前的计算公式是什么?

A1: 如果您觉得工作原理部分非常复杂,我们可以用一种简单的方式来解释。被测电路中的电流会激发磁场,从而导致 GMR 元件的电阻值发生变化。而桥路中的电阻变化会引起芯片输出电压的变化。我们将该电压输出称为 VIOUT

VIOUT = Sens × Ip + VIOUT(Q)

Sens: Sens 是将电流转换为输出电压的系数。对于该模块,其值为 200mA/V。
Ip: Ip 是被测电路中的电流值,单位为 mA。
VIOUT(Q): VIOUT(Q) 是当 Ip 为 0mA(即被测电路中没有电流)时的电压输出,单位为 mV。

以下是电流值的计算公式:

Ip = (VIOUT - VIOUT(Q)) / Sens

现在,让我们回顾图 5,我们将解释为什么当被测电路中的实际电流值为 0 时,输出的电流值却不是 0。如图 5 所示,initialValue 是 595.70mV,即 VIOUT;电流是 -4561.48mA,即 Ip。至于 VIOUT(Q),它是我们在代码中设置的 Vref
在图 5 中,其值为 1508。而 Sens 是 200mA/V,即 200mA/1000mV。现在,进行一些数学计算:

{(595.70mV-1508mV ) / (200mA/1000mV)} = -4561.50mA

因此,在图 6 中,当我们将 Vref 设置为 595.70 时,Ip 变为 0mA。

在线原理图查看器

资源

技术支持与产品讨论

感谢您选择我们的产品!我们为您提供多种支持渠道,以确保您在使用我们的产品时获得顺畅的体验。我们提供多种沟通方式,以满足不同的偏好和需求。

Loading Comments...