페이지

글목록

2017년 2월 18일 토요일

[PSOC5] LED Driver 콤퍼넌트 테스트 (새로 추가된 녀석 ^^)

이번에는 꽤 유용한 콤포넌트가 PSOC5에 추가되었다.
DMA 를 사용해서 CPU에 부담이 없이, LED 메트릭스를 Dynamic Scan 방식으로 제어가능하다.
또한 PWM으로 LED 밝기 조절 기능까지 들어있고, 7-SEGMENT 와 심지어 14,16 SEGMENT 도 콘트롤할 수 있다.

저는 7-SEGMENT 와 LED 비트제어 만, 제공되는 여러 함수를 이용해서 사용해 봤는데,
14,16-SEGMENT 는 써 본적이 없네요.

아뭏든 LED를 더 많이 제어하려면, MCU 중에서 다리가 많고 싼놈으로 고르시기 바랍니다.
이 콤포넌트는 seg out 이 24개까지, com out이 8개까지 가능해서,
동시에 출력 가능한 최대 LED 갯수는 24 x 8 = 192개이다.

예전에 LED 드라이브 IC 를 4천원에 SPI/I2C 방식으로 MCU에 붙여서 사용했었는데,
포트가 좀 필요하지만 LED 드라이브 IC를 안 써도 된다. 
대신 TR을 포트 갯수 만큼 달아 줘야 하지만 가격 대 성능비는 괜찮은 것 아닌가? (IC 크기가 문제없는 곳이라면)

프로그램에서는, 제공되는 함수로 디스플레이를 바꾸고 싶을 때 한번만 레지스터를 써 주면 끝이다.
계속 타이밍에 맞춰서 출력해 줘야하는 수고스러움 없이, 관심 끄고 다른 프로그램 코딩하면 되겠다.

다음은 PSOC5 에 연결할 COMMON-Cathode 타입의 7-SEGMENT 회로도 중, 
전류를 증폭하기 위해서 사용한 TR 회로 입니다.
PNP TR 출력에 연결된 저항을 바꿔서 최대 밝기를 조절해 줄 수 있다. 
다이나믹 스캔 방식이라 저항을 너무 크게 달지 않는 것이 좋다. (크면 어둡다)
대략 51 옴 정도 달면 적당할 듯 하다. (전류가 너무 많이 흐르게 했을까요? 다시한번 확인을 해 봐야겠네요.)
오렌지 색 1608 LED가 전압강하 2.2V 이네요.
따라서 전원을 3.3V 사용시 LED를 통해 흐르는 전류를 20mA로 만들려면,
1.1V(3.3V-2.2) / 0.02 = 55 옴 으로, 전력은 55*0.02*0.02(R x I x I) = 0.022W 입니다.
즉 1/45 W 네요. ^^.

51옴 정도 달면 되겠습니다.





다음은 TR 에 연결되는 FND 와 LED 회로 입니다.


위와같이 회로는 준비 됐고, PSOC5 의 새로 생긴 콤포넌트인 LED Segment and Matrix Driver [v1.10] 을 살펴보자.
TopDesign.cysch 에, 일단 제가 다 만들어 놓은 콤포넌트를 보겠습니다.
세그먼트 출력 8개, 코먼 출력 8 개로 7-SEGMENT 7개와 8개의 LED를 제어하도록 구성했습니다.



다음은 다리가 많은 모델로 고른 PSOC5 IC 입니다. 다리는 많은데 가격은 좀 비싼 놈입니다. 제가 열전대 값을 읽으려고 20-비트 ADC가 있는 놈으로 고르다 보니 가격이 비싸져버렸네요.
저와 같은 용도가 아니면 다리가 좀 많고 가격이 싼 PSOC5를 고르는 게 좋습니다.



다음은 콤포넌트 설정입니다. 여러가지를 설정할 수 있는데, 최대 출력 개수는 segment 24, common 8개 이고,
스캔 주기도 조정할 수 있습니다. 적당히 테스트하면서 조정하면 됩니다. 
나머지 설정들은 보면 아시겠죠? (common Cathode/Anode 에 따라 드라이브 타입을 조정해 주시면 되고, 내부 클럭으로 돌릴지 외부 클럭으로 돌릴지, 밝기 조절을 할지 말지.. 등이 있습니다)



이렇게 설정을 마치고 나면 자동으로 LED 드라이브 파일이 생성되고, 우와 함수 참 다양하죠?
테스트용으로는 몇 개 안쓸 것입니다. ^^



다음은 제가 만든 코드 예제 입니다.
7개의 7-SEGMENT 에 1,2,3,4,5,6,7 이 켜지고 , LED 8개가 다음과 같이 켜질 것입니다.
실제 7-SEGMENT 와 LED가 켜진 사진을 못 올리는 것이, 맡겨 놓은 회사에서 회로를 잘못 바꿔서 최종으로 
Common-Anode 타입으로 만들어 와서 지금 설명하는 내용과 좀 다릅니다. 이해 바랍니다.


다음은 main.c 파일에 있는, 테스트용으로 제가 만든 예제 소스코드입니다. (아주 간단하게~~^^)
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
/* ========================================
 *
 * Copyright YOUR COMPANY, THE YEAR
 * All Rights Reserved
 * UNPUBLISHED, LICENSED SOFTWARE.
 *
 * CONFIDENTIAL AND PROPRIETARY INFORMATION
 * WHICH IS THE PROPERTY OF your company.
 *
 * ========================================
*/
#include "project.h"
int main(void)
{
    LED_Driver_1_Start();
    
    CyGlobalIntEnable; /* Enable global interrupts. */
    /* Place your initialization/startup code here (e.g. MyInst_Start()) */
    LED_Driver_1_PutChar7Seg('1',0);
    LED_Driver_1_PutChar7Seg('2',1);
    LED_Driver_1_PutChar7Seg('3',2);
    LED_Driver_1_PutChar7Seg('4',3);
    LED_Driver_1_PutChar7Seg('5',4);
    LED_Driver_1_PutChar7Seg('6',5);
    LED_Driver_1_PutChar7Seg('7',6);
    LED_Driver_1_SetDisplayRAM(0x55,7);
    
    for(;;)
    {
        /* Place your application code here. */
    }
}
/* [] END OF FILE */
cs



마지막으로 위의 내용에서 설명드린 것과 그대로 동작하는 프로젝트 파일을 첨부합니다. [Link File]

댓글 없음:

댓글 쓰기