Цикл 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
.
@alim1990, 👍0
1 ответ
Лучший ответ:
▲ 2
Здесь есть пара ошибок:
Вы просто получаете удвоенное последнее прочитанное значение:
x_offset += x_offset;
Однако x_offset
всегда заменяется последним чтением. Вы ничего не суммируете.
- Чтобы получить что-то кроме 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("...");
,
@Majenko
Смотрите также:
- Выводы прерываний Arduino Mega 2560 и отображение портов с помощью поворотного энкодера
- Измерение скорости двигателя постоянного тока с помощью поворотного энкодера
- Сбой Arduino во время последовательной печати без очевидной причины
- Будет ли адаптер питания 12В постоянного тока, 1А подавать слишком большую мощность и повредит Arduino Mega 2560?
- Как запрограммировать Robotdyn Mega 2560 PRO MINI?
- Отключите автоматический сброс Mega 2560 на последовательном мониторе, открытом с помощью резистора 60 Ом.
- Сообщение об ошибке: "exit status 1 expected initializer before 'void'."
- Программирование пользовательских Arduino Mega с Arduino Uno
О, я этого не заметил. Спасибо, теперь работает., @alim1990