Library for using the TLC5940 as a servo controller.
Diff: TLC5940Servo.cpp
- Revision:
- 0:9fc434ff7a03
- Child:
- 2:1d2251574d35
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TLC5940Servo.cpp Tue Oct 21 00:02:48 2014 +0000 @@ -0,0 +1,71 @@ +#include "TLC5940Servo.h" + +TLC5940Servo::TLC5940Servo(PinName MOSI, PinName SCLK, PinName XLAT, PinName BLANK, + PinName GSCLK, const int number) : number(number), spi(MOSI, NC, SCLK), gsclk(GSCLK), + blank(BLANK), xlat(XLAT), newData(false), need_xlat(false) +{ + // Configure SPI to 12 bits and SPI_SPEED + spi.format(12, 0); + spi.frequency(SPI_SPEED); + + // Set output pin states + xlat = 0; + blank = 1; + + // Call the reset function every 4096 PWM outputs + reset_ticker.attach_us(this, &TLC5940Servo::reset, (1000000.0/GSCLK_SPEED) * 4096.0); + + // Configure FastPWM output for GSCLK frequency at 50% duty cycle + gsclk.period_us(1000000.0/GSCLK_SPEED); + gsclk.write(.5); + + // Create a data buffer to store the current Servo states + dataBuffer = new int[16 * number](); +} + +TLC5940Servo::~TLC5940Servo() +{ + // Delete the buffer + delete[] dataBuffer; +} + + +int& TLC5940Servo::operator[](int index) +{ + // Return the start of the correct data chunk + newData = true; + return dataBuffer[index]; +} + +void TLC5940Servo::reset() +{ + gsclk.write(0); // turn off gsclk + blank = 1; // start reset + + // latch data if new data was written + if (need_xlat) { + xlat = 1; + xlat = 0; + + need_xlat = false; + } + + blank = 0; // turn off reset + gsclk.write(.5); // restart gsclk + + if (newData) { + + // Send GS data backwards - this makes the GS_buffer[0] index correspond to OUT0 + for (int i = (16 * number) - 1; i >= 0; i--) + { + // Get the lower 12 bits of the buffer and send + spi.write(dataBuffer[i] & 0xFFF); + } + + // Latch after current GS data is done being displayed + need_xlat = true; + + // No new data to send (we just sent it!) + newData = false; + } +} \ No newline at end of file