[DSP]/DSP280x-M2010. 5. 2. 23:30

[DSP280x-M EVM] 보드 테스트 - ADC, PWM 테스트(eCAP PWM)

[DSP280x-M EVM] 보드 테스트 - ADC, PWM 테스트(eCAP PWM)

TMS320F2808의 ADC값을 읽어 PWM으로 출력하는 테스트.


[DSP280x-M EVM]에는 PWM0~PWM3의 PWM을 할당해 두었다. 확장보드의 PWM3은 TMS320F2808의 P11에 연결되어 있고 가각 PWM6B/eCAP4/RXDB 기능을 가지고 있다.
그중에서 확장보드의 LED2에 연결되어 있는 PWM3을 이용하여 ADC값에 따라 PWM출력을 제어 하고 이 출력이 고휘도 LED의 밝기를 설정하는 예제를 작성하기 위해 32bit 분해능의 eCAP4로 PWM을 출력해 보았다.


확장 테스트 보드에서 PWM3은 CN40, LED2에 연결되어 있다.



TMS210F2808 PWM테스트 동영상
- 가변 저항값에 따라 PWM출력을 변경하고 이에 따라 PWM을 이용한 고휘도 LED출력



TMS320F2808 eCAP을 이용한 PWM테스트 예제소스
P11(eCAP4) 초기화 설정
#if _ENABLE_ECAP4
#define PwmSetEcap4(Period)     ECap4Regs.CAP2 = (ECap4Regs.CAP1-(ECap4Regs.CAP1*Period/100))
#define PwmSetPeriodEcap4(Freq, Period)  ECap4Regs.CAP1 = 100000000/(Freq);PwmSetEcap4(Period)

void Ecap4_Config(unsigned long Freq)
{
   EALLOW;
// P11 풀업 설정
   GpioCtrlRegs.GPAPUD.bit.GPIO11 = 0;   // Enable pull-up on GPIO11 (CAP4)

// SYSCLKOUT와 동기화된 입력으로 설정
   GpioCtrlRegs.GPAQSEL1.bit.GPIO11 = 0; // Synch to SYSCLKOUT GPIO11 (CAP4)
// P11을 eCAP-4으로 설정
   GpioCtrlRegs.GPAMUX1.bit.GPIO11 = 3;  // Configure GPIO11 as CAP4
   EDIS;
    :
}

pwm.c 함수
void InitPwm(void)
{
 Ecap4_Config(50);   //50Hz, duty 50%
}

void PwmSet3(unsigned int Period)
{
 PwmSetEcap4(Period);
}

main 함수

void main(void)
{
 unsigned int pwm_period = 50;
 unsigned int temp = 0;

 //DSP System Initialize
 SystemInit();

 Led1Init();
 Led1On();

 DebugInit(BAUD_57600);
 DebugPrint("ePWM Test Program\r\n");

 //Init PWM
 InitPwm();

 //ADC Init
 AdcInit();

 while(1)
 {
  temp = ((float)AdcRead(8)/4095.0*100.0);

  PwmSet3(temp);
  U0_PutInt(temp);
  Delay(50);
 }
}

Posted by nexp

댓글을 달아 주세요

[DSP]/DSP280x-M2010. 5. 2. 23:30

[DSP280x-M EVM]보드 테스트 - TMS320F2808 ePWM 1Mhz PWM제어

[DSP280x-M EVM]보드 테스트 - TMS320F2808 ePWM 1Mhz PWM제어



#define PWM_10KHZ    10000 //10 KHz
#define PWM_100KHZ    1000 //100 KHz
#define PWM_125KHZ    800  //125 KHz
#define PWM_167KHZ    600  //167 KHz
#define PWM_200KHZ    500  //200 KHz
#define PWM_400KHZ    250  //400 KHz
#define PWM_500KHZ    200  //500 KHz
#define PWM_1MHZ    100  //1 MHz
#define PWM_2MHZ    50  //2 MHz
#define PWM_4MHZ    25  //4 MHz
#define PWM_5MHZ    20  //5 MHz
#define PWM_8_33MH    12  //8.33 MHz
#define PWM_10MHZ    10  //10.0 MHz
#define PWM_20MHZ    5  //20.0 MHz

void InitPwm(void)
{
  HRPWM6_Config(PWM_1MHZ );   //1MHz, duty 50%
}

void PwmSet3(unsigned int Period)
{
 SetPwm6APeriod(PWM_1MHZ , Period);
}


#if _ENABLE_PWM6
void SetPwm6Period(unsigned int Frequency, unsigned int Period)
{
    EPwm6Regs.TBPRD = Frequency;
    EPwm6Regs.CMPA.half.CMPA = Frequency-(Frequency*(Period/100));
}

void SetPwm6APeriod(unsigned int Frequency, unsigned int Period)
{
    EPwm6Regs.TBPRD = Frequency;
    EPwm6Regs.CMPA.half.CMPA = Frequency-(Frequency*(Period/100));
}

void SetPwm6BPeriod(unsigned int Frequency, unsigned int Period)
{
    EPwm6Regs.TBPRD = Frequency;
    EPwm6Regs.CMPB = Frequency-(Frequency*(Period/100));
}

void HRPWM6_Config(unsigned int Freq)
{
   EPwm6Regs.TBPRD = period;                      // Set timer period
   EPwm6Regs.TBPHS.half.TBPHS = 0x0000;           // Phase is 0
   EPwm6Regs.TBCTR = 0x0000;                      // Clear counter

   // Setup TBCLK
   EPwm6Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up
   EPwm6Regs.TBCTL.bit.PHSEN = TB_DISABLE;        // Disable phase loading
   EPwm6Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;       // Clock ratio to SYSCLKOUT
   EPwm6Regs.TBCTL.bit.CLKDIV = TB_DIV1;

   EPwm6Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;    // Load registers every ZERO
   EPwm6Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
   EPwm6Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
   EPwm6Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;   


    :
}


main()함수
#include "system.h"
#include "serial.h"
//#include "timer.h"
#include "epwm.h"

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

 Led1Init();
 Led1On();

 DebugInit(BAUD_57600);
 DebugPrint("ePWM Test Program\r\n");

 InitPwm();

while(1)
 {
  if(DebugIsByte())
  {
   switch(DebugGetByte())
   {
    case '+':
     DebugPrint("PWM=");
     U0_PutInt(pwm_period);
     DebugPrint("\r\n");
     SetPwm6Period(PWM_FREQ, pwm_period);
     pwm_period++;
     break;

    case '-':
     DebugPrint("PWM=");
     U0_PutInt(pwm_period);
     DebugPrint("\r\n");
     SetPwm6Period(PWM_FREQ, pwm_period);
     pwm_period--;
     break;
   }
  }
 }
}
Posted by nexp

댓글을 달아 주세요

[DSP]/DSP280x-M2010. 5. 2. 23:02

[DSP280x-M EVM] 보드테스트 - ADC, UART 테스트 (TMS320F2808)

[DSP280x-M EVM] 보드테스트 - ADC, UART 테스트 (TMS320F2808)



TMS320F2808 의 ADC값을 UART로 전송하는 테스트 프로그램 작성.

[DSP280x-M EVM]보드에는 ADCB0~ADCB7까지 8개의 ADC가 할당되어 있다. 확장 테스트 보드의 ADC0가 ADCB0에 연결되어 있기 때문에 TMS320F2809 ADC Channel8에서 VR값을 읽을 수 있다.




TMS320F2808 ADC, UART 테스트 동영상



PC프로그램
ADC값을 읽어 UART로 전송하면 그 값을 디버깅하기 위한 PC프로그램



TMS320F2808 ADC, UART(SCI)테스트 소스코드
 void AdcInit(void)
{
   EALLOW;
   SysCtrlRegs.HISPCP.all = ADC_MODCLK; // HSPCLK = SYSCLKOUT/ADC_MODCLK
   EDIS;
    
   InitAdc();  // For this example, init the ADC

   // Specific ADC setup for this example:
   AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;
   AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;    
   AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;        // 1  Cascaded mode
   AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x8;
   AdcRegs.ADCTRL1.bit.CONT_RUN = 1;       // Setup continuous run 
  
     // Start SEQ1
   AdcRegs.ADCTRL2.all = 0x2000;
}

unsigned int AdcRead(unsigned int Cnannel)
{     
 AdcRegs.ADCCHSELSEQ1.bit.CONV00 = Cnannel;
 AdcRegs.ADCTRL1.bit.CONT_RUN = 1;       // Setup continuous run

  while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {} // Wait for interrupt

   asm(" RPT #11 || NOP");
  AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;
   return (AdcRegs.ADCRESULT0>>4);
}



void main(void)
{
 unsigned int temp = 0;
 unsigned int cnt = 0;
 
 //DSP System Initialize
 SystemInit()
 Led1Init();
 Led1On();

DebugInit(BAUD_57600);

 DebugPrint("ADC TEst Test\r\n");
 AdcInit();

 while(1)
 {
  switch(U0_GetByte())
  {
  case '0':
     Led1Off();
   DebugPrint("LED OFF\r\n");
     break;
  case '1':
   Led1On();DebugPrint("LED ON\r\n");   
     break;
 case 'c':
   DebugPrint("CNT="); 
   U0_PutInt(cnt++);
   break;
      
  case 'r':
   DebugPrint("ADC="); 
   temp = AdcRead(8);
   U0_PutInt(temp);
   break; 
  } 
 }
}  
Posted by nexp

댓글을 달아 주세요

[DSP]/DSP280x-M2010. 5. 2. 22:38

[DSP280x-M EVM] 보드 테스트 - Serial




TMS320F2808에는 2개의 SCI모듈이 있고 [DSP280x-M EVM] 보드에 표준 핀맵으로 연결되어 있다.



USB2UART 통신 모듈
USB로 전원 공급 및 UART통신이 가능하다.



초기화 함수
// Serial Prot0 Utility Fuction Routine
void U0_Init(unsigned char baud)
{
//SCI 포트 초기화
 InitSciaGpio();

  //SCI FIFO설정
  SciaRegs.SCIFFTX.all=0xE040;
  SciaRegs.SCIFFRX.all=0x204f;
  SciaRegs.SCIFFCT.all=0x0;

  //보레이트 설정
  U0_SetBaud(baud);

  SciaRegs.SCICCR.all =0x0007;   // 1 stop bit,  No loopback
                                   // No parity,8 char bits,
                                   // async mode, idle-line protocol
 SciaRegs.SCICTL1.all =0x0003;  // enable TX, RX, internal SCICLK,
                                   // Disable RX ERR, SLEEP, TXWAKE
 SciaRegs.SCICTL2.all =0x0003;
 SciaRegs.SCICTL2.bit.TXINTENA =1;
 SciaRegs.SCICTL2.bit.RXBKINTENA =1;
 
 SciaRegs.SCICTL1.all =0x0023;  // Relinquish SCI from Reset 
}


SCI 송수신 함수
#define WaitForSend()    while(SciaRegs.SCIFFTX.bit.TXFFST != 0)
#define WaitForReceive()      while(SciaRegs.SCIFFRX.bit.RXFFST !=1)
#define WaitForSend1()    while(!(ScibRegs.SCICTL2.bit.TXEMPTY))
#define WaitForReceive1()      while(!(ScibRegs.SCIRXST.bit.RXRDY))
#define TxData(Data)    (SciaRegs.SCITXBUF = (Data))
#define RxData()     (SciaRegs.SCIRXBUF.all)
#define Tx1Data(Data)    (ScibRegs.SCITXBUF = (Data))
#define Rx1Data()     (ScibRegs.SCIRXBUF.all)

unsigned char U0_GetByte(void)
{
 WaitForReceive();
 
 return RxData();
}

void U0_PutByte(unsigned char Data)
{
    WaitForSend();
    TxData(Data);
}
Posted by nexp

댓글을 달아 주세요

[DSP]/DSP280x-M2010. 5. 2. 21:37

[DSP280x-M EVM] 보드 테스트 - LED, Switch, Buzzer GPIO 테스트

[DSP280x-M EVM] 보드 테스트 - LED, Switch, Buzzer GPIO 테스트


myMCU-EXP보드를 이용하여 [DSP280x-M EVM] 보드 테스트를 진행했다.
TMS320F2809의 GPIO 테스트 하기 위해 LED(P10), SWITCH(P27), Buzzer(P11)에 연결된 GPIO Port10, 11, 27 를 테스트 했다.

개발환경 환경설정
기존에 제작했던 다른 MCU의 코드와 호환되도록 하기 위해 Code Composer Studio 프로젝트파일을 좀 수정했다.



driver 파일 및 include 파일 옵션 설정



확장 보드 <->TMS320F2808  핀맵
myMCU-EXP  DSP280x-M EVM
 

 

LED1 -> PWM2 -> P10
SWITCH1 -> INT0 -> P27
BUZZER ->PWM3 -> P11



TMS320F2808 EVM - LED, Buzzer, Switch 회로도




테스트 동영상



TMS320F2809 LED, Switch, Buzzer 테스트 예제 소스
//Buzzer
void Buzzer(unsigned int Time)
{
 unsigned int i;
 BUZZER_ON();
 Delay(Time);
 BUZZER_OFF();
}

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

 Led1Init();
 Led1On();

 Led2Init();
 Led2Off();

 Sw1Init();
 BUZZER_INIT()

 while(1)
 {
  //Led Toggle
  Led2Toggle();
  Delay(200);

  //Switch Status
  if(GetSw1())
  {
   Led1On();
   Buzzer(200); 
  }
  else Led1Off();
 }
}  

Posted by nexp

댓글을 달아 주세요