Вывод в монитор порта и паузы

DarkMorro

✩✩✩✩✩✩✩
27 Окт 2020
4
0
Всем привет! Помогите пожалуйста разобраться.
Написал код для изменения скорости шагового двигателя в зависимости от удаленности магнита от датчика хола. Для наглядности выводил вычисляемые значения в монитор порта. Ситуация следующая: все работает, но работает не плавно, а с рывками, мотор дрожит. Так, будто в коде есть небольшой delay(). Стоило закомментить строку, которая выводит значения в монитор, как все начало работать плавно. Объективно, эта строка в последствии и не нужна, но в процессе отладки я не сразу понял в чем проблема, комментил строку наугад. Это нормальное поведение или я что-то сделал не правильно? Можно как-то это обойти? В процессе разработки иногда подглядывать в монитор все-таки бывает нужно.
Код прилагаю.
C++:
#include "GyverStepper2.h"
GStepper2< STEPPER2WIRE > stepper(200, 3, 2);

int analogPin = A0;
int frequency;

void setup() {
  stepper.setAcceleration(400);
  stepper.setMaxSpeed(800);   
  Serial.begin(9600);
}
void loop() {
  stepper.tick();
  int analogValue = analogRead(analogPin);
  frequency = map(analogValue, 334, 517, 0, 800);
  Serial.println((String)analogValue + "\t" +(String)frequency);
  stepper.setSpeed(frequency);
 }
 

poty

★★★★★★✩
19 Фев 2020
3,261
948
Ну, ответ на этот вопрос можно найти в любой ветке, где имеется real time обработка. Помимо работоспособности кода с точки зрения логики нужно ещё писать его, не знаю как правильнее сказать, атомарно, наверное. Чтобы ни в одном месте не было задержек в некотором блокирующем куске кода (при использовании прерываний) или общего времени выполнения loop, если применяется программное распараллеливание.
В данном случае - почему бы не увеличить скорость Serial до 115200 или выше? Почему 9600? Выводить минимальную информацию. Выводить её реже. И т.п.
Это не освобождает от оптимизации кода, но несколько облегчает разработку.
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
499
146
@DarkMorro,
Для Arduino UNO и подобных Serial.print выводит данные через встроенный буфер размером 64 байта. И пока место в буфере есть, ощутимых задержек нет. Но когда место в буфере заканчивается, то Serial.print ждет, пока не положит все данные в буфер. При скорости 9600 на отправку одного байта надо примерно 1 мс. А вы вызываете Serial.print постоянно в loop без задержек. Буфер заполняется, и начинаются задержки.
 
  • Лойс +1
Реакции: DarkMorro

viktor1703

★★★✩✩✩✩
9 Дек 2021
632
150
В добавку, ещё перед выводом в порт имеется map(), в которой и деление, и умножение.
 
  • Лойс +1
Реакции: DarkMorro