Найти прошедшее время на последовательном плоттере
Как узнать прошедшее время из графика последовательного плоттера? Я вывожу на график значения датчиков с 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);
, но, как видно, время цикла не постоянно.
@rrz0, 👍0
Обсуждение1 ответ
Лучший ответ:
Это зависит от того, насколько точной должна быть ваша временная база. Ось 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
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- В чем разница между библиотеками Software Serial? Какая из них совместима с Arduino Nano?
- Как отправить команду AT на sim800l с помощью SoftwareSerial
- Проблемы с последовательной связью от Arduino к Bluetooth HC-05
- Как Arduino может проверить, подключен ли он к ПК и включен ли компьютер?
- Как отправлять и получать беззнаковые целые (unsigned int) от одного arduino к другому arduino
- Использование последовательных контактов TX/ RX для связи по USB
- NRF24L01+ (библиотека TMRH20): Получатель получает пустые данные
Последовательный плоттер в 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