타이머를 이용한 스피커 제어
글쓴이: gurumong / 작성시간: 토, 2008/06/14 - 12:30오후
타이머의 인터럽트를 이용해서 스피커를 제어하려고 합니다
PC에서 구현하려는게 아니라 8051에서 구현하려고하는데요
그런데 막상 구현하려니 의문점이 생기는데요
만약 1000Hz의 소리를 내려고 한다면...어떤식으로 구현해야 바른것일까요?
1. 타이머의 인터럽트를 초당 2000번 발생시키고 인터럽트가 발생하면 스피커가 ON이면 OFF, OFF이면 ON한다 (이전 상태 반전)
2. 타이머의 인터럽트를 초당 1000번 발생시키고 인터럽트가 발생하면 스피커를 ON하고 곧바로 OFF 시킨다
어느 방법이나 스피커로의 출력이 1초에 1000번 발생하게 되는데요
처음에 2번의 방법을 생각했으나 스피커를 켜고나서 끄는 동안의 시간이 CPU의 동작 속도에 따라서
그 시간이 짧거나 길거나 불규칙 할꺼 같아서 잘 모르지만 어떤!? 문제가 생기지 않을까 생각되었거든요
그래서 생각해낸게 1번의 방법인데...보통 타이머로 구현할시에 어떤 방법을 사용하게 되나요?
Forums:
8051이라면 인터럽트를 쓰지 않을 것 같습니다.
8051에서 빠르게 인터럽트를 처리할 수 있기는 하지만 최악의 경우 1초에 22000번까지 인터럽트를 발생시키는게 좋다고는 볼 수 없겠네요. 다른 일을 하지 않는다면 busy waiting으로 구현하는 편이 좋다고 생각합니다. 그리고 어쩔 수 없이 인터럽트를 사용한다면 1번이 좋을 것 같습니다. 2번의 경우 원하는 소리가 나오지 않을 가능성이 높습니다.
1000Hz 소리는 정현파로 만들어야 합니다.
pulse 로 가능한 것이 아닙니다. 따라서 1000Hz 이상으로 sample 을 출력해야합니다. 정현파의 구간구간값을 증가/감소해야겠지요. 만약 1000Hz 로 만들어야만 한다면 외부 회로에 적당한 capacitor 와 resistance 를 달아서 bipolar 형태의 원하는 signal 로 만들어주면 됩니다. 하지만 기왕 구현하시는 김에 많이 사용되는 audio sampling rate 과 sample bits 중에 적당한 것을 골라서 진행하시는 것이 더 좋을 듯 합니다. 예를 들면 8000Hz(반드시 1000Hz라면 어쩔 수 없고요) 8bit Mono 정도....입니다.
댓글 달기