Считать данные датчика повторно через указанное время?
Я хочу считывать данные датчика с помощью analogRead() каждые 5 мс. Я читал другие ответы на подобные вопросы, но меня смущает следующее:
допустим, я сделал цикл чтения данных датчика с помощью analogRead(), в конце которого пишу delay(50)
это означает, что чтение данных (adc) займет некоторое время, а затем будет ждать 50 мс
время выполнения цикла не одинаково для каждой итерации, поэтому мы получаем шаблон: некоторое время для выполнения цикла, задержка 50 мс, некоторое время для следующей итерации........и так далее Я хочу спросить, хочу ли я, чтобы Arduino считывал данные датчиков ровно каждые 5 мс, что мне делать? Спасибо
@Talha Yousuf, 👍0
Обсуждение2 ответа
Лучший ответ:
Вы сохраняете время (millis()
) последнего измерения. Затем подождите, пока не пройдет 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
Вы делаете что-то подобное
unsigned long timerMesurement = 0;
void loop()
{
if (millis() - timerMesurement > 5UL) {
timerMesurement = millis();
int measurement = analogRead(A0);
}
}
Сигма, для правильного интервала должно быть >=
. Это также должно быть timermeasurement += 5UL;
для интервала, который фиксирован во времени без увеличения задержек, возвращаемое значение millis() могло бы увеличиться по сравнению с предыдущей строкой., @Jot
- Arduino mega PinChangeInterrupt с 16 битным таймером
- Проблема с использованием Arduino Mega Timer2 с прерыванием PinChange
- 4-битный счетчик вверх и вниз
- Проблема прерывания библиотеки MPU6050 Arduino Jeff Rowberg
- Точность синхронизации Arduino nano
- Мега: присоединение Interrupt на выводе 18/19/20/21 не работает
- Arduino Mega — включение режима CTC отключает таймер
- Обнаружение, когда прерывание таймера не выполняется
не используйте задержку()..... см. пример эскиза BlinkWithoutDelay, @jsotola