Microprocessor/STM32 TLC5947 24-Channel, 12-Bit PWM LED Driver
  • 728x90
    반응형



    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, 0sizeof(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 제어 결과






    728x90
    반응형
상단으로