6 핀 I / O가있는 Atmel ATtiny13을 사용하고 있습니다. 약 15 개의 LED를 제어하고 싶지만 모든 것을 연결하는 방법을 잘 모르겠습니다. 어떤 종류의 다중화가 없으면 한 번에 6 개의 LED 만 제어 할 수있는 것 같습니다. 마이크로 컨트롤러의 크기 때문에 6 개의 LED로만 제한됩니까?
6 핀 I / O가있는 Atmel ATtiny13을 사용하고 있습니다. 약 15 개의 LED를 제어하고 싶지만 모든 것을 연결하는 방법을 잘 모르겠습니다. 어떤 종류의 다중화가 없으면 한 번에 6 개의 LED 만 제어 할 수있는 것 같습니다. 마이크로 컨트롤러의 크기 때문에 6 개의 LED로만 제한됩니까?
답변:
몇 개의 IO 핀에서 많은 수의 LED를 구동하는 데 사용할 수있는 몇 가지 방법이 있습니다.
가장 간단한 방법은 표준 행 / 열 디스플레이 멀티플렉싱입니다. 이 기술을 사용하면 IO 핀으로 LED를 구동 할 수 있습니다 . 수학적으로 듀티 사이클은 다음과 같습니다.
즉,이 기술은 모든 LED가 켜졌을 때 (또는 모든 행 또는 모든 열이 동일 할 때) 듀티 사이클이 100 %이고 대각선이 켜질 필요가있을 때 (또는 모든 행이 다른 경우) 듀티 사이클이 임을 의미합니다. ). 모든 LED 또는 하나의 LED (또는 제로 LED)를 조명 할 때는 100 % 듀티 사이클 만 보장되지만 실제로는 그다지 중요하지 않습니다.
약간 더 복잡한 것은 Charlieplexing 입니다. 이 기술을 사용하면 IO 핀으로 LED를 구동 할 수 있습니다 . 이 기술 에서는 LED 만 동시에 켜질 수 있습니다. 수학적으로 듀티 사이클은 다음과 같습니다.
여기서 동시 세트는 공통 양극 또는 공통 음극을 갖는 고유 한 LED 그룹입니다. (이것은 입증되지 않았으며, 잠시 동안 문제를 숙고 한 후에 도착한 것입니다. 듀티 사이클이 중요한 경우 더 자세히 살펴보고 싶을 것입니다.) 이것은 지적 적으로 훨씬 더 복잡한 계산입니다. 표준 다중화에 대한 등가 계산보다 계산적으로. 효과적으로, 모든 LED가 켜져 있지만 n-1 이하 LED의 일부 (일부만) 패턴의 듀티 사이클이 100 % 일 때 의 듀티 사이클을 얻게 됩니다. 1 개의 LED를 켜면 100 % 듀티 사이클 만 보장됩니다.
마지막으로 언급 할 방법은 시프트 레지스터 또는 IO 확장기 를 사용하는 것 입니다. 두 개의 핀 (원시 데이터 / 클록 인터페이스, I2C 또는 단방향 SPI)을 사용하여 임의로 많은 수의 LED를 제어 할 수 있습니다. 모든 패턴의 듀티 사이클은 100 %이지만 업데이트 속도는 LED 수에 반비례합니다. 가장 비용이 많이 드는 방법입니다. 15 개의 LED의 경우 IO 핀이 많은 마이크로로 업그레이드하는 것이 더 저렴할 것입니다.
Charlieplexing 을 사용하면 핀 에서 LED를 직접 구동 할 수 있습니다 .
예 :
3 개의 핀에 6 개의 LED :
PINS LEDS
0 1 2 1 2 3 4 5 6
0 0 0 0 0 0 0 0 0
0 1 Z 1 0 0 0 0 0
1 0 Z 0 1 0 0 0 0
Z 0 1 0 0 1 0 0 0
Z 1 0 0 0 0 1 0 0
0 Z 1 0 0 0 0 1 0
1 Z 0 0 0 0 0 0 1
0 0 1 0 0 1 0 1 0
0 1 0 1 0 0 1 0 0
0 1 1 1 0 0 0 1 0
1 0 0 0 1 0 0 0 1
1 0 1 0 1 1 0 0 0
1 1 0 0 0 0 1 0 1
1 1 1 0 0 0 0 0 0
멀티플렉싱 (직접 드라이브)이 없으면 6 개의 LED로 제한됩니다.
찰 리플 렉싱을 사용하면 n 핀에서 n * (n-1) LED를 구동 할 수 있습니다.
I / O 익스팬더 또는 시프트 레지스터를 사용하면 거의 무제한의 LED를 구동 할 수 있습니다.
예 : MCP23008 8 비트 I2C I / O 확장기
@ mjh2007은 I2C 확장기를 제안했습니다. 그러나 외부 전류 제한 저항이 필요없는 LED 구동 용 제품 이 있습니다.
다음은 내가 구축 한 찰 리플 렉싱의 예입니다.
이 장치는 등대 빔 시뮬레이터이며 4 개의 GPIO로 찰리 플렉스 된 12 개의 LED 시리즈를 사용하여 디스크 주위의 광선을 스윕합니다. 여기에 비디오가 있습니다 .
이 프로젝트는 PIC 기반이며 8pin uP 인 PIC12f683을 사용하며 8pin AVR과 비슷한 것으로 간주 될 수 있습니다.
LED의 강도는 약 60Hz에서 32 단계 PWM을 제공하는 인터럽트에 의해 구동됩니다. 한 번에 두 개의 LED 만 켜면 각 LED마다 50 %의 듀티를 제공 할 수 있습니다. 또한 해상도에 대한 PWM 재생률과의 균형을 유지합니다.
찰 리플 렉싱을 한 번에 하나의 LED 만 매우 빠른 재생률로 조명하는 "클래식"방법을 고수하는 경우 실제로 찰 리플 렉싱을 사용하기위한 코딩. 먼저 필요한 PORT 및 TRIS (pic 특정 레지스터)를 용지에 기록한 다음 결과를 정적 배열에 저장합니다. LED x를 밝게하려면 PIC는 어레이의 인덱스 [x]에서 값을 찾아 PORT에 직접 써야합니다 (캐릭 플렉스에 사용되지 않은 다른 핀의 상태를 유지하기 위해 약간의 마스킹 사용)
내 프로젝트는 향후 개발을 위해 하나의 GPIO를 유지하기를 원할 때 15 개가 아닌 12 개 LED 또는 5 개 GPIO가 허용하는 최대 20 개만 있습니다.
어쨌든 ... 방금 요청한 것과 비슷한 예제를 만드는 것이 도움이 될 것이라고 생각했습니다.
전체 소스 코드와 회로도는 내 블로그에서 확인할 수 있습니다 .