[DSP]/DSP280x-M2010. 5. 5. 21:00

[DSP280x-M EVM] C28x Signal Generator Library 테스트

[DSP280x-M EVM] C28x Signal Generator Library 테스트
TI에서 제공하는 C28x용 라이브러리 는 여러가지로 유용한 점이 많은데 그중 가장 기본이 되는 C28x Signal Generator Library 를 이용하여 신호를 생성하는 테스트를 진행 했다.


TI제공 라이브러리 및 소스코드


우선 소스코드를 다운 받아서 라이브러리를 인클루드 해 준다.
sgen.h
sgen.lib

생성 한 신호를 확인하기 위해 여러가지 방법이 있지만 가장 간단하게 할 수 있는것이 PC USB2UART 이다. 신호 생성용 라이브러리를 이용하여 생성후 시리얼로 데이터 전송하여 확인하면 쉽게 생성된 데이터를 확인 할수 있다.



Single Channel SIN Generator (Table look-up)
신호 생성 라이브러리에느 여러 신호 생성 테이블이 있는데 그중 가장 간단한 사인(sin)파 생성을 방법을 살펴 보면 아래와 같은 구조로 구성되어있다.



데이터 타입(SGENT_1)은 SGENT_1_DEFAULTS, SGENT_1_handle 두가지로 생성 할수 있다. SGENT_1_handle는 사용자 정의 테이블 이므로 일단 Default로 생성 한다

//신호 생성 메모리 할당
SGENT_1 sgen1 = SGENT_1_DEFAULTS;

주파수 및 각 파라메터 설정
기본 최대 주파수는 20Khz샘플레이트에서 step_max가 1000으로 설정되고 305.17Hz가 된다. 당연히 2000으로 설정하면 610Hz가 되겠지...
적절히 잘 조절하면 원하는 주파수를 생성할 수 있다. 물론 주파수가 높아지면 신호는 정밀도가 떨어지지만...



TMS320F2808 신호 생성 테스트 예제
코드 아주 심플하여 쉽게 적용 가능하다. 메모리 할당하고 sgen1.calc() 함수로 신호를 생성후 sgen1.out 신호를 PWM 또는 DAC로 출력하면 된다.

//신호 생성 메모리 할당
SGENT_1 sgen1 = SGENT_1_DEFAULTS;

void main(void)
{
 //DSP System Initialize
 SystemInit();

 Led1Init();
 Led1On();

 DebugInit(BAUD_57600);
 DebugPrint("Signal Gen Test\r\n");

 //신호 생성 초기화
 sgen1.offset=0;
 sgen1.gain=0x7fff;        // gain=1 in Q15                              
 sgen1.freq=5369;          /* freq = (Required Freq/Max Freq)*2^15       */
                                 /*      = (50/305.17)*2^15 = 5369             */         
 sgen1.step_max=1000;      /* Max Freq= (step_max * sampling freq)/65536 */
                                       /* Max Freq = (1000*20k)/65536 = 305.17       */
 while(1)
 {
  //신호 생성
  sgen1.calc(&sgen1);
  sig1=sgen1.out;
  
  //신호 출력
  U0_PutInt(sig1);

  Led1Toggle();
  Delay(50);
 }
}


테스트 동영상



추가로 데이터 로그 라이브러리를 이용하면 Code Composer Studio에서 제공하는 그래프 기능을 사용 하여 쉽게 디버깅 할 수 있다. (물론 위 방법보다 실시간성은 떨어지지만...)




그래프 보기 설정



소스코드

//데이터 로그모듈 생성
DLOG_4CH dlog=DLOG_4CH_DEFAULTS;    

main()
{
 :
 //데이터 로그 초기화      
 dlog.iptr1=&sig1;
 dlog.trig_value=0x800;
 dlog.size=1024;         //데이터 샘플수 1024 Samples
 dlog.init(&dlog);



 

 while(1)
 {
  //신호 생성
  sgen1.calc(&sgen1);
  sig1=sgen1.out;
  
  //신호 출력
  U0_PutInt(sig1);

 //그래프 업데이트
  dlog.update(&dlog);

  Led1Toggle();
  Delay(50);
 }





 

Posted by nexp

댓글을 달아 주세요