Почему я получаю разное время при использовании analogRead() внутри цикла while?

У меня есть следующий код, который проверяет задержку другой платы.

    int triggerPin = 13;
    int dataPin = 9;
    int ejectorPin = A0;
    unsigned long t_start = 0;
    unsigned long t_end = 0;
    unsigned long t_total = 0;
    int value = 0;
    
    void setup() {
      // put your setup code here, to run once:
      pinMode(triggerPin, OUTPUT);
      pinMode(dataPin, OUTPUT);
      pinMode(ejectorPin, INPUT);
      Serial.begin(9600);
    }
    
    void loop() {
      t_start = micros();
      while (value < 10 ) {
        digitalWrite(triggerPin, HIGH);
        digitalWrite(dataPin, HIGH);
        delay(5.0);
        digitalWrite(dataPin, LOW);
        digitalWrite(triggerPin, LOW);
        delay(1.0);
        value = analogRead(ejectorPin);
      }
      t_end = micros();
    
      t_total = (t_end - t_start);
      Serial.println(double(t_total) / 1000);

Обратите внимание, что я использую analogRead() внутри цикла while. С помощью этого метода я получаю 18,3 мс. Однако, если я использую analogRead() в состоянии while:

    void loop() {
      t_start = micros();
      while (analogRead() < 10 ) {
        .
        .
        .

тогда я получаю 30,2 мс. Я думал, что присвоение переменной значения analogRead() займет больше времени, но здесь все наоборот.

Кто-нибудь может объяснить причину такого поведения?

, 👍0

Обсуждение

Какое напряжение вы подаете на А0? Согласована ли она между запусками программы? Насколько согласованы напечатанные значения на всех итерациях цикла?, @Edgar Bonet

Ваши задержки будут полностью скрывать любые отклонения в времени аналогового считывания. Ваши предполагаемые результаты для нас ничего не значат., @Majenko

@EdgarBonet Насколько я могу судить, как входное напряжение, так и печатные значения довольно последовательны., @Farahi

@Majenko У меня только что был коллега по опыту, который сказал мне то же самое. Теперь мы используем двухканальный осциллограф, чтобы визуально проверить разницу во времени., @Farahi

@Majenko Но, тем не менее, простое перемещение analogRead() не должно приводить к разнице в 12 мс., @Farahi

@Farahi Это не будет analogRead. Это будет то, что "запускает" аналоговый поток. Аналоговый поток незначителен в масштабе вещей., @Majenko

@Majenko Но то же самое, что запускает analogRead внутри цикла, также запускает analogRead, когда он находится в состоянии while., @Farahi

И является ли время этого "одного и того же" абсолютно точно таким же, или ваши задержки могут влиять на то, как происходит ваша выборка? Помните: вы будете брать только один образец каждые 6 миллисекунд или около того, какой бы метод вы ни использовали. Имеет ли эта медленная частота дискретизации смысл для того, что вы отбираете?, @Majenko

@Majenko Я позволил обоим методам работать более 40 минут. Результаты были в значительной степени такими, как я упоминал в своем посте., @Farahi

@Farahi Ну и что? При детализации выборки в 6 мс точность составляет ±6 мс, или "в пределах 12 мс от реальности". О, смотри... 30-18-это 12... Какой сюрприз!.., @Majenko

@Majenko Нет необходимости в пассивной агрессивности. Я новичок во всем этом, так что мои вопросы могут показаться глупыми., @Farahi


1 ответ


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

2

Оба ваших примера используют цикл while, поэтому цикл while не является проблемой.

Аналоговое считывание с неизменными прескалерами занимает 104 мкс. Итак, то, что вы действительно измеряете, - это ваши задержки в 6 мс плюс небольшое дополнительное количество для другого кода.

Поскольку ваш первый цикл while обязательно занимает 6+ мс, то вы, естественно, получите результат, кратный 6 мс. По-видимому, это происходит, так что вы получаете два цикла (18 мс). Это не доказывает огромной суммы.


Вам нужно почитать о частоте Найквиста

Чтобы получить точные результаты выборки, вам нужно делать выборку в два раза быстрее, чем все меняется. Ваши первые результаты могут быть просто результатами сглаживания. Ваши задержки в 6 мс могут привести к тому, что вы возьмете один образец на одном переходе, а другой образец (возможно) через пару переходов позже. Таким образом, ваши результаты бессмысленны.

,