joplin-mdbooks-website/content/ardupilot/current-sensor-calibrator.md

150 lines
5.3 KiB
Markdown
Raw Normal View History

2023-02-05 07:59:17 -05:00
# Current sensor calibrator
<style>
div.box{
/* width: 90%; */
}
.number {
width: 60px;
}
</style>
<script type="text/javascript">
// 1674123219
function precisionRoundMod(number, precision) {
var factor = Math.pow(10, precision);
var n = precision < 0 ? number : 0.01 / factor + number;
return Math.round( n * factor) / factor;
}
function apcalc() {
scale = 100;
const measurements = [];
const realvalues = [];
const coeffs = [];
const scale_adjusted_meas = [];
const current_offsets = [];
for (var i = 1; i < 5; i++)
{
meas = parseFloat(document.getElementById('m'+i).value);
real = parseFloat(document.getElementById('r'+i).value);
measurements.push(meas);
realvalues.push(real);
if(i != 1){
var p=i;
p--;
pmeas = parseFloat(document.getElementById('m'+p).value);
preal = parseFloat(document.getElementById('r'+p).value);
coeffs.push( (meas-pmeas)/ (real-preal) );
}
}
for(var i=0, n=coeffs.length; i < n; i++)
{
console.log("coeff: "+parseFloat(coeffs[i]));
}
console.log("coeff sum: "+coeffs.reduce((partialSum, a) => partialSum + a, 0));
const avg_coeffs = coeffs.reduce((partialSum, a) => partialSum + a, 0) / coeffs.length;
console.log("coeff avg: "+avg_coeffs);
for(var i=0, n=measurements.length; i < n; i++)
{
scale_adjusted_meas.push(measurements[i]/avg_coeffs);
console.log("scale_adjusted_meas: "+measurements[i]/avg_coeffs);
}
for(var i=0, n=realvalues.length; i < n; i++)
{
current_offsets.push(scale_adjusted_meas[i] - realvalues[i]);
console.log(scale_adjusted_meas[i] - realvalues[i] );
}
const avg_offset = current_offsets.reduce((partialSum, a) => partialSum + a, 0) / current_offsets.length;
console.log("avg_offset: "+avg_offset);
document.getElementById('r_offset').value = precisionRoundMod( (avg_offset / (scale / avg_coeffs)), 4 );
document.getElementById('r_scale').value = precisionRoundMod( (scale / avg_coeffs) ,4);
}
function init() {
document.querySelectorAll("input").forEach(input => {
input.addEventListener("input", apcalc);
});
}
window.onload = init;
</script>
This calculator will allow you to calibrate your current sensor better than with the mAh charged vs mAh consumed method.
You need a current meter and a way to see what current and throttle percentage the FC reports (the OSD is a good way to do this).
The steps to follow are:
0. Make sure you have capacitors on ESCs so the measurement will not be influenced by errors from ESC noise.
1. Set `BATT_AMP_PERVLT=100` and `BATT_AMP_OFFSET=0`.
3. Power your plane with propellers on and a current meter connected between FC and pack.
4. Arm and run the motor in manual mode. For four different throttle positions, note down: The throttle position (from the OSD), the reported current (from the OSD), and the actual current (from the current meter). The best throttle positions to use would be 25%, 50%, 75% and 100%. Do not check current on idle as this will be inaccurate.
5. Enter the values below, and the calculator will give you the proper BATT_AMP_PERVLT and BATT_AMP_OFFSET values that you now need to write to your plane's parameters.
<div class="box">
<div id="input">
<table style="border: none">
<tr>
<td>Throttle:</td>
<td>
<input class="number" type="text" id="m1" value="25" placeholder="OSD value">
<input class="number" type="text" id="m2" value="50" placeholder="OSD value">
<input class="number" type="text" id="m3" value="75" placeholder="OSD value">
<input class="number" type="text" id="m4" value="100" placeholder="OSD value">
</td>
</tr>
<tr>
<td>
Current:
</td>
<td>
<input class="number" type="text" id="r1" value="2.0" placeholder="current meter">
<input class="number" type="text" id="r2" value="4.0" placeholder="current meter" >
<input class="number" type="text" id="r3" value="8.0" placeholder="current meter" >
<input class="number" type="text" id="r4" value="12.0" placeholder="current meter">
</td>
</tr>
<tr>
<td>
<br>Results:<br>
</td>
</tr>
<tr>
<td>
<code>BATT_AMP_OFFSET</code>:
</td>
<td>
<input class="number" type="text" id="r_offset" value="" placeholder="offset" ><br>
</td>
</tr>
<tr>
<td>
<code>BATT_AMP_PERVLT</code>:
<td>
<input class="number" type="text" id="r_scale" value="" placeholder="scale" >
</td>
</tr>
</table>
</div>
<br>
<div id="result">
</div>
</div>
_(Many thanks to mfoos for writing this note.)_
* * *
<p style="font-size:80%; font-style: italic">
Last updated on February 05, 2023. For any questions/feedback,
email me at <a href="mailto:hi@stavros.io">hi@stavros.io</a>.
</p>