Почему я получаю разное время при использовании 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()
займет больше времени, но здесь все наоборот.
Кто-нибудь может объяснить причину такого поведения?
@Farahi, 👍0
Обсуждение1 ответ
Лучший ответ:
Оба ваших примера используют цикл while, поэтому цикл while не является проблемой.
Аналоговое считывание с неизменными прескалерами занимает 104 мкс. Итак, то, что вы действительно измеряете, - это ваши задержки в 6 мс плюс небольшое дополнительное количество для другого кода.
Поскольку ваш первый цикл while обязательно занимает 6+ мс, то вы, естественно, получите результат, кратный 6 мс. По-видимому, это происходит, так что вы получаете два цикла (18 мс). Это не доказывает огромной суммы.
Вам нужно почитать о частоте Найквиста
Чтобы получить точные результаты выборки, вам нужно делать выборку в два раза быстрее, чем все меняется. Ваши первые результаты могут быть просто результатами сглаживания. Ваши задержки в 6 мс могут привести к тому, что вы возьмете один образец на одном переходе, а другой образец (возможно) через пару переходов позже. Таким образом, ваши результаты бессмысленны.
- Arduino непрерывно считывает значение АЦП с помощью прерывания
- Изменение значения АЦП после изменения значения Timer1 в программе
- Как сделать очень долгую функцию delay(), несколько часов
- Разница между «time_t» и «DateTime»
- Получение BPM из данного кода
- Отправка значения с одного Arduino на другой
- Создание таймера с использованием часов реального времени с указанием времени начала и остановки
- Генерация стабильной частоты
Какое напряжение вы подаете на А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