이번에는 꽤 유용한 콤포넌트가 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 |
마지막으로 위의 내용에서 설명드린 것과 그대로 동작하는 프로젝트 파일을 첨부합니다.
'PSOC5' 카테고리의 다른 글
[PSOC5] TR(MMBT3904),열전대 온도측정(프로그램 첨부) (0) | 2017.02.19 |
---|---|
[PSOC5] printf/sprintf 함수에서 floating point 값 표시 (컴파일러 버그) (1) | 2017.02.19 |
[PSOC5] 수학 함수(log 함수) 사용 방법(컴파일러 버그) (0) | 2017.02.19 |
[PSOC5] EEPROM 테스트 (0) | 2017.02.14 |
[PSOC5] SD Card I/F (SPI 방식) (0) | 2016.12.14 |