cancel
Showing results for 
Search instead for 
Did you mean: 

Can LCD Driver be used to drive ultra-low-power Led dot matrix display?

gregstm
Senior III

I'm using some extremely efficient 603 size Leds that are very bright even at 70 microamps current. Can I use the LCD Driver (eg. of the STM32L476, 8x40 driver ) to drive a modest 8x12 or 8x16 Led display? (I have created a little dot matrix display by DMA'ing directly to a GPIO port, but 16 bits restricts display size to 8x8, 6x10 etc.),

thanks.

1 ACCEPTED SOLUTION

Accepted Solutions

Hi, buffer output current isn't documented. But it should be easy to measure it (it would be interesting information). With one timer you can generate up to 5 DMA transfers in configurable times (even at "the same time"). There is way how to control less then all 16I/O on port in one DMA transfer. You can write set/reset mask into BSRR (by DMA) instead writing into ODR. That way you can control selected pins without afecting others.

View solution in original post

12 REPLIES 12
Michal Dudka
Senior III

Probably no. LCD Output voltages are generated from 240kOhm resistor divider (in "High drive" mode). But you write that you can do it with regular GPIO. Why not to use multiple DMA channels/streams ?

... output voltages are generated with a resistor divider, but there is a "buffered" mode - just not sure how much current the buffer could provide. Yes, I could use another DMA channel and synchronise them somehow, but if I could use the features of the LCD Driver it would make it easier (I'm getting lazier in my old age). DMA transfers can be 32 bit words, pity there was no easy way of DMA'ing a 32 bit word to 32 (or less) selected GPIO pins in one transfer...

Hi, buffer output current isn't documented. But it should be easy to measure it (it would be interesting information). With one timer you can generate up to 5 DMA transfers in configurable times (even at "the same time"). There is way how to control less then all 16I/O on port in one DMA transfer. You can write set/reset mask into BSRR (by DMA) instead writing into ODR. That way you can control selected pins without afecting others.

You should perhaps familiarize yourself with the LCD driver's working, first. LCD is not LED, i.e. not diodes; LCD element "lights up" when voltage of any polarity is applied to it - and in fact the polarity must be changing to prevent electrolysis.

This results in rather complex waveforms on the electrodes, resulting in average zero DC voltage in long term; OTOH the "non-lit" segments do experience voltages in both polarities, although not as high as the "lit" segments; LCD effect nonlinearity and persistence is used to achieve the resulting contrast.

LEDs have different characteristics, but IMO it might be workable with an ideal driver.

With an ideal driver, in a 1/8 duty (i.e. 8xN matrix) run at 1/4 bias, a lit LED would see full +VLED 1/16 of time, full -VLED (i.e. reversed) 1/16 of time. The rest of the time it would see a mixture of +-2/4*VLED and +-1/4*VLED, depending on how other LEDs are lit or not lit.

Non-lit LEDs would see the mixture of +-2/4*VLED and +-1/4*VLED.

Whether a given LED at these conditions is light/dark enough to yield sufficient contrast, depends on the LED, serial resistances and imperfections of the driver.

Now given that the 1/16 active phase the lit LED is driven directly from VLED to VSS, the resistive ladder playes little role here. For the unlit LED, if I am not mistaken, it is benefitial to have the intermediate voltages as floating as possible - buffers OFF, high resistances.

Due to the 1/16 forward-biased duty, for equivalent of 70uA DC you'd need roughly 1mA pulse current. Whether transistors in the analog switch can sustain this, I have my doubts. It is designed to drive capacitances in the order of sub-nF in ms times, so their Rdson may very well be in the order of hundreds of kOhms to support a few microamperes of current. And even if their Rdson would be lower, I would hesitate to pull 1mA through such transistors.

JW

Thanks for the detailed response JW. I much prefer the simplicity/robustness of Leds over LCDs, and I was hoping that maybe it could be possible with some obscure combination of peripheral settings. If I get time I will do some experimentation/testing with the LCD driver, but I expect I will have to be content with my simple 6x10 Led display (using DMA to all bits of a GPIO port).

Danish1
Lead II

As you only turn one row of LEDs at a time, you could use a 4-to-16 line demultiplexer e.g. 74hc154. This would allow up to 16 x 12 LED matrix from a single 16-bit port

gregstm
Senior III

Thanks for people's responses. I will do some experimentation. One small part of my motivation of asking the original question was hoping that the people at ST have a think about LCD drivers being usable for ultra-low-power led dot matrix - the LCD Driver peripheral is tantalising close to being usable for Led displays... - or perhaps a 32bit wide GPIOX peripheral, where you can allocate any GPIO pins and use DMA to do a single operation full 32 bit write to pins...

I forgot to mention, that not only has the pulse current account for the reduced duty (i.e. for 1/16 duty resulting from bipolarity of LCD drive for the 1:8 mux you have to use 16x70uA ~ 1mA), but the row driver has to support current for all potentially lit LEDs, usually all LEDs in the row, i.e. for 8x16 matrix that would be 16mA.

The idea of using external demux for row driver is IMO justified also from this angle of view, potentially using a more capable driver to reduce stress.

Another option is to use the FMC/FSMC with DMA, which could potentially output 32 data bits at once; drawback is that the high data bits are available probably only on the high-pin-number packages.

JW

Thanks, my present display is 6 rows by 10 columns, with resistors on columns. Since only one row is displayed at a time, the maximum current for each row IO is 10x70uA = 700uA. My ideal Led matrix would be 5 rows x 21 (or 28) columns, that way I could use 7x5 dot matrix led modules placed horizontally, end to end, to allow me to display multiple digits (5x3 digits) - unfortunately a bit hard to do with a demux.

I hadn't thought of the FMC/FSMC, thanks, I will investigate...