@@ -92,8 +92,8 @@ uint32_t Adis165xx::init(
9292 htim_ = htim;
9393 htimChannel_ = htim_channel;
9494
95- // groupDelay_ = (uint64_t) 1510
96- // + (uint64_t) 500000 / sampleRateHz_; // us, Approximate, Accel is 1.57ms, Gyro x&y are 1.51ms, and Gyro z is 1.29ms.
95+ groupDelay_ = (uint64_t ) 1510 + ( uint64_t ) 500000 / sampleRateHz_- 250 ;
96+ // us, Approximate, Accel is 1.57ms, Gyro x&y are 1.51ms, and Gyro z is 1.29ms.
9797
9898 HAL_GPIO_WritePin (spi_.port_ , spi_.pin_ , GPIO_PIN_SET);
9999 HAL_GPIO_WritePin (resetPort_, resetPin_, GPIO_PIN_SET);
@@ -224,6 +224,8 @@ bool Adis165xx::startDma(void) // called to start dma read
224224void Adis165xx::endDma (void ) // called when DMA data is ready
225225{
226226 uint8_t * rx = spi_.endDma ();
227+ ImuPacket p = {0 };
228+
227229 if (sampleRateHz_ == 2000 ) {
228230 // compute checksum
229231 uint16_t sum = 0 ;
@@ -233,9 +235,7 @@ void Adis165xx::endDma(void) // called when DMA data is ready
233235 for (int i = 0 ; i < ADIS_BUFFBYTES16 / 2 ; i++)
234236 data[i] = (int16_t ) rx[2 * i] << 8 | ((int16_t ) rx[2 * i + 1 ] & 0x00FF );
235237 if (sum == data[10 ]) {
236- ImuPacket p;
237- p.header .timestamp = drdy_;
238- p.header .complete = time64.Us (); p.header .status = (uint16_t ) data[1 ];
238+ p.header .status = (uint16_t ) data[1 ];
239239 p.gyro [0 ] = -(double ) data[2 ] * 0.001745329251994 ; // rad/s, or use 0.1 deg/s
240240 p.gyro [1 ] = -(double ) data[3 ] * 0.001745329251994 ; // rad/s, or use 0.1 deg/s
241241 p.gyro [2 ] = (double ) data[4 ] * 0.001745329251994 ; // rad/s, or use 0.1 deg/s
@@ -244,7 +244,6 @@ void Adis165xx::endDma(void) // called when DMA data is ready
244244 p.accel [2 ] = (double ) data[7 ] * 0.01225 ; // m/s^2
245245 p.temperature = (double ) data[8 ] * 0.1 + 273.15 ; // K
246246 p.dataTime = (double ) ((uint16_t ) data[9 ]) / sampleRateHz_;
247- if (p.header .status == ADIS_OK) write ((uint8_t *) &p, sizeof (p));
248247 }
249248 } else {
250249 // compute checksum
@@ -256,9 +255,6 @@ void Adis165xx::endDma(void) // called when DMA data is ready
256255 data[i] = (int16_t ) rx[2 * i] << 8 | ((int16_t ) rx[2 * i + 1 ] & 0x00FF );
257256
258257 if (sum == data[16 ]) {
259- ImuPacket p;
260- p.header .timestamp = drdy_;
261- p.header .complete = time64.Us ();
262258 p.header .status = (uint16_t ) data[1 ];
263259 p.gyro [0 ] = val (rx + 4 ) * 0.001745329251994 ; // rad/s, or use 0.1 deg/s
264260 p.gyro [1 ] = val (rx + 8 ) * 0.001745329251994 ; // rad/s, or use 0.1 deg/s
@@ -268,14 +264,17 @@ void Adis165xx::endDma(void) // called when DMA data is ready
268264 p.accel [2 ] = val (rx + 24 ) * 0.01225 ; // m/s^2
269265 p.temperature = (double ) data[14 ] * 0.1 + 273.15 ; // K
270266 p.dataTime = (double ) ((uint16_t ) data[15 ]) / sampleRateHz_;
271- if (p.header .status == ADIS_OK)
272- {
273- rotate (p.gyro );
274- rotate (p.accel );
275- write ((uint8_t *) &p, sizeof (p));
276- }
277267 }
278268 }
269+ if (p.header .status == ADIS_OK)
270+ {
271+ p.header .timestamp = drdy_-groupDelay_;
272+ rotate (p.gyro );
273+ rotate (p.accel );
274+ p.header .complete = time64.Us ();
275+ write ((uint8_t *) &p, sizeof (p));
276+ }
277+
279278}
280279
281280void Adis165xx::writeRegister (uint8_t address, uint16_t value)
0 commit comments