Прямоугольная волна с последовательным плоттером

У меня есть этот код, который создает прямоугольную волну:

int output_state = 0;
unsigned long start;

void setup() {
  Serial.begin(1200);
  start = millis();
}

void loop() {

  if((millis() - start) >=1000){
    output_state = ! output_state;
    //output_state *= 1023;
    start = millis();
  }

    Serial.println(output_state);
}

но должен ли я умножить сигнал на 1023:

output_state *= 1023;

этот сигнал генерируется последовательным плоттером:

Имейте в виду, что время выбрано правильно, просто ось x ускоряется до нулевых значений. Почему это происходит и как это можно решить?

Любые мысли будут оценены по достоинству.

, 👍2


1 ответ


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

3

Для печати "1023" требуется вдвое больше времени (6 байт, включая терминатор строки CRLF), чем для печати "0" (3 байта). Таким образом, в то же время вы печатаете вдвое больше "0", чем "1023".

Если вы хотите, чтобы точки данных печатались с постоянной скоростью, вы можете задать время печати точно так же, как вы это сделали для output_state. Имейте в виду, что вы не можете печатать более 20 образцов в секунду со скоростью 1200 бит / с. Вы также можете подкладывать строки так, чтобы они всегда были одинаковой длины:

char s[5];  // один байт для нулевого терминатора
sprintf(s, "%4d", output_state);
Serial.println(s);

Я бы предпочел первое решение (явно контролируйте время).

,