[DSP]/DSP283352011. 11. 11. 23:00

[DSP28335 EVM] 로터리 엔코더 테스트 - TMS320F28335 QEP

[DSP28335 EVM] 로터리 엔코더 테스트 - TMS320F28335  QEP


TMS320F28335는 2채널의 EQEP 모듈이 있어 엔코더를 쉽게 연결 할 수 있다.

[DSP28335 EVM] EQEP 핀맵







[EXP-ALL EVM] 보드를 이용하면 로터리 엔코더를 이용하여 간단히 TMS320F28335의 EQEP를 테스트 해 볼 수 있다.
로터리 엔코더는  EQEP 채널 1에 연결되어 있다.
GPIO50/EQEP1A <- GPIO0/EPWM1A (simulates EQEP Phase A signal)    
GPIO51/EQEP1B <- GPIO1/EPWM1B (simulates EQEP Phase B signal)    
GPIO23/EQEP1I <- GPIO4 (simulates EQEP Index Signal)


[EXP-ALL EVM]보드의 로터리 엔코더 회로도








TMS320F28355 QEP 테스트 동영상





TMS320F28335 EQEP 를 이용한 로터리 엔코더 테스트 소스코드
QEP 레지스터에서 로터리 엔코더 값을 읽어와 FND에 출력하는 예제 코드 이다. 테스트를 위해 최대 QEP값은 100으로 설정했다.
void main(void)
{
 unsigned long cnt = 0;
 unsigned long old_cnt = 0;

 //DSP System Initialize
 SystemInit();

 Led1Init();
 Led1On();

 DebugInit(BAUD_115200);
 DebugPrint("DSP28335 QEP Test\r\n");

//FND 초기화
 FndInit();
 FndOut(10);

  //QEP1 초기화
   InitQep1();

 while(1)
 {

   //QEP 데이터 카운트값 읽어와서
  cnt = EQep1Regs.QPOSLAT;

  if(old_cnt != cnt)
  {
   Led1Toggle();
   FndOut((unsigned char)cnt);
   DebugPrint("cnt=%ld\r\n", cnt);
  }

 old_cnt = cnt;
  Delay(1);
 }
}  



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 ]

[TI]/LM3S8xx2010. 9. 12. 09:44

[LM3S818 EVM] Encoder 테스트 - 무선(Bluetooth)으로 엔코더값 전송

[LM3S818 EVM] Encoder 테스트 - 무선(Bluetooth)으로 엔코더값 전송


LM3S818은 QEI모듈이 있기 때문에 엔코더값을 쉽게 측정 가능하다.
Bluetooth모듈을 이용하여 무선으로 실시간 엔코더값을 출력하는 테스트를 해 보았다.

Encoder 연결
Encoder은 1024펄스(E40S-1024)를 이용하였고 A, B상을 LM3S818의 PC4, PC6에 연결하였다.



Bluetooth 무선모듈/ USB2UART 모듈 연결
[LM3S818 EVM]은 SM-Type모듈로 USB2UART, Bluetooth 모듈 연결이 가능하다.
Bluetooth 모듈 연결



USB2UART 모듈 연결



PC호스트 프로그램
무선으로 전송받은 Encoder값을 PC에 표시하는 프로그램




[LM3S818 EVM]을 이용한 무선 Encoder 데이터 전송 테스트 동영상




Posted by nexp

댓글을 달아 주세요

[Microchip]/dsPIC33-SM2009. 6. 11. 18:41

[dsPIC MotorDriver] QEI 테스트

[dsPIC MotorDriver] QEI 테스트


 
dsPIC33은 PPS기능을 제공해 Pin map을 PRx 핀에 원하는 형태로 설정할 수 있다.
입력과 출력에따라 설정 방법은 다른데 UART의 경우  RPINR18에 입력 RP를 설정하면 된다.
 
//U1RX를 RP20에 입력으로 연결
RPINR18bits.U1RXR = 20;
 
//RP19를 U1TX에 연결
RPOR9bits.RP19R = 3;
 
 
PPS제어를 위해서는 UNLOCK_PPS() 해서 설정하고, 설정후에는 LOCK_PPS() 를 해 주어야 한다.
이 설정은 런타임시 한번만 가능한것 같다. <- 좀더 알아볼 필요가 있음.
그래서 config.h 에 핀맵 정의을 한번에 할수 있도록 했다.
 
 
dsPIC33  QEI블록도
16비트라 약간의 아쉬움은 있지만 나름 편리하고 상당히 간단하게 제어 가능하다



dsPIC QEI 타이밍도




QEI 엔코더 구조





//QEI모듈 초기화 함수
void initQEI(void)
{
 QEI1CONbits.QEIM  = 5; // QEI_MODE_x2_MATCH
 QEI1CONbits.SWPAB  = 0; // QEI_INPUTS_SWAP
 QEI1CONbits.QEISIDL = 1; // QEI_IDLE_STOP
 QEI1CONbits.POSRES = 0; // QEI_INDEX_RESET_DISABLE
 QEI1CONbits.PCDOUT = 0; // QEI_NORMAL_IO
 QEI1CONbits.POSRES = 0; // POS_CNT_ERR_INT_DISABLE
 QEI1CONbits.TQCS = 0;
 QEI1CONbits.UPDN_SRC = 1;
 
 DFLT1CONbits.QECK = 6; // QEI_QE_CLK_DIVIDE_1_128
 DFLT1CONbits.QEOUT = 0; // QEI_QE_OUT_ENABLE
 
 MAX1CNT = 0xFFFF;
 POS1CNT = 0;
}
 
 
dsPIC QEI테스트 결과 시리얼 출력
dsPIC33 EVM test Program.
QEI=0
QEI=2
QEI=4
QEI=6
QEI=6
QEI=8
QEI=10
QEI=14
QEI=20
QEI=22
QEI=26

diPIC33 QEI 테스트 동영상

Posted by nexp

댓글을 달아 주세요

[TI]/LM3S2xxx2009. 4. 13. 08:00

[LM3S2965] QEI 테스트

[LM3S2965] QEI 테스트


Lunminary Micro QEI특징
Position integrator that tracks the encoder position
Velocity capture using built-in timer
QEISPEED, QEIPOS레지스터가 각각 독립적으로 구동할 수 있다. (QEIPOS는 QEISPEED보다 먼저 Enable해야 함)

인터럽트 소스
- Index pulse
- Velocity-timer expiration
- Direction change
- Quadrature error detection





QEI모듈은   quadrature phase 모드와 clock/direction 모드를 지원한다.
quadrature phase모드
엔코더는 90도 위상을 가진 두개의 2개의 클럭을 생성한다. 각 에지를 이용해 회전 방향을 결정한다.

clock/direction 모드

엔코더는 클럭신호를 생성한다. direction 신호가 엔코더의 방향을 결정한다.
 
QEI Control (QEICTL) 레지스터의 SigMode bit비트로 모드를 설정할 수 있다.
Luminary 제공함수 QEIConfigure 함수로 설정 가능하다.
 
QEIConfigure(QEI0_BASE, QEI_CONFIG_QUADRATURE |QEI_CONFIG_CAPTURE_A, 1000);

QEI Control (QEICTL)
#define QEI_CONFIG_CAPTURE_A    0x00000000  // Count on ChA edges only
#define QEI_CONFIG_CAPTURE_A_B  0x00000008  // Count on ChA and ChB edges
#define QEI_CONFIG_NO_RESET     0x00000000  // Do not reset on index pulse
#define QEI_CONFIG_RESET_IDX    0x00000010  // Reset position on index pulse
#define QEI_CONFIG_QUADRATURE    0x00000000  // ChA and ChB are quadrature
#define QEI_CONFIG_CLOCK_DIR    0x00000004  // ChA and ChB are clock and dir
#define QEI_CONFIG_NO_SWAP      0x00000000  // Do not swap ChA and ChB
#define QEI_CONFIG_SWAP         0x00000002  // Swap ChA and ChB
 
PhA의 에지(혹은 PhA, PhB두 에지)에서 QEIPOS레지스터 값을 업데이트 한다.
PhA후 PhB가 오는 정방향일 경우 QEIPOS값은 증가되고 PhB후 PhA가 오는 역방향일 경우 QEIPOS값은 감소된다.

QEI 타이밍도



QEI 초기화 함수
static void InitQEI(void)
{
   //Set Clock
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOH);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_QEI);
   
    // Configure the QEI pins.
    GPIOPinTypeQEI(QEI_PHA_PORT, QEI_PHA_PIN);
    GPIOPinTypeQEI(QEI_PHB_PORT, QEI_PHB_PIN);
    GPIOPinTypeQEI(QEI_IDX_PORT, QEI_IDX_PIN);
 
    // Configure the QEI module.
    QEIConfigure(QEI0_BASE, QEI_CONFIG_QUADRATURE|QEI_CONFIG_CAPTURE_A, 1000);
   
    // Initialize the QEI position to zero.
    QEIPositionSet(QEI0_BASE, 0);
    // Enable the QEI module.
    QEIEnable(QEI0_BASE);
}

QEI POS값 출력
각 Edge마다 1씩 증가 하므로 엔코더 1클릭당 2펄스씩 증가한다.
   pos = QEIPositionGet(QEI0_BASE);
   dir = QEIDirectionGet(QEI0_BASE);
   DebugPrint("pos=%d %ld\r\n", dir, pos);

출력결과
pos=-1 262
pos=-1 266
pos=-1 265
pos=-1 264
pos=-1 264
pos=-1 262


Motor Driver 보드의 LM3S2965 QEI핀맵



QEI1 모듈 사용할때 주의 사항
QEI SysCtlPeripheralEnable() 함수를 호출하지 않으면 홀딩되는 현상이 발생한다. <- QEI인자 확인할것
    //----------------------------------------------------------------------------- 
    //QEI 1 Config

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOH);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_QEI1); 
 
    // Configure the QEI pins.
    GPIOPinTypeQEI(QEI1_PHA_PORT, QEI1_PHA_PIN);
    GPIOPinTypeQEI(QEI1_PHB_PORT, QEI1_PHB_PIN);
    GPIOPinTypeQEI(QEI1_IDX_PORT, QEI1_IDX_PIN);
 
    // Configure the QEI module.
    QEIConfigure(QEI1_BASE, QEI_CONFIG_QUADRATURE | QEI_CONFIG_CAPTURE_A, 0xffffffff);//ENCODER_MAX_POS); 
    // Initialize the QEI position to zero.
    QEIPositionSet(QEI1_BASE, 0);
    // Enable the QEI module.
    QEIEnable(QEI1_BASE);
    //----------------------------------------------------------------------------- 
Posted by nexp

댓글을 달아 주세요