I want to read sensor data using analogRead() after every 5ms. I have read other answers to similar questions but what I'm confused about is:
let's say, I made a loop to read sensor data using analogRead() at the end of which I write delay(50)
it means it'll take some time to read data(adc) , then it'll wait for 50ms
time to execute loop isn't same for every iteration so we get the pattern as: some time for loop execution, delay of 50ms, some time for next iteration........and so on I want to ask if I want arduino to read sensor data exactly every 5ms, what should I do? Thanks
-
2do not use delay() ..... see BlinkWithoutDelay example sketchjsotola– jsotola09/26/2018 20:51:18Commented Sep 26, 2018 at 20:51
2 Answers 2
You store the time (millis()
) of the last measurement. Then wait till 5ms have past since the last measurement. Do your measurement, and update the time.
Something like:
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);
}
-
It waited for 5ms, then last measurement=0+5=5 ms. Then it’ll do analogRead(). Let’s say analogRead() took 10ms, then mills()- last measurement() = 15-5 ms=10 ms so the loop will do another analogRead() although it’s not reading measurement exactly after 5 ms. So this will only work if loop execution time is <5msTalha Yousuf– Talha Yousuf09/26/2018 19:15:21Commented Sep 26, 2018 at 19:15
-
Indeed. It can't magically go back in time. Was there any question there?Gerben– Gerben09/27/2018 09:29:26Commented Sep 27, 2018 at 9:29
You do something like this
unsigned long timerMesurement = 0;
void loop()
{
if (millis() - timerMesurement > 5UL) {
timerMesurement = millis();
int measurement = analogRead(A0);
}
}
-
Sigma, it should be
>=
for the right interval. It should also betimermeasurement += 5UL;
for a interval that is fixed in time without increasing delays, the return value of millis() could have increased since the previous line.Jot– Jot09/27/2018 04:57:49Commented Sep 27, 2018 at 4:57
Explore related questions
See similar questions with these tags.