지돌이의 블로그 입니다!

라즈베리파이의 오디오 출력은 PWM신호에다가 RC LPF-Filter을 거쳐서 출력됩니다.


(위 사진은 Raspberry B+ 버전부터의 오디오 출력 회로입니다. 이전 버전에서는 전압분압부분과 버퍼가 없습니다.)

라즈베리파이의 음질이 좋지 않다는 것은 많은 분들이 이미 알고 있습니다.

사운드 전용 Chip이나 DAC가 있는 것이 아니니 음질이 좋길 바랄 수는 없겠지요..


그런데 D-Class앰프도 PWM을 이용하여 소리를 출력합니다.

D-Class앰프는 음질이 좋은 편이죠.


우선 D-Class앰프는 오디오 신호에 삼각파를 이용해 PWM을 합니다.

만들어진 PWM신호로 FET등을 스위칭해 큰 진폭을 갖는 PWM신호로 만든다음 20kHz LPF LC-Filter을 통해 스피커로 소리를 출력하는 원리입니다.

(빨간색이 원본 오디오 신호, 초록색이 삼각파, 파랑색이 PWM된 신호입니다.)

(C언어로 알고리즘을 만들어 시뮬레이션을 한 결과입니다.)


그래서 저는 D-Class 앰프의 원리를 라즈베리파이에도 적용시켜보려고 합니다.


이걸 하려면 오디오쪽 커널 소스와 오디오 출력 회로를 모두 바꿔야 합니다.


위 회로는 간단하게 구성도를 그려본 것입니다.

47uH / 560nF 의 LC-Filter으로 31 kHz LPF을 구성하였으며

공진때문에 덤핑저항 10옴을 넣어 주었습니다.


그런데 적절한 주파수에 적당히 작은 크기로 하려면 덤핑저항이 계속 커집니다...

제가 능력이 없어서 그런 것이겠지만 덤핑저항을 10옴 넘게 만들기가 힘들더군요...


쨋든 라즈베리파이 PWM ---> 전압분압&버퍼 ---> LC LPF ---> 버퍼 ---> 출력

이런식으로 구성해야겠습니다.


라즈베리파이 커널소스를 찾아보며 소스를 수정해 다시 올리고 회로를 구성해 봐야겠네요.

Comment +0

2014.01.24. 13:33


구성은 라즈베리파이 + USB형 터치스크린컨트롤러 + 7Inch 모니터 이렇다.

 

그런데...

우선 USB터치컨트롤러는 리눅스 ARM환경또한 지원한다.(Daemon으로 작동하는 드라이버 바이너리)

그런데.. X환경에서는 캘리브레이션을 지원하는데...

Non X환경에서는 캘리브레이션을 지원하지 않는다..ㅠㅠ

결국 캘리브레이션은 직접 했다.

 

터치시 /dev/input/eventX 으로 데이터가 날라온다.

C으로 프로그램을 짰는데 mouse디바이스를 open하고

데이터가 날라오면 input_event구조체로 읽는다.

input_event는 <linux/input.h> 에 있다.

struct input_event {

 struct timeval time;

 __u16 type;

 __u16 code;

 __s32 value;

};

 

터치가 되면 type=3,

code=0또는 1 (0:X좌표, 1:Y좌표)

value = 좌표값 (화면상의 좌표가 아닌 터치컨트롤러에서 나오는 좌표값이다.)

이렇게 날라온다.

 

캘리브레이션은 5점 방식으로 하였다.


http://www.ti.com/lit/an/slyt277/slyt277.pdf

http://www.scienceprog.com/how-to-calibrate-touch-screen-display-on-stm32-board/

특히 두번째 링크가 큰 도움이 되었다ㅋ



처음에만 켈리브레이션을 하고 켈리브레이션값은 저장해 놓고 다음부터는 하지 않아도 된다.

 

Non X환경으로 직접 FrameBuffer을 맵핑해서 제어한다.

그래서 그런지 느리다;;;

CPU는 70%나 먹으면서;;

초당 100번(10000uS쉬면서) FB에 커서 위치를 표시한다.

글구 1000uS Timeout을 걸어놓고 mouse device을 읽으면서 1000uS 쉰다. 즉 초당 500번정도 마우스 값을 읽는걸 시도한다. (이것보다 더 많이 쉬게 하면 반응속도가 너무 느려짐...ㅠㅠ)

 

라즈베리의 한계 + 내 프로그래밍 실력ㅠㅠ 으로 느.리.다.

 

나중엔 이걸로 태블릿 비슷하게 만들어볼 계획이다.

Comment +1

  • dragom 2017.03.23 00:17

    터치 콘트롤러를 만들려고하다가 리눅스에서 터치 이벤트를 어떻게 처리해야할까에서 막혔었는데 참고가 될듯 합니다. 감사합니다