Analysis of an LED display circuit based on TPIC6C596

Continuing the discussion from How to make a 4 digits 7 segments display:

An alternative design (untested) is presented (Fig-1) using large ca-type multiplexed display unit. //edit


Figure-1:

Using only one breakout board (hence only one TPIC6C596), one can drive four large ca-type 7-Segment display devices on multiplexed basis.

It is required to install the extra four N-MOOSFETs (Q1-Q4) and drive them in sequence by A0-A3 lines of the Arduino UNO. The current limiting resistors at the segment sides (I think) are given on the breakout borad which I have marked as RN1. It is needed to make proper connections.

Test Sketch: (to see 15.00 on te display unit) NOT TESTED

#include<SPI.h>
#define RCK 4
byte lupTable[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};//cc-codes of 0,1,2,3,4,5,6,7,8,9
byte myData[] = {~0x06, ~0xED, ~0x3F, ~0x3F}; //ca-codes for: 1, 5., 0, 0 = inversions of cc-codes

void setup()
{
  for (int i = 14; i < 18; i++)
  {
    pinMode(i, OUTPUT);  //A0 - A3 are outputs
  }
  pinMode(RCK, OUTPUT);
}

void loop()
{
  for (int j = 0; j < 4; j++)
  {
    byte y = 0x00; //0000 0000
    SPI.transfer(myData[j]); //cA-code of 1 = inversion of cc-codees
    digitalWrite(RCK, HIGH); //CLK signal generation
    digitalWrite(RCK, LOW);
    //-------
    bitSet(y, j); //0000 0001 (Q1 is ON), 0000 0010, 0000 0100, 0000 1000 
    PORTC = y;
    delay(1);
  }
}
1 Like

This is misleading because the TPIC6C596 shift register is incompatible with a common cathode display type due to its open drain outputs.

If you look into the display unit of Fig-1 of post #3, you will see that I have used ca-type 7-segment display devices (ca0, ca1, ca2, ca3) and NOT cc-type. Moreover, there are N-MOSFET at 12V side, which implies large size common-anode (CA/ca) type display devices

I could not test this multiplexed display unit using real TPIC6C596 chip; but, I have tested the similar display unit of cc-type using 74HC595 which is very much close to 596 in design except that 596 has open drain MOSFET devices at its output to sink large currents.

OK. Sorry. I thought Ca0, for example, was cathode 0.

1 Like

For switching the high-side?

Yes!

I'm probably missing something... How does it work? All I can find are solutions with either p-mos or n-mos with additional bootstrap driving circuity.

1. Refer to Fig-1 of post #3:

To see 1 on DPO position –
Send ca-code of 1 to 596.

Send HIGH on A0-pin to turn on Q1.

Send LOWs to the gates of Q2-Q3 to keep them off.

I have given a short untested sketch in
post #3 to see 15.00 on the display unit.

2. To turn on segment-A of Fig-1, we may execute the following codes:


Figure-1:

Codes to turn on Segmen-A:

#include<SPI.h>
#define RCK 4

void setup()
{
    SPI.begin();
    pinMode(4, OUTPUT);
    pinMode(A0, OUTPUT)
    digitalWrite(RCK, LOW);
    //---------------------------------
    SPI.transfer(0b00000001);
    digitalWrite(RCK, HIGH);
    digitalWrite(RCK, LOW);
    //----------------------------------
    digitalWrite(A0, HIGH);
}

void loop(){}

If you have actually tested this circuit then please supply the part number of the NMOS.
Usually the gate of an NMOS has to be higher than its source to switch it on.
A PMOS in a high side switch configuration, that is together with an N channel device, is more likely to be used in such a circuit.

This is a design at conceptual level which I have not tested due to lack of parts. However, at the 12V side, a normal N-ch FET can also be used which will work as an almost perfect On/Off switch.

It can indeed but you have to supply something in excess of 12 volts at the gate of the N-ch FET to switch it on. The Arduino Uno can't do that.
I suggest that you get to know a simulator so you can test such things if you don't have access to the parts. LTspice is good for analog circuits and is free, however, there is a learning curve.

I know that to turn on a FET/MOSFET, it is required to apply enough gate voltage such that the threshold level (usually 2V) is defeated.

How do you provide the 2V above source?

If you suspect that NMOSFET at the 12V side are not switchable, then replace them with ULN2003 power buffer/switches having 500R 1W load at the collector side (Fig-1). I have assumed 3 LEDs (~6V drop) in a segment. This arrangement would cause power loss when the segments are off.


Figure-1:

This might work. But how do you compensate the different brightness level when the number of turned on segments changes?

Yes! Segment brightness will be different as the voltage across 0.5k, 1W will be changing depeding on the number of on segments. Will it work if the ULN2003 is replaced by a PNP transistor and no emitter load?

Since the ULN is a bunch of NPNs... What do you mean with "no load"?

No resistor at the emitter side of the proposed PNP transistor (Fig-1).
596SegAOnX
Figure-1:

Now Pins on the Arduino need to tolerate 12V.

Am I fool or blind or having brain furt!

Let me calculate the sink current for IO-pin of UNO.

When A0 is LOW:
IOL = 11.3-0.9/1000 = 10.4 mA < 20 mA?

When A0 is HIGH:
Q1 may not be OFF!

So, we have to still find a solution.

Post #12 has suggested a PMOS switch at the 12V side.