MAX7219 and LED matrix power requirements

Parola_ModuleA recurring question is how much current Parola (and similar) modules use, and can how many can be directly powered from the Arduino 5V power supply. The answer is that it depends – but on what, exactly?

I thought I would try an experiment and actually measure the current usage and answer the question to my satisfaction. I used my Parola module (forum discussion) as the test device, but this is similar to the more generic modules and I believe the results are transferable.

The main point of the questions is to know now many modules can be strung together before an external power supply is required, so I set out to understand the power usage of 1 module when different numbers LEDs are on at different intensity levels.

The MAX7219 has a resistor that sets the maximum current supplied to the matrix (RSET in the datasheet). My matrix has VLED ≈ 2V (red LED) and RSET = 62k, so according to the MAX7219 datasheet values (Table 11, below), I am expecting around 10mA per segment (which is a single LED in the matrix).

MAX7219_Rset_Values

Most of the cheap generic modules have very low values for RSET, which would significantly increase the power/current required by the module. This seems to be 10kΩ for the eBay specials, for a segment current exceeding 40mA, the specified minimum value for RSET in Table 11 being 11.8kΩ for VLED = 2V.

A standard digital multimeter was used to measure the current into the module, so readings will be average values rather than peak. I also wrote a sketch (below) to systematically step through the various combinations of LEDs and intensities.

// Use the MD_MAX72XX library to test current usage of a display module
//
// Set various configurations of the display to allow current measurements
//
#include <MD_MAX72xx.h>
// Print a string followed by a value
#define DISPLAY(s, v) { Serial.print(F(s)); Serial.print(v); }
// --------------------
// MD_MAX72xx hardware definitions and object
// Define the number of devices we have in the chain
#define MAX_DEVICES 1
#define CS_PIN 10 // or SS
MD_MAX72XX mx = MD_MAX72XX(CS_PIN, MAX_DEVICES); // SPI hardware interface
// --------------------
#define WAIT_TIME 5000
// ========== Control routines ===========
void setup()
{
 mx.begin();
 Serial.begin(57600);
 DISPLAY("\n","[Matrix current test]");
}

void loop() 
{
 for (uint8_t intensity=0; intensity<=MAX_INTENSITY; intensity++)
 {
   mx.control(MD_MAX72XX::INTENSITY, intensity);
   DISPLAY("\nIntensity ", intensity);
   mx.clear();
   DISPLAY("\n", "\tBlank");
   delay(WAIT_TIME);

   for (uint8_t row=0; row<ROW_SIZE; row++)
   {
     DISPLAY("\n\tRows ", row+1);
     mx.setRow(row, 0xff);
     delay(WAIT_TIME);
   }
/* 
   mx.clear();
   for (uint8_t col=0; col<COL_SIZE; col++)
   {
     DISPLAY("\n\tColumns ", col+1);
     mx.setColumn(col, 0xff);
     delay(WAIT_TIME);
   }
*/
 }
}

As you can see in the code, I originally also checked turning on columns as well as rows. However, I ended up discarding the column values as the results were completely symmetrical between number of rows and number of columns.

The table below is the data collected (mA) at Supply Voltage 4.9V and RSET 62kΩ.

Int  0R  1R   2R   3R   4R   5R   6R   7R   8R
 0  2.6  2.9  3.0  3.4  3.7  4.0  4.3  4.5  4.8 
 1  2.6  3.4  4.2  5.0  5.9  6.7  7.5  8.3  9.1
 2  2.6  4.0  5.3  6.7  8.0  9.4 10.8 12.1 13.5
 3  2.6  4.5  6.4  8.3 10.2 12.1 14.0 15.9 17.8
 4  2.6  5.0  7.5  9.9 12.3 14.8 17.2 19.6 22.0
 5  2.6  5.6  8.5 11.5 14.5 17.4 20.4 23.3 26.3
 6  2.6  6.1  9.6 13.1 16.6 20.1 23.6 27.0 30.4
 7  2.6  6.6 10.7 14.7 18.7 22.7 26.7 30.7 34.6
 8  2.6  7.2 11.8 16.3 20.8 25.3 29.9 34.3 38.8
 9  2.6  7.7 12.8 17.9 22.9 28.0 33.0 38.0 42.9
10  2.6  8.3 13.9 19.5 25.0 30.6 36.1 41.6 47.1
11  2.6  8.8 14.9 21.0 27.1 33.2 39.2 45.2 51.1
12  2.6  9.3 16.0 22.6 29.2 35.8 42.3 48.8 55.2
13  2.6  9.8 17.0 24.2 31.2 38.3 45.3 52.3 59.2
14  2.6 10.4 18.1 25.7 33.3 40.9 48.4 55.8 63.2
15  2.6 10.9 19.1 27.3 35.4 43.4 51.4 59.4 67.2

With no LEDs on, the current drawn was 2.6mA. With all LEDs at maximum brightness setting it was around 67mA.

These are graphed below.

Current vs Rows - Click to Enlarge
Current vs Rows per intensity – Click to Enlarge
Current vs Int
Current vs Intensity, per rows – Click to Enlarge

Results confirmed by the measured data:

  1. The current is linearly proportional to the number of LEDs lit, irrespective of whether the LEDs were rows or columns.
  2. The current was linearly proportional to the intensity setting of the LEDs.

What does it all mean?

According to Table 11, given a red LED segment voltage 2V, RSET of 62kΩ gives a segment current of just under 10mA, making it 80mA for a row.  So 67mA is close to the tabled value for a single row.

Assuming that we will be running at half brightness (the Parola library default) and that around 24 LEDs (3 rows) are on at any one time for a scrolling display, then the total current per Parola module will be 14.7mA. Many of these modules can therefore be ganged up before the Arduino power supply runs out of puff and external power is required.

An ‘eBay special’ with RSET of 10kΩ under the same conditions could draw up to 20mA per LED (at half brightness) for 24 LEDs, giving a total of 480mA. In practice these matrices need to be run at a lower brightness as they are too bright, so assuming quarter brightness level (10mA), the current is about 240mA, which is close to the current requirements attributed to these modules in various forums.

Advertisements

3 thoughts on “MAX7219 and LED matrix power requirements

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s