mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-04-14 10:07:39 +08:00
fix(ms5611): correct timestamp_sample to integration midpoint
The MS5611 ADC conversion at OSR 1024 takes ~2.28ms, but the data is read after a 10ms scheduling delay. The current code timestamps the read time, which is ~8.9ms after the true integration midpoint. Correct timestamp_sample by subtracting the full offset (CONVERSION_INTERVAL - CONVERSION_TIME/2) from the read time.
This commit is contained in:
parent
8170e113fd
commit
c149bad4f2
@ -83,6 +83,7 @@ enum MS56XX_DEVICE_TYPES {
|
||||
* conversion finished
|
||||
*/
|
||||
#define MS5611_CONVERSION_INTERVAL 10000 /* microseconds */
|
||||
#define MS5611_OSR1024_CONVERSION_TIME 2280 /* max ADC conversion time at OSR 1024, microseconds */
|
||||
#define MS5611_MEASUREMENT_RATIO 3 /* pressure measurements per temperature measurement */
|
||||
|
||||
class MS5611 : public I2CSPIDriver<MS5611>
|
||||
|
||||
@ -243,8 +243,13 @@ MS5611::collect()
|
||||
|
||||
perf_begin(_sample_perf);
|
||||
|
||||
/* read the most recent measurement - read offset/size are hardcoded in the interface */
|
||||
const hrt_abstime timestamp_sample = hrt_absolute_time();
|
||||
/* Correct for measurement integration delay: the conversion was
|
||||
* started CONVERSION_INTERVAL ago and took OSR1024_CONVERSION_TIME
|
||||
* to integrate, so the effective sample midpoint is
|
||||
* (CONVERSION_INTERVAL - OSR1024_CONVERSION_TIME/2) before now. */
|
||||
const hrt_abstime now = hrt_absolute_time();
|
||||
static constexpr hrt_abstime correction = MS5611_CONVERSION_INTERVAL - MS5611_OSR1024_CONVERSION_TIME / 2;
|
||||
const hrt_abstime timestamp_sample = (now > correction) ? (now - correction) : now;
|
||||
int ret = _interface->read(0, (void *)&raw, 0);
|
||||
|
||||
if (ret < 0) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user