Adafruit INA219模块,分流电压值和校准

时间:2016-09-26 23:19:02

标签: arduino microcontroller electronics

我正在使用Adafruit INA219模块来测量线性执行器的电压和电流,我对如何根据我的情况最佳校准模块提出了疑问。

我有一个12V电源(类似于笔记本电脑的电源砖),其最大额定电流为10A。执行器额定最大12V @ 5A,提供35磅的力。我正在使用MegaMoto驱动器屏蔽来驱动执行器,并使用Arduino Nano作为控制器。

INA219模块的默认校准似乎是针对32V @ 2A,并且通过函数调用here提供了一些其他设置,但是我没有看到任何适合12V @ 5A情况的设置,如果我要编写一个新功能来校准INA219,我不确定该用于各种值。有谁知道我能用什么?

我希望我能在这个模块上开箱即可获得准确的读数,但是我得到了一些非常宽的值摆动和一些奇数(?)分流电压值(或者很可能,我只是不明白他们)。例如,当移动执行器时,我每隔1ms读取模块中的值15ms,然后平均耗电量并将其用作过滤掉高点和低点的方法,以查看通用功率的用途。我正在使用示例代码中的等式:

shuntvoltage = ina219.getShuntVoltage_mV();
busvoltage = ina219.getBusVoltage_V();
current_mA = ina219.getCurrent_mA();
loadvoltage = busvoltage + (shuntvoltage / 1000);
power = current_mA * loadvoltage;

这是一个阅读的例子:

  

shuntvoltage:-31.76   母线电压:12.16   current_mA:-258.60   loadvoltage:12.13   功率:-3137.40

     

shuntvoltage:-59.12   母线电压:12.16   current_mA:-548.50   负载电压:12.10   功率:-6637.33

     

shuntvoltage:-52.00   母线电压:12.18   current_mA:-691.30   负载电压:12.12   权力:-8381.32

     

shuntvoltage:-32.09   母线电压:12.12   current_mA:-936.60   loadvoltage:12.09   功率:-11321.54

     

shuntvoltage:-27.42   母线电压:12.11   current_mA:-286.00   负载电压:12.08   功率:-3455.05

     

shuntvoltage:-86.82   母线电压:12.11   current_mA:-338.90   loadvoltage:12.03   功率:-4075.33

     

shuntvoltage:-67.63   母线电压:12.16   current_mA:-620.90   loadvoltage:12.09   功率:-7508.15

     

shuntvoltage:-30.81   母线电压:12.18   current_mA:-874.60   负载电压:12.15   功率:-10625.68

     

shuntvoltage:-30.31   母线电压:12.11   current_mA:-346.90   负载电压:12.08   功率:-4189.75

     

shuntvoltage:-71.75   母线电压:12.16   current_mA:-557.00   loadvoltage:12.09   权力:-6733.16

     

shuntvoltage:-48.03   母线电压:12.18   current_mA:-668.70   loadvoltage:12.13   功率:-8112.65

     

shuntvoltage:-31.90   母线电压:12.18   current_mA:-938.20   负载电压:12.15   功率:-11397.35

     

shuntvoltage:-30.14   母线电压:12.12   current_mA:-627.20   loadvoltage:12.09   功率:-7580.25

     

shuntvoltage:-31.42   母线电压:12.14   current_mA:-430.20   负载电压:12.10   功率:-5207.39

     

shuntvoltage:-66.28   母线电压:12.17   current_mA:-643.70   负载电压:12.10   电源:-7789.88

     

shuntvoltage:-30.93   母线电压:12.18   current_mA:-880.00   负载电压:12.15   功率:-10694.70

这可能是一个愚蠢的问题,但为什么分流电压值为负?而目前的价值?也许我只需要颠倒极性。

感谢您的帮助!

[edit]:这是执行器的规格:http://www.progressiveautomations.com/media/catalog/pdf/Linear_Actuator_with_Potentiometer_PA-14P.pdf

1 个答案:

答案 0 :(得分:0)

以下是Adafruit代码的摘录。它显示了如何计算参数。您还可以在INA219数据表中找到相关信息。 这是如何为16V 400mA设置IC的示例。

void Adafruit_INA219::setCalibration_16V_400mA(void) {

  // Calibration which uses the highest precision for 
  // current measurement (0.1mA), at the expense of 
  // only supporting 16V at 400mA max.

  // VBUS_MAX = 16V
  // VSHUNT_MAX = 0.04          (Assumes Gain 1, 40mV)
  // RSHUNT = 0.1               (Resistor value in ohms)

  // 1. Determine max possible current
  // MaxPossible_I = VSHUNT_MAX / RSHUNT
  // MaxPossible_I = 0.4A

  // 2. Determine max expected current
  // MaxExpected_I = 0.4A

  // 3. Calculate possible range of LSBs (Min = 15-bit, Max = 12-bit)
  // MinimumLSB = MaxExpected_I/32767
  // MinimumLSB = 0.0000122              (12uA per bit)
  // MaximumLSB = MaxExpected_I/4096
  // MaximumLSB = 0.0000977              (98uA per bit)

  // 4. Choose an LSB between the min and max values
  //    (Preferrably a roundish number close to MinLSB)
  // CurrentLSB = 0.00005 (50uA per bit)

  // 5. Compute the calibration register
  // Cal = trunc (0.04096 / (Current_LSB * RSHUNT))
  // Cal = 8192 (0x2000)

  ina219_calValue = 8192;

  // 6. Calculate the power LSB
  // PowerLSB = 20 * CurrentLSB
  // PowerLSB = 0.001 (1mW per bit)

  // 7. Compute the maximum current and shunt voltage values before overflow
  //
  // Max_Current = Current_LSB * 32767
  // Max_Current = 1.63835A before overflow
  //
  // If Max_Current > Max_Possible_I then
  //    Max_Current_Before_Overflow = MaxPossible_I
  // Else
  //    Max_Current_Before_Overflow = Max_Current
  // End If
  //
  // Max_Current_Before_Overflow = MaxPossible_I
  // Max_Current_Before_Overflow = 0.4
  //
  // Max_ShuntVoltage = Max_Current_Before_Overflow * RSHUNT
  // Max_ShuntVoltage = 0.04V
  //
  // If Max_ShuntVoltage >= VSHUNT_MAX
  //    Max_ShuntVoltage_Before_Overflow = VSHUNT_MAX
  // Else
  //    Max_ShuntVoltage_Before_Overflow = Max_ShuntVoltage
  // End If
  //
  // Max_ShuntVoltage_Before_Overflow = VSHUNT_MAX
  // Max_ShuntVoltage_Before_Overflow = 0.04V

  // 8. Compute the Maximum Power
  // MaximumPower = Max_Current_Before_Overflow * VBUS_MAX
  // MaximumPower = 0.4 * 16V
  // MaximumPower = 6.4W

  // Set multipliers to convert raw current/power values
  ina219_currentDivider_mA = 20;  // Current LSB = 50uA per bit (1000/50 = 20)
  ina219_powerDivider_mW = 1;     // Power LSB = 1mW per bit

  // Set Calibration register to 'Cal' calculated above 
  wireWriteRegister(INA219_REG_CALIBRATION, ina219_calValue);

  // Set Config register to take into account the settings above
  uint16_t config = INA219_CONFIG_BVOLTAGERANGE_16V |
                    INA219_CONFIG_GAIN_1_40MV |
                    INA219_CONFIG_BADCRES_12BIT |
                    INA219_CONFIG_SADCRES_12BIT_1S_532US |
                    INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS;
  wireWriteRegister(INA219_REG_CONFIG, config);
}

让我们从最大总线电压开始。你有一个12V电源,所以我们坚持16V的例子(你可以选择16V和32V) Adafruit板的分流电阻值为0.1欧姆。 您的执行器在最大负载下消耗5A。欧姆定律告诉我们,最大电流会导致分流电阻上的压降为0.5V,因此我们的VSHUNT_MAX为0.5

现在计算当前测量的LSB值。 5A / 32767LSB =每LSB150μA(当然,如果您不需要全分辨率,您可以选择其他东西)

根据数据表中的公式计算校准寄存器: Cal = trunc(0.04096 / 0.00015 / 0.1)= 2730

等等......我希望你明白这一点。