[ LM3S2965 EXP ] CAN통신을 이용한 모터 PID 제어 테스트




PC프로그램 - PID값 설정에 따른 위치 추의값을 실시간으로출력






DC MotorDriver Module 보드 제작 - dsPIC33FJ128MC802 (VNH2SP30 Motor Driver)



가격 저렴하고 소형의 dsPIC33FJ128MC802 를 이용하여 200W급 DC모터 드라이버 모듈을 제작했다.



인터페이스로 CAN, UART가 가능하고 QEI가 있어 엔코더를 연결할 수 있다.

[dsPIC MotorDriver] PID제어 PC프로그램 작성



PC에서 PID값을 설정 및 위치를 제어하고 엔코더 값을 읽어올 수 있는 프로그램 작성



dsPIC33 PID 제어 테스트 동영상

[dsPIC MotorDriver] QEI 테스트

[Microchip]/dsPIC33-SM | 2009.06.11 18:41
Posted by nexp
[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 테스트 동영상

[dsPIC33 MotorDriver] 타이머 인터럽트 테스트
모터 제어기가 수행될 타이머 인터럽트는 가장 기본 사항이 될것같다. 일반적으로 사용되는 제어 주기인 1ms로 설정해 테스트

dsPIC의 타이머 인터럽트는 상당히 간단하다. 먼저 인터럽트 초기화 하고 클럭 소스의 설정을 위해 TCS비트를 설정하는데 0이면 내부 Tcy를 선택한다. Tcy는 Fosc/2 이므로 80Mhz/2 인 40Mhz가 된다. 그리고 이 클럭소스를 TCKPS비트 설정으로 1/8/64/256 으로 분주 할 수 있다.
타이머 인터럽트 PR1 레지스터 값과 일치할때 발생한다.

dsPIC Timer 블록도



1ms 주기로 인터럽트 생성하기 하기 위한 PR1값 설정은 625이다. 계산법은 아래와 같다.
40Mhz / 64 = 625000Hz -> 1.6us
1ms = 1000us => 1000us/1.6us = 625


dsPIC Timer1 초기화 함수
void Init_Timer1( void )
{
 //타이머1 인터럽트 세팅
 IFS0bits.T1IF = 0;  //타이머1 인터럽트 플래그 초기화
 IPC0bits.T1IP = 4;  //타이머1 인터럽트 우선순위 레벨4로 설정(디폴트값임)
 IEC0bits.T1IE = 1;  //타이머1 인터럽트 동작 모드로 설정
 
 //타이머1 설정
 T1CONbits.TCS = 0;  //내부 클럭 소스 사용( Fosc / 2 = Tcy)

 T1CONbits.TCKPS1 = 1; //프리스케일러 분주비 64:1,TCKPS<1:0> = 10
 T1CONbits.TCKPS0 = 0;  

 T1CONbits.TSYNC = 0; //외부 클럭 소스와 동기화 금지
 
 // 256:1 , 1m 카운팅 값 설정
 PR1 = 625;  

 //타이머1 동작 스타트(T1CONbits.TON = 1)
 T1CONbits.TON = 1;
}

인터럽트 핸들러
void __attribute__((__interrupt__)) _T1Interrupt(void)
{
  // reset Timer 1 interrupt flag
  IFS0bits.T1IF = 0;
 
   m_TimerTick1++;
   return;
}

[dsPIC33 Motor Driver] DC모터 드라이버 보드 제작



dsPIC33FxMC 를 이용하여 제작한 모터 드라이버용으로 테스트 실험 내용을 기록할 계획임


dsPIC33F202모듈
사용자 삽입 이미지


1


테스트할 모터

[LM3S2965] 모터제어 - PID제어 테스트



Luminary Cortex-M3 LM3S2965 Motor Driver Test보드를 이용하여 PID제어 테스트를 진행했다.

홀센서 엔코더 결선도


테스트 동영상

[LM3S2965] QEI 테스트

[TI]/LM3S2xxx | 2009.04.13 08:00
Posted by nexp
[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);
    //----------------------------------------------------------------------------- 
[VNH2SP30] - 41V 30A 모터 드라이버 보드 제작



ST사의 DC모터 드라이버 VNH2SP30 모듈 보드를 제작했다.






[LM3S2965] 모터 드라이버 보드 테스트 - 모터 정역, PWM 테스트



LuminaryMicro사의 LM3S2965를 이용하여 모터 드라이버 보드 제어 테스트를 진행 했다.
드라이버 스펙상 30A까지 가능하다고 하는데.. 부하를 걸어봐야 알겠지만 일단 간단한 모터 제어먼저 시작.


Pinmap

INA1 – PB.4

INB1 – PB.5

PWM1 – PG.2(pwm : 10Khz)


테스트 동영상
PWM 으로 모터 속도 제어 및 정역제어 테스트




Mobie Robot Body Test

")//]]>


블로그 이미지

nexp

카테고리

분류 전체보기 (1560)
[MyProject] (48)
[TI] (75)
[NXP] (51)
[ST_MICRO] (129)
[FreeScale] (31)
[MSP430] (140)
[Microchip] (131)
Cortex-M (36)
[ATMEL] (29)
[AnalogDevice] (22)
[Embedded] (2)
ARM9 (24)
[AVR] (80)
[DSP] (111)
[8051] (21)
[MCU] (50)
[INTERFACE] (213)
[AppBoard] (23)
[ROBOT] (25)
[MODULE] (129)
[SENSOR] (41)
[DATA] (21)
[FPGA] (32)
[EVB] (1)
[Proramming] (38)
[MyLog] (6)
[IDEA] (0)
[Utility] (19)
[Book] (24)
취미생활 (4)
[Link] (2)