Внутри функции проходит тысяча замеров напряжения, чтобы потом вычислить частоту. В этой функции нет никаких выводов и запросов. Но на время delta_time могут влиять другие функции, которые написаны после или вообще вне фукнции analyze(). Например, очень сильное влияние оказывает Serial.print().
void analyze (){
i = BUFFER_SIZE;
ADMUX=B11100111;
delay(10);
time = micros();
while (i--)
{
ADCSRA=B11000010; // 1/4
while (ADCSRA & (1 << ADSC)); // Ожидание флага окончания преобразования
buffer[ i ] = ADCH;
}
delta_time = micros() - time;
}
Очевидно, что во время выполнения опроса срабатывает таймер, который нужен для работы функции micros(). Но его влияние не должно увеличивать полученное время на 20-25 процентов. У меня получается, что если в функции loop() после вызова analyze() сделать несколько вызовов Serial.print(), то время delta_time весьма заметно увеличивается. Хотя я не понимаю как. Отключить таймер нельзя, так как без него я не могу узнать время выполнения цикла опроса АЦП.
Два вопроса:
1) почему Serial.print() и даже простые арифметические выражения "замедляют" опрос АЦП в другом месте программы?
2) как можно посчитать время другим способом, без использования таймера 0 и micros()/millis()?
P.S. Пример кода это слегка модифицированная функция AnRead() из CyberLib.h