我正在使用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
答案 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
等等......我希望你明白这一点。