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

Как узнать прошедшее время из графика последовательного плоттера? Я вывожу на график значения датчиков с 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


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
}
,