Library for using the TLC5940 as a servo controller.

Dependencies:   FastPWM

Dependents:   TLC5940ServoTest

Committer:
dudanian
Date:
Tue Oct 21 00:02:48 2014 +0000
Revision:
0:9fc434ff7a03
Child:
2:1d2251574d35
Created

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dudanian 0:9fc434ff7a03 1 #include "TLC5940Servo.h"
dudanian 0:9fc434ff7a03 2
dudanian 0:9fc434ff7a03 3 TLC5940Servo::TLC5940Servo(PinName MOSI, PinName SCLK, PinName XLAT, PinName BLANK,
dudanian 0:9fc434ff7a03 4 PinName GSCLK, const int number) : number(number), spi(MOSI, NC, SCLK), gsclk(GSCLK),
dudanian 0:9fc434ff7a03 5 blank(BLANK), xlat(XLAT), newData(false), need_xlat(false)
dudanian 0:9fc434ff7a03 6 {
dudanian 0:9fc434ff7a03 7 // Configure SPI to 12 bits and SPI_SPEED
dudanian 0:9fc434ff7a03 8 spi.format(12, 0);
dudanian 0:9fc434ff7a03 9 spi.frequency(SPI_SPEED);
dudanian 0:9fc434ff7a03 10
dudanian 0:9fc434ff7a03 11 // Set output pin states
dudanian 0:9fc434ff7a03 12 xlat = 0;
dudanian 0:9fc434ff7a03 13 blank = 1;
dudanian 0:9fc434ff7a03 14
dudanian 0:9fc434ff7a03 15 // Call the reset function every 4096 PWM outputs
dudanian 0:9fc434ff7a03 16 reset_ticker.attach_us(this, &TLC5940Servo::reset, (1000000.0/GSCLK_SPEED) * 4096.0);
dudanian 0:9fc434ff7a03 17
dudanian 0:9fc434ff7a03 18 // Configure FastPWM output for GSCLK frequency at 50% duty cycle
dudanian 0:9fc434ff7a03 19 gsclk.period_us(1000000.0/GSCLK_SPEED);
dudanian 0:9fc434ff7a03 20 gsclk.write(.5);
dudanian 0:9fc434ff7a03 21
dudanian 0:9fc434ff7a03 22 // Create a data buffer to store the current Servo states
dudanian 0:9fc434ff7a03 23 dataBuffer = new int[16 * number]();
dudanian 0:9fc434ff7a03 24 }
dudanian 0:9fc434ff7a03 25
dudanian 0:9fc434ff7a03 26 TLC5940Servo::~TLC5940Servo()
dudanian 0:9fc434ff7a03 27 {
dudanian 0:9fc434ff7a03 28 // Delete the buffer
dudanian 0:9fc434ff7a03 29 delete[] dataBuffer;
dudanian 0:9fc434ff7a03 30 }
dudanian 0:9fc434ff7a03 31
dudanian 0:9fc434ff7a03 32
dudanian 0:9fc434ff7a03 33 int& TLC5940Servo::operator[](int index)
dudanian 0:9fc434ff7a03 34 {
dudanian 0:9fc434ff7a03 35 // Return the start of the correct data chunk
dudanian 0:9fc434ff7a03 36 newData = true;
dudanian 0:9fc434ff7a03 37 return dataBuffer[index];
dudanian 0:9fc434ff7a03 38 }
dudanian 0:9fc434ff7a03 39
dudanian 0:9fc434ff7a03 40 void TLC5940Servo::reset()
dudanian 0:9fc434ff7a03 41 {
dudanian 0:9fc434ff7a03 42 gsclk.write(0); // turn off gsclk
dudanian 0:9fc434ff7a03 43 blank = 1; // start reset
dudanian 0:9fc434ff7a03 44
dudanian 0:9fc434ff7a03 45 // latch data if new data was written
dudanian 0:9fc434ff7a03 46 if (need_xlat) {
dudanian 0:9fc434ff7a03 47 xlat = 1;
dudanian 0:9fc434ff7a03 48 xlat = 0;
dudanian 0:9fc434ff7a03 49
dudanian 0:9fc434ff7a03 50 need_xlat = false;
dudanian 0:9fc434ff7a03 51 }
dudanian 0:9fc434ff7a03 52
dudanian 0:9fc434ff7a03 53 blank = 0; // turn off reset
dudanian 0:9fc434ff7a03 54 gsclk.write(.5); // restart gsclk
dudanian 0:9fc434ff7a03 55
dudanian 0:9fc434ff7a03 56 if (newData) {
dudanian 0:9fc434ff7a03 57
dudanian 0:9fc434ff7a03 58 // Send GS data backwards - this makes the GS_buffer[0] index correspond to OUT0
dudanian 0:9fc434ff7a03 59 for (int i = (16 * number) - 1; i >= 0; i--)
dudanian 0:9fc434ff7a03 60 {
dudanian 0:9fc434ff7a03 61 // Get the lower 12 bits of the buffer and send
dudanian 0:9fc434ff7a03 62 spi.write(dataBuffer[i] & 0xFFF);
dudanian 0:9fc434ff7a03 63 }
dudanian 0:9fc434ff7a03 64
dudanian 0:9fc434ff7a03 65 // Latch after current GS data is done being displayed
dudanian 0:9fc434ff7a03 66 need_xlat = true;
dudanian 0:9fc434ff7a03 67
dudanian 0:9fc434ff7a03 68 // No new data to send (we just sent it!)
dudanian 0:9fc434ff7a03 69 newData = false;
dudanian 0:9fc434ff7a03 70 }
dudanian 0:9fc434ff7a03 71 }