I was using an Arduino Uno to measure the PPS (pulse per second) pin from a GPS module to allow comparison with the PPS from a DS1307 RTC real time clock. I used interrupts 0 and 1 of the Arduino to trigger on rising edges of both PPS pins to trigger a reading from the micros() function and then subtract this reading from a subsequent micros() reading taken on the next rising edge so giving me a measure of the pulse width in microseconds, give or take four microseconds. Apparently the misnamed micros() function cannot make one microsecond measurements. Using this setup I was able to see that the 16MHz clock on the Arduino was out compared to the GPS PPS pin which from the datasheet was accurate to the tens of nano seconds range. The measured error I found was due to the Arduino using a resonator for its system clock, known for not being as accurate a crystal. The strange thing is there is already a crystal on the board for the USB serial chip, probably for accurate baud rates, it is 16MHz the value we need. I removed the resonator for the ATMega328P from the board and made a direct connection from the crystal oscillator output of the USB serial chip to the oscillator input of the ATMega328P. The board can still be programmed and now has a more accurate system clock for my measurements. I wonder if this is something that could be done to the Arduino to save the cost of a resonator. I eventually moved my sketch to a Stellaris Launchpad which has an 80MHz clock and can measure down to one microsecond with its appropriately named micros() function.
|16MHz Resonator removed, center of PCB|
|16MHz Osc Output of ATMega8U2 connected to ATMeg328P Osc input|