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