This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] INA219:是否可以使用INA219精确测量小于1mA的电流? 如果是,如何?

Guru**** 1138100 points
Other Parts Discussed in Thread: INA219
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/amplifiers-group/amplifiers/f/amplifiers-forum/617605/ina219-can-i-measure-less-than-1ma-precisely-with-ina219-if-so-how

部件号:INA219

我正在使用INA219电流/功率监视器测量几天内弱光条件下的小型PV面板的输出。 对于我要测试的面板尺寸,短路电流(来自万用表)绝不会高于mA。 我正在使用的INA位于Adafruit分路板上,我使用一个I2C接口来控制它。 我一直在使用Particle IDE上提供的Adafruit代码库,它适用于输出更大的较大面板,但没有功能允许我更改设置以进行所需的测量。

我的主要问题是: 是否可以使用INA219以合理的精度进行所需的测量(如果可能,低至uA,但5uA是可接受的)?

如果是,我可以在实施过程中获得一些帮助,

到目前为止我所做的工作:

我一直在使用的磁带库包括更改INA输入范围的功能,包括的选项包括32V/2A (默认),32V/1A和16V/400mA。 我已经尝试将其中一个功能调整为100mV/1mA的工作电流,我已在下面介绍了该代码。 在测试时,我最初得到了更好的数字(更大,因此意味着我成功地更改了增益),但这些在上下文中不再有意义-因为输出应以mA为单位,但输出读数现在太大了。 我认为这与"INA219_currentdiver_mA"值有关,该值当时为20,但将其更改为更大的值会返回到读数未记录如此小电流的原始问题 (由于某种原因,库代码提供的输出仅限于小数点后两位,我不知道为什么,如果有人能解释这一点,我会很感激)。  

作为背景,我对C++语言有基本的了解,并对I2C和位智能通信等事物有理论上的了解, 但是,对于这些事情的低级编程来说,设备不是很好,有人能给我指一个好的资源来帮助我减少对图书馆的依赖吗?

Void Adafruit_INA219::setCalibration_100mV_1mA (void) 
{ //声明变量 float VBUS_MAX; float VSHUNT_MAX; float RSHUNT; float MaxPosible_I; float MaxExpected_I; 浮点最小值LSB; 浮点最大值LSB; 浮点当前LSB; UINT32_t校准; 浮点PowerLSB; 浮点Max_Current; 浮点Max_Current_Bety_Overflow; 浮点Max_ShuntVoltage; 浮点Max_ShuntVoltage_Before溢出; 浮点MaximumPower; VBUS_MAX = 0.05 ; //In V VSHUNT_MAX = 0.1 ; //(假设增益1,40mV) RSHUNT = 18; //(电阻值,单位为欧姆) // 1. 确定最大可能电流 MaxPosible_I = VSHUNT_MAX / RSHUNT; //0.005A = 5mA // 2。 确定最大预期电流 MaxExpected_I = 0.001 ; //1mA // 3. 计算LSB的可能范围(最小= 15位,最大= 12位) MinimumLSB = MaxExpected_I/3.2767万;//LSB 3.05 x 10^-8 = 0.03uA MaximumLSB = MaxExpected_I/4096; // 2.44 x 10^-7 = 0.24uA // 4. 在最小值和最大值之间选择LSB //(首选接近MinLSB的圆形数字) CurrentLSB = 0.0.0004万 ;//(每位0.04uA) // 5. 计算校准寄存器 校准=(字符串(0.0.4096万 /(CurrentLSB * RSHUNT))).toFloat(); //这是一个hotch-potched版本的"trunc()",因为IDE没有编译"trunc()" INA219_calValue = cal; // 6. 计算功率LSB PowerLSB = 20 * CurrentLSB; // 7. 计算溢出前的最大电流和并联电压值 Max_Current = CurrentLSB * 3.2767万; IF (Max_Current > MaxPosible_I){ max_current_Before溢出= MaxPosible_I; } 其他{ max_current_Before溢出= max_current; } Max_ShuntVoltage = Max_Current_Before溢出* RSHUNT; IF (Max_ShuntVoltage >= VSHUNT_MAX){ Max_ShuntVoltage_Before溢出= VSHUNT_MAX; } 其他{ Max_ShuntVoltage_Before溢出= Max_ShuntVoltage; } Max_ShuntVoltage_Before溢出= VSHUNT_MAX; // 8. 计算最大功率 最大功率= Max_Current_Before溢出* VBUS_MAX; //设置乘数以转换原始电流/功率值 INA219_currentDivider_mA = 3.3333万; //当前LSB =每位0.03uA (1000/LSB 0.03 =) INA219_PowerDivider_mW = 1; //功率LSB = 1mW /位 //将校准寄存器设置为'calc'(计算值高于 WireWriteRegister)(INA219_REG_CALIBRATION,INA219_calValue); //将配置寄存器设置为考虑以上设置 uint16_t config = INA219_CONFIG_BVOLTAGERANGE_16V | INA219_CONFIG_GAIN_1_40mV | INA219_CONFIG_BADCRES_12位| INA219_CONFIG_SADCRES_12bit_1S_532US | INA219_CONFIG_MODE_SANDBVOLT_CONTINUIAL; WirWriteRegister (INA219_REG_CONFIG, CONFIG); }

浮动Adafruit_INA219::getCurrent_mA(){
浮点值dec = getCurrent_raw ();
valuedec /= INA219_currentDivider_mA;
返回值dec;
}


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    电流感应放大器的每个输入都有20uA的偏置电流,因此会产生明显大于所需电流测量值的错误。 这通常是大多数电流感应放大器的问题。 为了测量这一低电流,您需要一个运算放大器,使用给定增益进行设置,以便将您的电流范围与Arduino的ADC范围相匹配。

    应该可以测量到1mA。 我注意到,在你的代码中,你提到了一个18欧姆的并联电阻器。 这是否正确?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,感谢您的回复。 是的,我目前使用的是18欧姆并联电阻器,我认为如果使用更大的电阻器,则在这些低电流下,其上的压降会更大,更可测量,尽管我可以看到这可能是进一步降低电流的折衷方案。
    我假设通过使用运算放大器,您建议使用互阻抗放大器设置。 您是否可以建议一种方法,使此类设置也可以像INA一样进行电压测量,或者我是否需要另一个系统或传感器来进行测量?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您的假设是正确的,但是由于放大器本身上的偏置输入,将在18欧姆电阻器上产生电压。 这就成为了一个问题,因为偏置电流比要测量的电流大得多,读数变得不准确,即使在电路中的任何电流开始流动之前,也会在并联电阻器上形成电压。

    至于运算放大器,我只是建议使用具有适当增益的同相放大器。

    根据上述代码,在5mA电流下,通过18欧姆电阻器形成的电压将为90mV,然后50的增益似乎足以与Arduino ADC (参考电压为5V)接口。

    我将推荐 OPA335,这是一种具有低输入偏置电流的低偏置轨对轨设备,这是一个明智的选择。 可能还有其他设备,但您必须在论坛的精密放大器部分打开一条新的线,以获得更多建议,因为我只能介绍电流感应放大器。