[DSP]/PICCOLO2011. 10. 27. 01:03

[TMS320F28069 EVM] PICCOLO 시리즈 TFT-LCD테스트 - LCD_PLD_IF Board

[TMS320F28069 EVM] PICCOLO 시리즈 TFT-LCD테스트 - LCD_PLD_IF Board



다른건 다 좋은것 같은데 SPI클럭 속도가 좀 문제 인것 같다. 최대가 5Mhz정도라 ... SD Card 읽어오는데 속도가 느리게 느껴진다.


TMS320F28069 EVM TFT LCD 테스트 동영상
SD Card의 BMP이미지 파일을 읽어서 표시하는 테스트
Posted by nexp

댓글을 달아 주세요

[DSP]/PICCOLO2011. 5. 5. 11:52

[TMS320F28096 EVM] eQEP 엔코더 테스트

[TMS320F28096 EVM] eQEP 엔코더 테스트


TMS320F28069 에는 eQEP (QEI)는 여러가지 기능이 많이 있다. 간딘히  엔코더 카운터 테스트를 해 보았다.
eQEP의 핀맵은 아래와 같다.
GPIO20/EQEP1A  :  EQEP Phase A
GPIO21/EQEP1B   : EQEP Phase
BGPIO23/EQEP1I  : EQEP Index



[EXP-DSP EVM] 보드에는 엔코더가 장착되어 있는데 처음에 제작시에 TMS320F2808을 타겟으로 제작했기 때문에 점퍼가 필요하다. 확장성을 고려하여 핀을 뽑아 두었기 때문에 점퍼선으로 연결가능하다.



TMS320F28069 eQEP 블록도



TMS320F28069 eQEP 초기화 코드
void QEP_Init(void)
{
    EQep1Regs.QUPRD=800000;         // Unit Timer for 100Hz at 80 MHz SYSCLKOUT

    EQep1Regs.QDECCTL.bit.QSRC=00;      // QEP quadrature count mode

    EQep1Regs.QEPCTL.bit.FREE_SOFT=2;
    EQep1Regs.QEPCTL.bit.PCRM=00;       // PCRM=00 mode - QPOSCNT reset on index event
    EQep1Regs.QEPCTL.bit.UTE=1;         // Unit Timeout Enable
    EQep1Regs.QEPCTL.bit.QCLM=1;        // Latch on unit time out
    EQep1Regs.QPOSMAX=0xffffffff;
    EQep1Regs.QEPCTL.bit.QPEN=1;        // QEP enable

    EQep1Regs.QCAPCTL.bit.UPPS=5;       // 1/32 for unit position
    EQep1Regs.QCAPCTL.bit.CCPS=6;       // 1/64 for CAP clock
    EQep1Regs.QCAPCTL.bit.CEN=1;        // QEP Capture Enable
}


초기화 하고 QPOSLAT레지스터에서 값을 읽으면 아주 쉽게 엔코더값을 읽을 수 있다.
count = EQep1Regs.QPOSLAT;

[TMS320F28069 EVM] eQEP 엔코더 테스트 동영상
엔코더 카운트 값을 FND로 출력하는 예제



[TMS320F28069 EVM] eQEP 엔코더 테스트 소스코드
void main(void)
{
 unsigned int cnt = 0;

 //DSP System Initialize
 SystemInit();

 DebugInit(BAUD_115200);
 DebugPrint("TMS320F28069 eQEP Test(%d)Mhz\r\n", _SYS_CLK);

 Led1Init();
 Led2Init();
 Led1On();

 //eQEP 초기화
 InitEQep1Gpio();
 QEP_Init();

 //FND 초기
 FndInit();

 while(1)
 {
  //QEP 데이터 카운트값 읽어와서 
  cnt = EQep1Regs.QPOSLAT;

  DisplayFnd(cnt);
  Delay(1);
}
Posted by nexp

댓글을 달아 주세요

  1. 백대성

    관리자의 승인을 기다리고 있는 댓글입니다

    2012.08.20 22:24 [ ADDR : EDIT/ DEL : REPLY ]

[DSP]/PICCOLO2011. 5. 5. 08:30

[TMS320F28069 EVM] TFT LCD 테스트

[TMS320F28069 EVM] TFT LCD 테스트


[EXP-DSP EVM] 보드를 이용하면 8비트 모드로 TFT LCD를 쉽게 테스트 해 볼 수 있다. TMS320F28069는 최대 80MHz 동작하므로 속도는 느리지 않을것 같다.

일단 기존 코드에 드라이버 부분만 수정하면 프로그램 수정없이 테스트 가능하므로 속도 테스트를 해보자

TFT LCD 드라이버 코드
//-----------------------------------------------------------------------------
// TFT LCD Driver
#define TFT_DRV_COM44     1

#define LCD_LAT_BIT      BIT8
#define LCD_LAT_ON()     sbi(GPIOA_S, LCD_LAT_BIT);NOP();
#define LCD_LAT_OFF()     cbi(GPIOA_C, LCD_LAT_BIT);NOP();
#define LCD_DATA_LATCH()    LCD_LAT_ON();LCD_LAT_OFF();

#define LCD_EN_BIT      BIT30
#define LCD_EN_PORT      
#define LCD_ENABLE()     cbi(GPIOA_C, LCD_EN_BIT);NOP();
#define LCD_DISABLE()     sbi(GPIOA_S, LCD_EN_BIT);NOP();

#define LCD_RST_BIT      BIT6
#define LCD_RST_PORT     PORTA
#define LCD_RST_ON()     
#define LCD_RST_OFF()     

#define LCD_RS_BIT      BIT31
#define LCD_RS_PORT      
#define LCD_RS_OFF()     cbi(GPIOA_C, LCD_RS_BIT);NOP();
#define LCD_RS_ON()      sbi(GPIOA_S, LCD_RS_BIT);NOP();

#define LCD_WR_BIT      BIT12
#define LCD_WR_PORT      
#define LCD_WR_OFF()     cbi(GPIOA_C, LCD_WR_BIT);NOP();
#define LCD_WR_ON()      sbi(GPIOA_S, LCD_WR_BIT);NOP();

#define LCD_RD_BIT      BIT7
#define LCD_RD_PORT      
#define LCD_RD_OFF()     //cbi(GPIOA_C, LCD_RD_BIT);NOP();
#define LCD_RD_ON()      //sbi(GPIOA_C, LCD_RD_BIT);NOP();

#define LCD_BL_BIT      BIT6
#define LCD_BL_PORT      PORTB
#define LCD_BL_OFF()     
#define LCD_BL_ON()      

#define _LCD_DAT_OUT(Data)    PORTA = (PORTA&(~0xFF)) | (Data>>8)&0xFF;NOP();\
          LCD_DATA_LATCH();\
          PORTA = (PORTA&(~0xFF)) | (Data&0xFF)&0xFF;NOP();

#define TFTGpioInit()     EALLOW;\
          Sbi(GpioCtrlRegs.GPADIR.all, 0xFF);\
          Cbi(GpioCtrlRegs.GPAMUX1.all, 0xFF);\
          GpioCtrlRegs.GPAMUX2.bit.GPIO30 = 0;\
          GpioCtrlRegs.GPADIR.bit.GPIO30 = 1;\
          GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 0;\
          GpioCtrlRegs.GPADIR.bit.GPIO31 = 1;\
          GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0;\
          GpioCtrlRegs.GPADIR.bit.GPIO12 = 1;\
          GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 0;\
          GpioCtrlRegs.GPADIR.bit.GPIO8 = 1;\
          EDIS;
//-----------------------------------------------------------------------------



TMS320F28069 EVM 핀맵


[EXP-DSP] TFT LCD관련 자료





TMS320F28069 EVM TFT LCD테스트 프로그램 동영상

Posted by nexp

댓글을 달아 주세요

[DSP]/PICCOLO2011. 5. 4. 21:30

[TMS320F28069 EVM] ADC테스트 - TFT LCD에 VR값 표시

[TMS320F28069 EVM] ADC테스트 - TFT LCD에 VR값 표시



[TMS320F28069 EVM]에는 7개의 12비트 ADC를 할당해 두었다.
새로운 PICCOLO시리즈는 ADC쪽 기능이 향상되었다고 하는데.. 좀더 깊이 있는내용은 추후에 진행 하도록 하고 일단 기존 TMS320F2808 EVM예제를 포팅해서 간단한 테스트를 진행 해 보려고 한다.

TMS320F28069 ADC블록도



ADC부분은 기존 TMS320F2808 과 비교해 변화된 부분이 있으므로 수정이 필요하다. 레지스터명도 달라지고.. 구조 자체도 변경되었기 때문에 ADC.c 에 있는 초기화 함수를 수정해 주었다.

void AdcInit(void)
{
       InitAdc();

// Configure ADC
 EALLOW;
    AdcRegs.ADCCTL2.bit.ADCNONOVERLAP = 1; // Enable non-overlap mode
 AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1; //ADCINT1 trips after AdcResults latch
 AdcRegs.INTSEL1N2.bit.INT1E     = 1; //Enabled ADCINT1
 AdcRegs.INTSEL1N2.bit.INT1CONT  = 0; //Disable ADCINT1 Continuous mode
    AdcRegs.INTSEL1N2.bit.INT1SEL  = 1;    // setup EOC1 to trigger ADCINT1 to fire
    AdcRegs.ADCSOC0CTL.bit.CHSEL  = 4;    // set SOC0 channel select to ADCINA4
    AdcRegs.ADCSOC1CTL.bit.CHSEL  = 2;    // set SOC1 channel select to ADCINA2
    AdcRegs.ADCSOC0CTL.bit.TRIGSEL  = 5;    // set SOC0 start trigger on EPWM1A, due to round-robin SOC0 converts first then SOC1
    AdcRegs.ADCSOC1CTL.bit.TRIGSEL  = 5;    // set SOC1 start trigger on EPWM1A, due to round-robin SOC0 converts first then SOC1
 AdcRegs.ADCSOC0CTL.bit.ACQPS  = 6; //set SOC0 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
 AdcRegs.ADCSOC1CTL.bit.ACQPS  = 6; //set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
 EDIS;
}


ADC 읽기 함수
//Read ADC Value
unsigned int AdcRead(unsigned char Channel)
{
 AdcChanSelect(Channel);

 //Force start of conversion on SOC0
 AdcRegs.ADCSOCFRC1.all = 0x01;

 //Wait for end of conversion.
 while(AdcRegs.ADCINTFLG.bit.ADCINT1 == 0){}  //Wait for ADCINT1
 AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;        //Clear ADCINT1

    asm(" RPT #11 || NOP");
    return (AdcResult.ADCRESULT0);
}



TMS320F28069 EVM ADC테스트 동영상
[EXP-DSP EVM]  ADC0에 연결되어 있는 VR을 가변하여 ADC값을 측정하고 이값을 TFT-LCD에 출력하는  테스트를 해 보았다.



Posted by nexp

댓글을 달아 주세요

[DSP]/PICCOLO2011. 4. 30. 23:00

[TMS320F28069 EVM] SPI테스트 - 3축 가속도 센서 테스트

[TMS320F28069 EVM] SPI테스트 - 3축 가속도 센서 테스트


SPI테스트 하기에는 가속도센서를 이용하면 상당히 편리하다. 제어 자체도 간단하지만 API로 작성해 둔것이 있으므로 SPI 드라이버 부분과 /CS핀 설정만 하면 쉽게 SPI동작여부를 테스트 할 수 있다.

SPI구조는 TMS320F2808과 같은 구조이고 특별하게 변한것이 없고 코드 또한 동일하게 호환된다. 다만 FIFO가 16 level에서 4 level로 줄었다. 아무래도 가격때문이지 않을까...

[NET-EVM] 보드에서 가속도 센서의 CS는 CN7-P8에 연결되어 있으므로  [TMS320F28069 EVM] 보드에서는 CN6의 P8->GP20에 연결되어 있다.




TMS320F28069 SPI 가속도 센서 초기화 드라이버 코드
#define _SPI0_ENABLE     1

//-----------------------------------------------------------------------------
// myAccel3LV02 HAL
#define MY_ACCEL3LV02_SPI_MODE   1
#define MY_ACCEL3LV02_I2C_MODE   0

#define ACCEL_CS_BIT     BIT19
#define ACCEL_CS_PORT     

#define ACCEL_CS_ASSERT()    cbi(GPIOA_C, LCD_RS_BIT);NOP();
#define ACCEL_CS_DEASSERT()    sbi(GPIOA_S, LCD_RS_BIT);NOP();

#define ACCEL_CS_INIT()     EALLOW;\
          GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 0;\
          GpioCtrlRegs.GPADIR.bit.GPIO20 = 1;\
          EDIS;\
          ACCEL_CS_DEASSERT()
          
#define ACCEL_SPI_INIT()    SPI0_Init()
#define ACCEL_Read      SPI0_WriteReadByte
#define ACCEL_Write      SPI0_WriteReadByte
//-----------------------------------------------------------------------------


[EXP-DSP EVM]확장 보드의 SPI포트에 연결하기 위해 점퍼핀으로 연결 했다.



TMS320F28069 3축 가속도 센서 테스트 동영상




TMS320F28069 SPI테스트 소스코드
void main(void)
{
 short data = 1;
 unsigned int flag = 1;

 //DSP System Initialize
 SystemInit();

 Led1Init();
 Led1On();

 //시리얼 포트 초기화
 DebugInit(BAUD_115200);
 DebugPrint("TMS320F28069 EVM SPI Test(%d)Mhz\r\n", _SYS_CLK);

 //가속도 센서 LIS3LV02 초기화
 myAccel3lvInit();
 myAccel3lvWrite(CTRL_REG1, 0xD7);  //1000.0111 Power on, enable all axis, self test off

 while(1)
 {
  if(DebugIsByte())
  {
   switch(U0_GetByte())
   {
   case '0':
    Led1Off();
    DebugPrint("LED OFF\r\n");
    break;

   case '1':
    Led1On();
    DebugPrint("LED ON\r\n");   
    break;

   case 'h':
    DebugPrint("Device ID=%02X\r\n", myAccel3lvRead(WHO_AM_I));
    break;

   case 'r':
    GetAccelValue(AXIS_X, &data);
    DebugPrint("X=%d\r\n", data);
    break;
  }

  if(flag)
  {
   GetAccelValue(AXIS_X, &data);
   DebugPrint("%d\r\n", data);
   Delay(100);
  }
   
 }//end while
}




Posted by nexp

댓글을 달아 주세요