The POVG uses the "Persistence of Vision" phenomenon to display a 3D image of a spinning globe. This is the same principle which is used in CRT displays on a much larger, faster and more complex scale. Instead of the particle beam, the POVG uses a single curved row of LED's set on a rotating platform. As the base spins, the LED's turn on and off in combinations to trace out the map. Due to POV, these distributed lights blend into solid traces and, together, an image.
The system is controlled by a PIC16F877 microcontroller. The position and timing are kept track of using a single pulse encoder. A row of 16 red LEDs powered by a pair of 74F244 buffers provides the display. All these components are isolated on the spinning platform and powered by a single 9 Volt battery. The only external interaction is through the encoder. The platform is rotated within a frame by an electric motor.
The PIC16F877 microcontroller was chosen for this project because of its low price, simple coding and availability of built-in periferals. The 40-pin controller is relatively high-end and has a number of devices such as A/D, D/A, PWM, and serial bus interfaces, however, all that was used for this project were 16 I/O pins and the external input for the counter. The I/O pins of registers C and D were used to control the LEDs. Registers C and D were chosen because all 8 pins of each register are available for I/O and are not shared by other important functions which may have been necessary. Because the buffer chips used were capable of sinking more current than they could source, it was decided to arrange the circuit such that a low I/O pin results in a lit LED. Because of this the map bitmap was stored as 2 arrays of inverted data bytes, one for register C pins and the other for register D.
The encoder is set up to trigger an internal counter. This counter is capable of generating an interrupt when it overflows from 255 to 0. These interrupts are how the code keeps track of position and timing of the map display. A global index variable is kept tracking the position in the map. On each interrupt, bytes for registers C and D are looked up in the proper arrays using this index and sent out to the pins. Following this, the external impulse counter is reset to overflow after 8 external impulse instances and the index is incrementated. The encoder produces a total of 500 impulses per revolution and because of the spacing of the counter there is a total of 32 interrupts for each full rotation. Because 500 is not exactly divisible by 8, the index is skewed relative global position and the displayed globe rotates.
The map is rather low resolution. There are 16 LEDs and 32 divisons per rotation which makes for a 64 byte or 512 bit map. The small size is mostly due to the PIC's lack of free ram. There is plenty of program memory and EEPROM is available but program memory cannot be used to store data arrays and EEPROM is too slow. The data RAM is divided into 4 banks most of which is taken up by system registers which leaves relatively little continuous memory segments. Two separate 32 byte arrays can fit this space safely but there would not be much space for higher resolutions. The code for this project was developed using Microchip Technology Inc. MPLAB IDE 5.70.00 and Custom Computer Services Inc. C Compiler. The circuit layout was produced using ExpressPCB software version 3.2.0 and the board was printed, etched, cut, drilled, dropped, and populated using the resources available on campus.
pov.zip - zip file with the MPLAB project and circuit layout files.
spinning_globe.MPG - MPEG video file of the POVG in action. Unfortunately, the effect does not show up as well on video but it is still possible to see that it works.