IQmath를 사용하는 이유는 Floating point number를 지원하지 않는 Fixed point processor 타입의 MCU를 사용할경우
곱셈, 나눗셈의 연산처리 속도가 느리다는 점을 보완하여 함수의 처리 속도를 향상하기 위해서 사용합니다.
특히나 SYSCLK 이 느린 저가의 MCU의 경우엔 전체적인 시퀀스의 시간을 줄여서 더 많은 알고리즘을 탑재하기 위한 최적화 작업에
필요로 하지 않나 싶습니다.
우선 TI 사에서 제공하는 controlSuite를 설치하게 되면
C:\ti\controlSUITE\libs\math
다음과 같은 경로에 iqmath library들이 들어있는것을 확인할수 있는데요.
여기서 진행하는 것은
iqmath library V1.6.0,
CCS 6.1.2,
Compiler version TI v6.4.6,
TMS320F28027 환경에서 테스트를 진행하였습니다.
폴더 안에 들어가면 다음과 같은 목록이 보이게 될텐데 여기서 doc 폴더안에는 IQmath library 사용법에대해 적혀있는 가이드북이 들어있습니다.
다음은 싱크웍스에서 가져온 IQmath 사용법에대한 간략한 정리 입니다.
<출처 : http://www.mcublog.co.kr/647 >
이를 참고해서 프로젝트를 셋팅해보고자 합니다.
우선 첫번째는 배제시켜도 되는게 요즘은 controlSuite에서 제공하는것을 사용하면 될것 같습니다.
옛날버전을 필요로 한다면 위에 링크를 따라 다운로드 받으시면 됩니다.
두번째로 실험을 하기위한 기본 프로젝트는 생성되었다고 가정하고 다음과 같이 library와 header 파일을 프로젝트안에 넣고 설정을 해줍니다.
그리고 커맨드 파일을 아래와 같이 추가해주면 셋팅은 완료입니다.
우선 IQmath는 실수를 정수로 변환하여 사칙연산을 수행하는 기법이기 때문에 내가 가진 데이터의 범위를 알고있어야 원하는 값에 근사한 값을
얻을수 있습니다. IQ로 표현할수있는 범위는 아래와 같습니다.
<출처 : IQmath_Quickstart.pdf 파일>
보면 알수있다 싶이 iq값이 증가함에 따라 소수점 이하 부분의 분해능이 좋아지고 지수 부분의 범위는 줄어드는 것을 알수있습니다.
IQmath로 표현할수 있는 숫자는 2^31까지 입니다. (2,147,483,648)
마지막 자리수는 부호 비트입니다.
IQ15 + IQ15를 하면 IQ15가 되고 서로다른 Q값은 덧셈, 뺄셈을 하기위해 Q를 동일하게 맞추어 주어야 합니다.
또한 IQ16 * IQ14를 하면 IQ30이 됩니다. overflow를 방지하기 위해서는 이왕이면 곱이 IQ30을 넘지 않는것이 좋을것으로 보입니다.
예를들어 정수와 실수의 곱연산을 해야한다면 이둘의 곱은 2^31의 값을 벋어 나지 않아야 함으로
실수부분의 resolution을 세밀하게 가져가거나 정수부분을 크게 가져가거나 에대한 최적의 Q값을 고려해야 합니다.
또한 IQ끼리의 곱셈을 도와주는 함수가 _IQmpy() 이고 IQ끼리의 나눗셈을 도와주는 함수가 _IQdiv() 인데
ex )
_IQ24mpy(_IQ10(변수1), _IQ20(변수2)); // 결과값은 IQ6이 되게 됩니다.
_IQ1div(_IQ2(변수1), _IQ1(변수2)); // 결과값은 IQ2가 되게 됩니다.
위와 같은 환경에서 진행을 하다보면 iqmath library는 옛날 자료인데 CCS버전은 높아서 warning이 발생하는 경우가 생겼습니다.
저의 경우에는 _IQdiv() 함수를 사용했을때 위와 같은 warning이 발생하더군요.
하지만 동작은 정상적으로 작동합니다.
이부분에 대해서는 TI Communitiy에서 심심치 않에 버전에 문제로 인해서 그렇다는 글이 나와있습니다.
또한 이전 포스팅에서 언급했던 부분인데 이부분이 신경쓰인다면 warning을 예외 처리로
숨겨놓을수가 있습니다.
project property에 들어가서 (Alt+Enter)
다음과 같이 넣어주게 되면 warning이 뜨지 않도록 할수가 있습니다.