The maximum frequency that this can measure is about 8 MHz (at a 50% duty cycle). Despite the fact that this counts the frequency on one of the digital pins, I have found that it will quite happily measure sine and triangle waves providing that they have a suitable amplitude.
Although the version that I built is a standalone unit, this circuitry could be easily incorporated into another project such as a function generator.
Step 1: Bill of materials
(2x) 10K resistors
(2x) 47uF electrolytic capacitors
(2x) 22pF ceramic capacitors
(1x) 1N4001 diode (any of the 1N400X series will do)
(1x) 16 MHz crystal
(1x) 7805 voltage regulator
(1x) ATmega328p-pu (programmed with the Arduino bootloader)
(1x) 2x16 LCD display (HD44780 compliant)
(1x) 28 pin DIL socket
(1x) SPST toggle/rocker switch
(1x) DC power socket
(1x) piece of stripboard 20 strips x 25 holes
(1x) project enclosure
(2x) 4mm banana sockets or (1x) BNC chassis-mount socket
The only tricky part to get for this project is the Atmel ATmega328p-pu microcontroller. Ordinarily this would not be a problem, but it has to have the Arduino bootloader installed on it. You can buy them on eBay very cheaply. You will also need a way to program the microcontroller. The easiest way to do this is using another Arduino board. See Step 5 for more details.