我正在使用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;
}