TLC5947 Adafruit 24-Channel 12-bit PWM LED Driver
(feat. Open103V)
TLC5947
많은 수의 LED를 제어하기 위해서는 MCU의 GPIO포트가 많이 필요하다. GPIO포트 사용을 줄이기 위해 PWM을 확장할 수 있는 Driver칩이 TLC5947칩이다.
Tip : TLC5947로 LED를 제어할 경우 Anode 타입의 LED를 제어할 수 있다.
DataSheet : tlc5947.pdf
TLC5947과 MCU의 연결방법은 아래와 같다.
DataSheet 1page.
TLC5947은 SPI인터페이스를 지원하며, 아래와 같이 Controller에 연결하면 된다.
Controller |
TLC5947 |
SPIx_MOSI |
SIN |
SPIx_SCK | SCLK |
GPIOx | XLAT |
GPIOx | BLANK |
SIN에 SPI데이터를 전송하면 SCLK 클럭주기에 맞추어 데이터가 전송되고 XLAT 신호를 HIGH에서 LOW로 공급하면 TLC5947의 Shift 레지스터에 데이터가 저장된다.
BLANK 신호는 LOW로 주면 TLC5947의 OUTx 신호들이 모두 OFF상태가 된다.
Tip : SPI데이터는 MSB형태로 데이터 Buffer를 뒤집에서 전송하고, 12Bit에 맞게 데이터를 시프트하여 전송한다.
STM32CubeMx
STM32CubeMx SPI 설정
SPI 데이터 전송
TLC5947칩은 1채널당 12-Bit로 PWM을 제어할 수 있으며 즉 0~4095폭의 PWM을 사용할 수 있다.
SPI데이터는 마지막 BIT부터 거꾸로 시프트하여 전송해야한다.
Source Code
TLC5947을 제어하는 코드는 아래와 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #ifndef __TLC5947_H #define __TLC5947_H #ifdef __cplusplus extern "C" { #endif #include "main.h" #define TLC_5947_CH_MAX 24 void TLC_Reset(void); void TLC_SetChannel(uint8_t ch, uint16_t val); void TLC_Update(void); #ifdef __cplusplus } #endif /* extern "C" */ #endif /* __TLC5947_H */ | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #include "tlc5947.h" #include <string.h> uint16_t leds[TLC_5947_CH_MAX]= {0,}; void TLC_Write(uint8_t data); void TLC_SetChannel(uint8_t ch, uint16_t val) { leds[ch] = (val & 0x0FFF); return ; } void TLC_Reset(void) { memset(leds, 0, sizeof(leds)); return ; } void TLC_Write(uint8_t data) { HAL_SPI_Transmit(&hspi3, &data, sizeof(data), 0); while(HAL_SPI_GetState(&hspi3) == HAL_SPI_STATE_RESET); return ; } void TLC_Update(void) { HAL_GPIO_WritePin(BLANK_GPIO_Port, BLANK_Pin, GPIO_PIN_SET); for (int8_t i = 23; i >= 0; i -= 2) { uint8_t send1 = 0; uint8_t send = leds[i] >> 4; TLC_Write(send); send = (leds[i] & 0x000F); send <<= 4; send1 = (leds[i-1]) >> 8; send |= send1; TLC_Write(send); send = leds[i-1]; TLC_Write(send); } HAL_GPIO_WritePin(XLAT_GPIO_Port, XLAT_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(XLAT_GPIO_Port, XLAT_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(BLANK_GPIO_Port, BLANK_Pin, GPIO_PIN_RESET); return ; } | cs |
TLC5947을 이용한 DotMatrix 제어 결과
STM32 PWM 모드 사용하기 (1) | 2019.03.07 |
---|---|
STM32 TIMER Counter Mode (0) | 2019.03.06 |
애노드와 캐소드 차이점(Anode Cathod) (0) | 2019.02.20 |
Open103V(STM32F103VET) 비트맵 파일 다루기 (0) | 2019.02.01 |
STM32F130C8T6 (feat.TDCR1050M FND) (0) | 2018.11.19 |