This project makes a PIC microcontroller play audio PCM sounds using PWM modulation! Pulse-code modulation (PCM) is a digital representation of an analog signal where the magnitude of the signal is sampled regularly at uniform intervals, then quantized to a series of symbols in a digital (usually binary) code . Pulse-width modulation (PWM) of a signal or power source involves the modulation of its duty cycle, to either convey information over a communications channel or control the amount of power sent to a load .
The load of the PIC is the speaker.
Design and Implementation
The selected microcontroller is a PIC 18F1320  with 8KBytes of flash memory and a ECCP unit. A smaller flash unit also exists (18F1220). The 8 KBytes of flash allow almost a second of PCMaudio sampled at 8000Hz to be loaded into the PIC. One second of audio is nothing compared with modern digital audio recorders but is enough to demonstrate the application.
Audio samples can be found free of charge on the internet. As long as they can be converted to WAV format in 8bits per sample, at 8000Hz sampling, mono channel and have less than one second of audio, they can be used in this circuit.
The basic circuit includes a 78L05 voltage regulator, 100nF decoupling capacitor, the PIC, the speaker and a low-pass filter. The low-pass filter has its cutoff frequency at 3.3KHz.
The PIC microcontroller is programed to use the internal oscilator running at 8 MHz. That way we save a crystal and two capacitors.
The 78L05 is capable of supply 100mA of current which is enough to power the PIC with the speaker. Even a small amplifier may be included to provide more sound.
No PCB was made because this project was created to test an idea I had in my mind for a while and serves only as a base for anyone wishing to use it on any other project of their own.
The software for the PIC was developed in C (HI-TECH) and is available for download below. It uses the ECCP unit in PWM mode to generate the PWM waveform in hardware. Timer 2 is used to mark the PWM period without using interrupts. However, to create pauses between consecutive audio samples, the interrupt of timer 2 is configured to decrements a counter variable and serves no other purpose. This counter indicates the number of PWM periods to pause.