Считать данные датчика повторно через указанное время?

Я хочу считывать данные датчика с помощью analogRead() каждые 5 мс. Я читал другие ответы на подобные вопросы, но меня смущает следующее:

  • допустим, я сделал цикл чтения данных датчика с помощью analogRead(), в конце которого пишу delay(50)

  • это означает, что чтение данных (adc) займет некоторое время, а затем будет ждать 50 мс

  • время выполнения цикла не одинаково для каждой итерации, поэтому мы получаем шаблон: некоторое время для выполнения цикла, задержка 50 мс, некоторое время для следующей итерации........и так далее Я хочу спросить, хочу ли я, чтобы Arduino считывал данные датчиков ровно каждые 5 мс, что мне делать? Спасибо

, 👍0

Обсуждение

не используйте задержку()..... см. пример эскиза BlinkWithoutDelay, @jsotola


2 ответа


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

1

Вы сохраняете время (миллис()) последнего измерения. Затем подождите, пока не пройдет 5 мс с момента последнего измерения. Выполните измерения и обновите время.

Что-то вроде:

unsigned long lastMeasurement = millis();

void loop()
{
  while( (millis()-lastMeasurement)<5 ){/* do nothing */}
  lastMeasurement = lastMeasurement + 5; //or use `lastMeasurement=millis();` depending on whether you want accuracy between measurement, or accuracy over time
  auto measurement = analogRead(A0);
}
,

Он ждал 5 мс, затем последнее измерение = 0+5 = 5 мс. Затем он выполнит AnalogRead(). Допустим, на выполнение AnalogRead() ушло 10 мс, затем на Mills() - последнее измерение() = 15-5 мс=10 мс, поэтому цикл выполнит еще одно AnalogRead(), хотя измерение не будет считываться ровно через 5 мс. Таким образом, это будет работать только в том случае, если время выполнения цикла составляет <5 мс., @Talha Yousuf

Действительно. Оно не может волшебным образом вернуться в прошлое. Был ли там какой-нибудь вопрос?, @Gerben


0

Вы делаете что-то подобное

unsigned long timerMesurement = 0;

void loop()
{
  if (millis() - timerMesurement > 5UL) { 
    timerMesurement = millis(); 
    int measurement = analogRead(A0); 
  }
}
,

Сигма, для правильного интервала должно быть >=. Это также должно быть timermeasurement += 5UL; для интервала, который фиксирован во времени без увеличения задержек, возвращаемое значение millis() могло бы увеличиться по сравнению с предыдущей строкой., @Jot