Найти прошедшее время на последовательном плоттере

Как узнать прошедшее время из графика последовательного плоттера? Я вывожу на график значения датчиков с Arduino Nano и хотел бы узнать шкалу времени по оси x, чтобы рассчитать время установления колебаний. Я попробовал рекомендации, приведенные здесь, но, похоже, в моем случае они не сработали.

Например, на графике ниже я хотел бы узнать время, которое потребовалось датчикам, чтобы зафиксировать первое движение в точке около 190.

Я делаю следующее, чтобы вывести два значения:

   //printData1();
   Serial.print(roll_err);
   Serial.print(" ");
   Serial.println(pitch_err);
   Serial.print(" ");

Скорость передачи данных: 9600 Время цикла: 40 мс

Если время моего цикла 40 мс, то я думал, что общее время будет 180*40 мс. Это рассуждение верно?

Есть ли лучший способ считывания прошедшего времени на последовательном плоттере?

РЕДАКТИРОВАНИЕ: Попытка получить «сетку» в 10 мс

В соответствии с предложением в ответе ниже я попробовал запустить что-то похожее на следующее, но цикл не выполняется с постоянным временем.

Я попытался добавить Serial.print(((millis()/10)%2)*50);, но, как видно, время цикла не постоянно.

, 👍0

Обсуждение

Последовательный плоттер в IDE довольно прост. Ось x — это просто количество значений y и 1 пиксель в направлении x. Вы можете попробовать добавить Serial.print(((millis()/10)%2)*50); , чтобы подделать «сетку» с шагом 10 мс. Serial.print(" ");, @Gerben

Если текущее время цикла составляет 40 мс, разве мне не следует разделить его на 40, чтобы получить «сетку» в 10 мс?, @rrz0

Извините, я немного пропустил эту часть. Я бы, наверное, остановился на 1000 мс. Но учтите, что строка может оказаться, например, 2038 мс вместо 2000 мс из-за того, что на один цикл уходит около 40 мс., @Gerben

Альтернативой было бы также распечатать значение миллис и скопировать данные в Excel. И использовать это для построения графика., @Gerben


1 ответ


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

2

Это зависит от того, насколько точной должна быть ваша временная база. Ось x плоттера — это количество выборок, а не время, поэтому вам нужно выдавать выборки с фиксированной частотой, чтобы они имели временную значимость.

Ваш

loop(){
   yadda();
   zadda();
}

может работать с постоянной скоростью, а может и нет, в зависимости от того, что происходит на каждой итерации цикла, а также от вашего определения «постоянной» (я не верю, что я только что это сказал...)

Даже если ни один из ваших кодов не является условным, преобразование двоичного кода в ASCII, прерывания часов и последовательного порта, а также другой низкоуровневый код, который мы не видим, могут работать немного по-разному от итерации к итерации; например, количество прерываний во время любой заданной итерации может существенно различаться.

Если вам нужно удержать более узкую временную базу, остановка в нижней части цикла до тех пор, пока millis() не достигнет (предыдущего millis() + константы интервала), по крайней мере, позволит вам уложиться в миллисекунду фиксированной скорости цикла. Конечно, вы можете сделать то же самое с micros(), если вы точно знаете, что цикл никогда не может выполняться дольше, чем 1/частота, на которой вам нужно его запустить, и даже тогда он должен занять достаточно много времени (это технический термин! :) меньше этого, «на всякий случай».

Обновление:

Хотя я написал «задержка» в конце цикла, лучшая техника — вызывать каждую задачу (в вашем случае одну из них — пока ? ) как можно чаще и позволить каждой задаче решать, нужно ли ее выполнять. Так что в вашем случае:

loop {
  maybeSampleAndPlot();
  // maybeDoSomeOtherThing(); // пока не реализовано...
}

maybeSampleAndPlot(){
  time = millis();
  if time - previousSampleTime >= MSEC_040
    save (time + MSEC_040) as nextSampleTime;
    sample the data;
    plot the data;
  endif
}
,

Спасибо за ответ. Я попробую это реализовать. Используется ли константа интервала для учета добавлений во время вычислений в основном цикле? Обновил свой вопрос. Не могли бы вы предоставить короткий псевдокод того, как мне реализовать вычисление millis()? Очень признателен., @rrz0

Посмотрите на пример BlinkWithoutDelay в Arduino IDE и замените код мигания светодиода на ваш код измерения. Затем измените переменную interval на нужное вам значение., @chrisl

if time >= nextSampleTime следует заменить на if time - previousSampleTime >= MSEC_040. В противном случае синхронизация будет нарушена, когда millis() перейдет через границу. Учебник «Мигание без задержки» делает это правильно., @Edgar Bonet

Абсолютно верно - исправлено. Спасибо, @EdgarBonet. [face-palm], @JRobert