본문 바로가기

Lecture/ARM

PWM input mode를 이용한 리모컨 신호 캡처

stm32f4 Discovery 보드를 이용하여 리모컨 신호를 캡처하고 있다. 


어떠한 방식으로 할까 고민하다가 데이터시트의 PWM input mode를 발견하였다. 


PWM input mode는 PWM 신호의 주파수와 PWM 비율을 구하는 것으로 ST에서 제공되는 기본예제에도 기능이 포함되어 있다.


이것을 배열을 이용하여 저장하였다가 overflow (cortex에서는 Update)가 일어나면 플레그를 셋하여 

메인문에서 배열을 출력하여 주는 방식이다. 



리모컨 신호를 리모컨 적외선 수광부인 KSM-603LM으로 수신할 경우 파형이 반전되기 때문에 


일반적으로 사용되는 Rising edge 를 이용하는 것이 아니라 Falling edge 를 이용하여 PWM을 측정하였다.


PWM Input mode 의 초기화는 다음과 같다.



타이머의 클럭을 계산하는 방법은 잘 모르겠으나 일단 위의 주석대로 SystemCoreClock/2 임은 측정을 통하여 확인해보았다.


따라서 TIM_Prescaler 를 84로 두어 타이머의 클럭을 1MHz로 설정해였고 

  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;  를 이용하여 Falling Edge로 동작하도록 하였다. 

위의 그래프에서 리모컨 신호는 TI1 처럼 들어오게 되고 수신되는 신호는 TI1의 반대로 수신하게 되므로 리모컨 신호를 그대로 받을 수 있다.


다만 출력된 데이터를 확인해본 결과 내가 짠 코드에서는 Update 때 데이터를 받도록 되어 있는데 이렇게 될 경우 첫 데이터가 TIMxCCR1의 값이 쓰레기 값이 그리고 TIMxCCR2의 값은 마지막 측정된 값이 이어서 출력되게 된다.

따라서 의미있는 데이터값은 배열의 두번째 데이터 부터 저장되게 된다. 


TIM3_IRQHandler 



Update 가 일어날 경우 입력 신호가 overflow 가 일어났다는 것이고 이것을 통해 리모컨 신호가 끝났다고 가정을 하였다.


그리고 CC1 이 일어나는 동안은 각각의 데이터를 저장하도록 하였다. 


테스트를 위한 출력은 다음과 같이 하였다. 



main함수에서의 데이터 처리



위의 함수를 while 문 안에 두어 데이터를 반복처리하도록 하였다. 


주석문 처리한 부분은 주변의 노이즈에 의해 신호가 들어오는 경우가 간간히 있다. 

리모컨의 발광부에 반사되어 들어오는 경우도 있는듯 하고 수광부 주변에 손을 가져갈 경우 간혹 의도하지 않은 신호가 들어오곤 한다.


따라서 유의미한 신호가 2개 이하일 경우 Index 값을 0으로 초기화해주는 함수를 이용하여 노이즈를 제거하였다.



이렇게 리모컨 신호를 만들어 출력해본 결과 데이터는 정상적으로 출력되었다. 

하지만 NEC 방식의 혹은 그와 유사한 방식의 리모컨 포멧을 사용할 경우에는 정상적으로 측정이 되나

내가 가지고 있는 리모컨모듈같은 경우에는 신호가 정상적으로 잡히지 않았다. 


그 이유로는 KSM-603LM 가 밴드패스 필터를 가지고 있어 38Khz 정도의  반송파를 이용하여 필터를 통과한 신호를포락선 검파를 이용하여 데이터를 얻는데 아마도 기타 리모컨의 경우 이러한 방식을 이용하지 않는가 보다. 


아니면 이들의 데이터 신호가 너무 길어서 측정하지 못하는 것일 수도 있다.



오실로스코프와 프로그램을 ARM 을 이용하여 측정하여 본 결과 정확한지는 모르겠는데 한 전체 신호의 길이가 약 10배정도 차이났던거 같다. 


확실히 리모컨 신호가 단순하고 데이터의 길이가 매우 길었던 것으로 기억난다. 


표준 리모컨 신호를 이용할 경우 혼선이 발생할 수 있어 그렇게 만들었는지는 모르겠지만 


가전제품 리모컨이 아닌경우 정확하게 측정되지 않을 수도 있다는 것을 미리 밝혀둔다. 





오래간만의 포스팅이네....


이제 좀 열심히 하자!!!!