Цикл Arduino над функцией всегда отображает 0 в качестве конечных значений.

Я пытаюсь выполнить циклическую обработку функции в Arduino, чтобы получить значения 2000 раз, а затем разделить их на 2000, чтобы получить среднее смещение:

int16_t x_offset = 0;
int16_t y_offset = 0;
int16_t z_offset = 0;

И внутри setup():

for(int i=0; i<2000;i++)
  {
    GetXYZ(x_offset, y_offset, z_offset);
    x_offset += x_offset;
    y_offset += y_offset;
    z_offset += z_offset; 
    Serial.println(x_offset);
    delay(3);
  }
  x_offset /= 2000;
  y_offset /= 2000;
  z_offset /= 2000;
  Serial.println(x_offset);Serial.println("...");Serial.println(y_offset);Serial.println("...");
Serial.println(z_offset);Serial.println("...");

Вот функция GetXYZ():

void GetXYZ( int16_t &x, int16_t &y, int16_t &z) {
  // Получаем значения гироскопа
  Wire.beginTransmission(MPU);
  Wire.write(0x43);     // первый регистр значений гироскопа
  Wire.endTransmission(false);

  Wire.requestFrom(MPU,6);
  x = Wire.read() << 8 | Wire.read();
  y = Wire.read() << 8 | Wire.read();
  z = Wire.read() << 8 | Wire.read();
}

Значения, напечатанные в последовательностях x_offset, y_offset и z_offset, всегда равны 0.

>

, 👍0


1 ответ


Лучший ответ:

2

Здесь есть пара ошибок:

  1. Вы просто получаете удвоенное последнее прочитанное значение:

    x_offset += x_offset;

Однако x_offset всегда заменяется последним чтением. Вы ничего не суммируете.

  1. Чтобы получить что-то кроме 0 при делении целого числа на 2000, значение, хранящееся в целом числе, должно быть > 2000. Но поскольку вы можете хранить максимум 32767 в переменных int16_t, даже если вы этого не сделали если бы возникла проблема в пункте 1, переменные переполнились бы, и результаты были бы бессмысленными.

Вам необходимо:

  • Используйте вторую переменную на каждой оси для хранения общего значения.
  • Убедитесь, что он достаточно велик для хранения максимального значения × 2000. Я бы предложил long или int32_t.

Например:

int16_t x_offset = 0;
int16_t y_offset = 0;
int16_t z_offset = 0;
int32_t x_total = 0;
int32_t y_total = 0;
int32_t z_total = 0;

И внутри setup():

for(int i=0; i<2000;i++)
  {
    GetXYZ(x_offset, y_offset, z_offset);
    x_total += x_offset;
    y_total += y_offset;
    z_total += z_offset; 
    Serial.println(x_offset);
    delay(3);
  }
  x_total /= 2000;
  y_total /= 2000;
  z_total /= 2000;
  Serial.println(x_total);Serial.println("...");Serial.println(y_total);Serial.println("...");
Serial.println(z_total);Serial.println("...");
,

О, я этого не заметил. Спасибо, теперь работает., @alim1990