/*
* Arduino Sampling Rate Test
* Tests actual sampling rate for analog and digital reads
*/
// Test configuration
#define TEST_PIN A0 // Analog pin to test
#define SAMPLE_COUNT 10000 // Number of samples to take
#define WARMUP_SAMPLES 100 // Warmup samples to stabilize
void setup() {
Serial.begin(115200);
while (!Serial) {
; // Wait for serial port to connect (needed for native USB)
}
Serial.println("Arduino Sampling Rate Test");
Serial.println("==========================");
// Print board info
#if defined(ARDUINO_AVR_UNO)
Serial.println("Board: Arduino Uno");
#elif defined(ARDUINO_AVR_MEGA2560)
Serial.println("Board: Arduino Mega 2560");
#elif defined(ARDUINO_AVR_NANO)
Serial.println("Board: Arduino Nano");
#elif defined(ARDUINO_SAM_DUE)
Serial.println("Board: Arduino Due");
#elif defined(ARDUINO_ARCH_ESP32)
Serial.println("Board: ESP32");
#elif defined(ARDUINO_ARCH_ESP8266)
Serial.println("Board: ESP8266");
#else
Serial.println("Board: Unknown/Generic Arduino");
#endif
Serial.print("CPU Frequency: ");
Serial.print(F_CPU / 1000000);
Serial.println(" MHz");
Serial.println();
delay(2000);
}
void loop() {
// Test 1: Analog Read Sampling Rate
testAnalogSamplingRate();
delay(3000);
// Test 2: Digital Read Sampling Rate
testDigitalSamplingRate();
delay(3000);
// Test 3: Analog Read with Different Prescalers
testAnalogPrescalers();
Serial.println("\nTests complete. Restarting in 10 seconds...\n");
delay(10000);
}
void testAnalogSamplingRate() {
Serial.println("Test 1: Analog Read Sampling Rate");
Serial.println("----------------------------------");
// Warmup
for (int i = 0; i < WARMUP_SAMPLES; i++) {
analogRead(TEST_PIN);
}
// Measure sampling rate
unsigned long startTime = micros();
for (long i = 0; i < SAMPLE_COUNT; i++) {
analogRead(TEST_PIN);
}
unsigned long endTime = micros();
unsigned long duration = endTime - startTime;
// Calculate results
float samplesPerSecond = (SAMPLE_COUNT * 1000000.0) / duration;
float microsPerSample = (float)duration / SAMPLE_COUNT;
Serial.print("Samples taken: ");
Serial.println(SAMPLE_COUNT);
Serial.print("Total time: ");
Serial.print(duration);
Serial.println(" us");
Serial.print("Time per sample: ");
Serial.print(microsPerSample, 2);
Serial.println(" us");
Serial.print("Sampling rate: ");
Serial.print(samplesPerSecond, 2);
Serial.println(" samples/second");
Serial.print("Sampling rate: ");
Serial.print(samplesPerSecond / 1000.0, 2);
Serial.println(" kHz");
Serial.println();
}
void testDigitalSamplingRate() {
Serial.println("Test 2: Digital Read Sampling Rate");
Serial.println("-----------------------------------");
pinMode(2, INPUT);
// Warmup
for (int i = 0; i < WARMUP_SAMPLES; i++) {
digitalRead(2);
}
// Measure sampling rate
unsigned long startTime = micros();
for (long i = 0; i < SAMPLE_COUNT; i++) {
digitalRead(2);
}
unsigned long endTime = micros();
unsigned long duration = endTime - startTime;
// Calculate results
float samplesPerSecond = (SAMPLE_COUNT * 1000000.0) / duration;
float microsPerSample = (float)duration / SAMPLE_COUNT;
Serial.print("Samples taken: ");
Serial.println(SAMPLE_COUNT);
Serial.print("Total time: ");
Serial.print(duration);
Serial.println(" us");
Serial.print("Time per sample: ");
Serial.print(microsPerSample, 2);
Serial.println(" us");
Serial.print("Sampling rate: ");
Serial.print(samplesPerSecond, 2);
Serial.println(" samples/second");
Serial.print("Sampling rate: ");
Serial.print(samplesPerSecond / 1000.0, 2);
Serial.println(" kHz");
Serial.println();
}
void testAnalogPrescalers() {
Serial.println("Test 3: Analog Read with Different ADC Prescalers");
Serial.println("--------------------------------------------------");
Serial.println("(Note: This test is for AVR boards like Uno, Mega, Nano)");
#if defined(__AVR__)
byte prescalers[] = {16, 32, 64, 128};
byte prescalerBits[] = {
0b100, // 16
0b101, // 32
0b110, // 64
0b111 // 128 (default)
};
for (int i = 0; i < 4; i++) {
// Set ADC prescaler
ADCSRA = (ADCSRA & 0xF8) | prescalerBits[i];
// Warmup
for (int j = 0; j < WARMUP_SAMPLES; j++) {
analogRead(TEST_PIN);
}
// Measure
unsigned long startTime = micros();
for (long j = 0; j < SAMPLE_COUNT; j++) {
analogRead(TEST_PIN);
}
unsigned long endTime = micros();
unsigned long duration = endTime - startTime;
float samplesPerSecond = (SAMPLE_COUNT * 1000000.0) / duration;
Serial.print("Prescaler ");
Serial.print(prescalers[i]);
Serial.print(": ");
Serial.print(samplesPerSecond / 1000.0, 2);
Serial.println(" kHz");
}
// Restore default prescaler
ADCSRA = (ADCSRA & 0xF8) | 0b111;
#else
Serial.println("Prescaler adjustment only available on AVR boards");
#endif
Serial.println();
}