TLC5940 test program. Uses the Pinscape TLC5940 interface class in isolation to test the outputs directly. Configured for Pinscape Expansion Boards by default but can be changed to any other pin configuration.

Dependencies:   FastPWM mbed

Committer:
mjr
Date:
Fri Jul 08 23:57:01 2016 +0000
Revision:
1:f66778df0d8d
Parent:
0:3ca2fd0d22ba
Set mode to 0 by default;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mjr 0:3ca2fd0d22ba 1 // TLC5940 Tester
mjr 0:3ca2fd0d22ba 2 //
mjr 0:3ca2fd0d22ba 3 // This is a simple test bed for the TLC5940 chips. We use the same
mjr 0:3ca2fd0d22ba 4 // interface class used in the Pinscape v2 firmware, but omit all of the
mjr 0:3ca2fd0d22ba 5 // other functionality of the Pinscape software. This does nothing
mjr 0:3ca2fd0d22ba 6 // besides drive the TLC5940 chips.
mjr 0:3ca2fd0d22ba 7 //
mjr 0:3ca2fd0d22ba 8 // The GPIO pin connections to the TLC5940 chips are configured by default
mjr 0:3ca2fd0d22ba 9 // for the Pinscape Expansion Boards. Edit the "TLC5940 configuration"
mjr 0:3ca2fd0d22ba 10 // section below to change the pin assignments.
mjr 0:3ca2fd0d22ba 11
mjr 0:3ca2fd0d22ba 12 #include "mbed.h"
mjr 0:3ca2fd0d22ba 13 #include "TLC5940.h"
mjr 0:3ca2fd0d22ba 14
mjr 0:3ca2fd0d22ba 15 // Operation mode:
mjr 0:3ca2fd0d22ba 16 //
mjr 0:3ca2fd0d22ba 17 // 0 = ALL ON mode - all outputs continuously turned on
mjr 0:3ca2fd0d22ba 18 //
mjr 0:3ca2fd0d22ba 19 // 1 = Up/Down mode - all outputs ramped from off to full brightness
mjr 0:3ca2fd0d22ba 20 // and back every couple of seconds
mjr 0:3ca2fd0d22ba 21 //
mjr 0:3ca2fd0d22ba 22 // 2 = Sweep mode - outputs ramped up one at a time then ramped
mjr 0:3ca2fd0d22ba 23 // down one at a time
mjr 0:3ca2fd0d22ba 24 //
mjr 1:f66778df0d8d 25 const int MODE = 0;
mjr 0:3ca2fd0d22ba 26
mjr 0:3ca2fd0d22ba 27 // TLC5940 configuration
mjr 0:3ca2fd0d22ba 28 const int NCHIPS = 2; // number of TLC5940 chips in daisy chain
mjr 0:3ca2fd0d22ba 29 const PinName SCLK = PTC5;
mjr 0:3ca2fd0d22ba 30 const PinName SIN = PTC6;
mjr 0:3ca2fd0d22ba 31 const PinName GSCLK = PTA1;
mjr 0:3ca2fd0d22ba 32 const PinName BLANK = PTC7;
mjr 0:3ca2fd0d22ba 33 const PinName XLAT = PTC10;
mjr 0:3ca2fd0d22ba 34
mjr 0:3ca2fd0d22ba 35
mjr 0:3ca2fd0d22ba 36 // diagnostic LED segments
mjr 0:3ca2fd0d22ba 37 DigitalOut ledR(LED1), ledG(LED2), ledB(LED3);
mjr 0:3ca2fd0d22ba 38
mjr 0:3ca2fd0d22ba 39 // adjust an output value by an increment, keeping it within range
mjr 0:3ca2fd0d22ba 40 static void adjustOut(int &out, int inc)
mjr 0:3ca2fd0d22ba 41 {
mjr 0:3ca2fd0d22ba 42 out += inc;
mjr 0:3ca2fd0d22ba 43 if (out < 0)
mjr 0:3ca2fd0d22ba 44 out = 0;
mjr 0:3ca2fd0d22ba 45 else if (out > 4095)
mjr 0:3ca2fd0d22ba 46 out = 4095;
mjr 0:3ca2fd0d22ba 47 }
mjr 0:3ca2fd0d22ba 48
mjr 0:3ca2fd0d22ba 49 int main()
mjr 0:3ca2fd0d22ba 50 {
mjr 0:3ca2fd0d22ba 51 // set up the tlc5940 interface
mjr 0:3ca2fd0d22ba 52 TLC5940 tlc5940(SCLK, SIN, GSCLK, BLANK, XLAT, NCHIPS);
mjr 0:3ca2fd0d22ba 53
mjr 0:3ca2fd0d22ba 54 // start the tlc5940 clock
mjr 0:3ca2fd0d22ba 55 tlc5940.start();
mjr 0:3ca2fd0d22ba 56
mjr 0:3ca2fd0d22ba 57 // enable the outputs
mjr 0:3ca2fd0d22ba 58 tlc5940.enable(true);
mjr 0:3ca2fd0d22ba 59
mjr 0:3ca2fd0d22ba 60 // current status for ramp mode
mjr 0:3ca2fd0d22ba 61 struct
mjr 0:3ca2fd0d22ba 62 {
mjr 0:3ca2fd0d22ba 63 int dir;
mjr 0:3ca2fd0d22ba 64 int val;
mjr 0:3ca2fd0d22ba 65 } ramp = { 1, 0 };
mjr 0:3ca2fd0d22ba 66
mjr 0:3ca2fd0d22ba 67 // current status for sweep mode
mjr 0:3ca2fd0d22ba 68 struct
mjr 0:3ca2fd0d22ba 69 {
mjr 0:3ca2fd0d22ba 70 int out;
mjr 0:3ca2fd0d22ba 71 int dir;
mjr 0:3ca2fd0d22ba 72 int val;
mjr 0:3ca2fd0d22ba 73 } sweep = { 0, 4, 0 };
mjr 0:3ca2fd0d22ba 74
mjr 0:3ca2fd0d22ba 75 // in MODE 0, set all outputs to full on initially
mjr 0:3ca2fd0d22ba 76 if (MODE == 0)
mjr 0:3ca2fd0d22ba 77 {
mjr 0:3ca2fd0d22ba 78 for (int i = 0 ; i < NCHIPS*16 ; ++i)
mjr 0:3ca2fd0d22ba 79 tlc5940.set(i, 4095);
mjr 0:3ca2fd0d22ba 80 }
mjr 0:3ca2fd0d22ba 81
mjr 0:3ca2fd0d22ba 82 // heartbeat flasher
mjr 0:3ca2fd0d22ba 83 int t = 0;
mjr 0:3ca2fd0d22ba 84 int hb = 0;
mjr 0:3ca2fd0d22ba 85
mjr 0:3ca2fd0d22ba 86 // send tlc updates forever
mjr 0:3ca2fd0d22ba 87 for (;;)
mjr 0:3ca2fd0d22ba 88 {
mjr 0:3ca2fd0d22ba 89 // send TLC updates as needed
mjr 0:3ca2fd0d22ba 90 tlc5940.send();
mjr 0:3ca2fd0d22ba 91
mjr 0:3ca2fd0d22ba 92 // pause between operations
mjr 0:3ca2fd0d22ba 93 wait_us(500);
mjr 0:3ca2fd0d22ba 94
mjr 0:3ca2fd0d22ba 95 // update outputs according to the current mode
mjr 0:3ca2fd0d22ba 96 switch (MODE)
mjr 0:3ca2fd0d22ba 97 {
mjr 0:3ca2fd0d22ba 98 case 1:
mjr 0:3ca2fd0d22ba 99 // ramp up/down mode - all outputs ramp on every loop
mjr 0:3ca2fd0d22ba 100
mjr 0:3ca2fd0d22ba 101 // switch direction if at the top or bottom of the ramp
mjr 0:3ca2fd0d22ba 102 if ((ramp.dir > 0 && ramp.val == 4095) || (ramp.dir < 0 && ramp.val == 0))
mjr 0:3ca2fd0d22ba 103 ramp.dir = -ramp.dir;
mjr 0:3ca2fd0d22ba 104
mjr 0:3ca2fd0d22ba 105 // adjust all outputs
mjr 0:3ca2fd0d22ba 106 adjustOut(ramp.val, ramp.dir);
mjr 0:3ca2fd0d22ba 107 for (int i = 0 ; i < NCHIPS*16 ; ++i)
mjr 0:3ca2fd0d22ba 108 tlc5940.set(i, ramp.val);
mjr 0:3ca2fd0d22ba 109
mjr 0:3ca2fd0d22ba 110 // done
mjr 0:3ca2fd0d22ba 111 break;
mjr 0:3ca2fd0d22ba 112
mjr 0:3ca2fd0d22ba 113 case 2:
mjr 0:3ca2fd0d22ba 114 // sweep up/down mode - adjust one output at a time
mjr 0:3ca2fd0d22ba 115
mjr 0:3ca2fd0d22ba 116 // at top or bottom, move to next output
mjr 0:3ca2fd0d22ba 117 if ((sweep.dir > 0 && sweep.val == 4095) || (sweep.dir <= 0 && sweep.val == 0))
mjr 0:3ca2fd0d22ba 118 {
mjr 0:3ca2fd0d22ba 119 // advance to the next output
mjr 0:3ca2fd0d22ba 120 if (++sweep.out < NCHIPS*16)
mjr 0:3ca2fd0d22ba 121 {
mjr 0:3ca2fd0d22ba 122 // at next out - start at other end of ramp
mjr 0:3ca2fd0d22ba 123 sweep.val = (sweep.dir > 0 ? 0 : 4095);
mjr 0:3ca2fd0d22ba 124 }
mjr 0:3ca2fd0d22ba 125 else
mjr 0:3ca2fd0d22ba 126 {
mjr 0:3ca2fd0d22ba 127 // past last output - wrap and reverse the ramp direction
mjr 0:3ca2fd0d22ba 128 sweep.out = 0;
mjr 0:3ca2fd0d22ba 129 sweep.dir = -sweep.dir;
mjr 0:3ca2fd0d22ba 130 }
mjr 0:3ca2fd0d22ba 131 }
mjr 0:3ca2fd0d22ba 132
mjr 0:3ca2fd0d22ba 133 // adjust this output
mjr 0:3ca2fd0d22ba 134 adjustOut(sweep.val, sweep.dir);
mjr 0:3ca2fd0d22ba 135 tlc5940.set(sweep.out, sweep.val);
mjr 0:3ca2fd0d22ba 136
mjr 0:3ca2fd0d22ba 137 // done
mjr 0:3ca2fd0d22ba 138 break;
mjr 0:3ca2fd0d22ba 139 }
mjr 0:3ca2fd0d22ba 140
mjr 0:3ca2fd0d22ba 141 // update the heartbeat if needed
mjr 0:3ca2fd0d22ba 142 if (t++ > 1000)
mjr 0:3ca2fd0d22ba 143 {
mjr 0:3ca2fd0d22ba 144 ledR = 1; ledB = 1; ledG = 1;
mjr 0:3ca2fd0d22ba 145 switch (hb++)
mjr 0:3ca2fd0d22ba 146 {
mjr 0:3ca2fd0d22ba 147 case 0: ledR = 0; ledG = 0; break; // yellow
mjr 0:3ca2fd0d22ba 148 case 1: ledB = 0; ledR = 0; break; // purple
mjr 0:3ca2fd0d22ba 149 case 2: ledG = 0; break; // green
mjr 0:3ca2fd0d22ba 150 case 3: ledB = 0; break; // blue
mjr 0:3ca2fd0d22ba 151 }
mjr 0:3ca2fd0d22ba 152 hb %= 3;
mjr 0:3ca2fd0d22ba 153 t = 0;
mjr 0:3ca2fd0d22ba 154 }
mjr 0:3ca2fd0d22ba 155 }
mjr 0:3ca2fd0d22ba 156 }