LED Display Controller schematic
The common cathode LED display array is connected in a matrix format, with each LED module sequentially scanned, with adjustment of anode drivers to produce the required digit.
For each scanned module, the Arduino sends 18 bits of data, 10-bits for the cathode driver and 8-bits for the anode, through 3x 74HC595 serial to parallel converters. Frame rate for the display is 100Hz.
The interface uses the high speed SPI hardware, with the software simply loading 3x 8-bit bytes and triggering the h/w transfer for each in turn. Data from the first 74HC595 is passed on to the 2nd after 8 clock cycles and then to the third after 8 more.
Pulse width modulation of nLED_ON allows for brightness control. If a column is selected for update to value that column will be brighter than the others. This gives a visual indication of how which decade of the digits will be changed when the rotary encoder is turned.
I found on a very early design that sending data to the display over the conventional serial bus caused the display to freeze and turn off whilst the serial comms was being actioned.
This implementation uses a custom interface that uses 3 pins and an interrupt routine. SER_IN_EN, SER_IN_CLK and SER_IN_DAT form this interface. It is similar to SPI but runs at a relatively low speed, reducing the flicker associated with updates.
The jumper "SIDE" is only fitted on the left hand bank. This pulls down the Arduino GPIO which the s/w reads at boot-up to determine if it needs to configure itself for the left hand mapping. If the jumper is not fitted the s/w configures itself for the right hand mapping.
Ilimit is an output from the Arduino to drive a red or green LED to indicate current limit (red) or voltage limit (green).
LED Display Controller schematic
The common cathode LED display array is connected in a matrix format, with each LED module sequentially scanned, with adjustment of anode drivers to produce the required digit.
For each scanned module, the Arduino sends 18 bits of data, 10-bits for the cathode driver and 8-bits for the anode, through 3x 74HC595 serial to parallel converters. Frame rate for the display is 100Hz.
The interface uses the high speed SPI hardware, with the software simply loading 3x 8-bit bytes and triggering the h/w transfer for each in turn. Data from the first 74HC595 is passed on to the 2nd after 8 clock cycles and then to the third after 8 more.
Pulse width modulation of nLED_ON allows for brightness control. If a column is selected for update to value that column will be brighter than the others. This gives a visual indication of how which decade of the digits will be changed when the rotary encoder is turned.
I found on a very early design that sending data to the display over the conventional serial bus caused the display to freeze and turn off whilst the serial comms was being actioned.
This implementation uses a custom interface that uses 3 pins and an interrupt routine. SER_IN_EN, SER_IN_CLK and SER_IN_DAT form this interface. It is similar to SPI but runs at a relatively low speed, reducing the flicker associated with updates.
The jumper "SIDE" is only fitted on the left hand bank. This pulls down the Arduino GPIO which the s/w reads at boot-up to determine if it needs to configure itself for the left hand mapping. If the jumper is not fitted the s/w configures itself for the right hand mapping.
Ilimit is an output from the Arduino to drive a red or green LED to indicate current limit (red) or voltage limit (green).