Project/Balancing Robot

[초기화3] Init_EVA(), Init_EVB()

십자성군 2014. 7. 23. 14:50

void Init_EVA()
{


 // PWM Operation
 // Setup TxPR according to the desired PWM(carrier) period
 // Setup TxCON to specify the counting mode and clock source, and start the operation
 // Load TxCMPR with values corresponding to the on-line calculated widths (duty cycles) of PWM pulses
 // GP Timer counting operation은 4가지가 있다 SPRU065의 1.4.17 참조
 // stop/hold mode, 연속 업 카운팅 모드, 방향성 업 다운 카운팅 모드, 연속 업 다운 카운팅 모드
 // 아래는 연속 업 카운팅 모드를 사용하여 비대칭 PWM을 생성한다.

 

 EvaRegs.T1PR = 1500 ; //75kHz

 EvaRegs.T2PR = 0xffff ;

:GP Timer Period Register

 EvaRegs.T1CMPR = 0x7fff ;

 EvaRegs.T2CMPR = 0xffff ;

:GP Timer Compare Register


 EvaRegs.CMPR1 = 0x0000 ;
 EvaRegs.CMPR2 = 0x0000 ;
 EvaRegs.CMPR3 = 0x0000 ;

:Compare Register

 

 EvaRegs.T2CNT = 0x0000 ;
 EvaRegs.T1CNT = 0x0000 ;

:GP Timer Counter Register


 EvaRegs.T1CON.bit.TMODE = 0x02 ; // 연속 업 카운트
 EvaRegs.T1CON.bit.TPS = 0x00 ;   // HSPCLK / 1
 EvaRegs.T1CON.bit.TENABLE = 0x00 ; // T1 동작 정?
 EvaRegs.T1CON.bit.TCLKS10 = 0x00 ; // 내부클럭 HSPCLK사용
 EvaRegs.T1CON.bit.TCLD10 = 0x00 ; // Timer compare register reload시점을 counter이 0일때 갱신
 EvaRegs.T1CON.bit.TECMPR = 0x01 ; // Timer compare enable

:GP Timer1 Control Register.

 

 EvaRegs.T2CON.bit.TMODE = 0x03 ;
 EvaRegs.T2CON.bit.TPS = 0x00 ;
 EvaRegs.T2CON.bit.T2SWT1 = 0x00 ; // Timer2의 동작의 start/stop Timer1의 TENABLE에 따름
 EvaRegs.T2CON.bit.TCLKS10 = 0x03 ;  // QEP
 EvaRegs.T2CON.bit.TCLD10 = 0x00 ;
 EvaRegs.T2CON.bit.TECMPR = 0x01 ;
 EvaRegs.T2CON.bit.SET1PR = 0x00 ; // Timer2?period를 Timer1의 것을 사용
 EvaRegs.T2CON.bit.TENABLE = 0x01 ;

 

 EvaRegs.EVAIFRA.all = 0x0000 ;

:Interrupt Flag Register A
 EvaRegs.EVAIMRA.bit.PDPINTA = 0 ;

:Interrupt Mask Register A

 

 EvaRegs.GPTCONA.bit.T2CTRIPE = 0x00 ; // T2CTRIP disable
 EvaRegs.GPTCONA.bit.T1CTRIPE = 0x00 ; // T1CTRIP disable

 // T2CTRIP, T1CTRIP가 enable 되어 있을경우 PWM 출력중 TxCTRIP핀이 low가 되면
 // 해당 PWM 출력핀의 출력이 Hi-Z가 된다.
 EvaRegs.GPTCONA.bit.T2TOADC = 0x00 ; // ADC 이벤트 사용안함
 EvaRegs.GPTCONA.bit.T1TOADC = 0x00 ;
 // Timerx의 underflow, period match, compare match시 ADC의 start trigger로 사용할수 있음
 EvaRegs.GPTCONA.bit.TCMPOE = 0x01 ;  // TxPWM_TxCMP 출력 사용
 EvaRegs.GPTCONA.bit.T2CMPOE = 0x01 ;
 EvaRegs.GPTCONA.bit.T1CMPOE = 0x01 ;
 // reserved (EXTCONA bit 0 참조)
 EvaRegs.GPTCONA.bit.T2PIN = 0x02 ; // Active High
 EvaRegs.GPTCONA.bit.T1PIN = 0x01 ; // Active Low
 // Compare match가 발생했을때 Active High(Low -> High 로 천이)
 // Active Low는 High->Low로 천이
 // Forced Low(High)는 강제로 선택된 Low(High)로 유지

:GP Timer Control Register A

 

 EvaRegs.COMCONA.bit.CENABLE = 0x01 ; // Full Compare logic 사용
 EvaRegs.COMCONA.bit.CLD = 0x00 ;
 EvaRegs.COMCONA.bit.SVENABLE = 0x00 ;
 EvaRegs.COMCONA.bit.ACTRLD = 0x00 ;
 EvaRegs.COMCONA.bit.FCOMPOE = 0x01 ;  // PWM 1/2/3/4/5/6 출력 사용
 EvaRegs.COMCONA.bit.FCMP3OE = 0x00 ;
 EvaRegs.COMCONA.bit.FCMP2OE = 0x00 ;
 EvaRegs.COMCONA.bit.FCMP1OE = 0x00 ;

:Compare Control Register
 // reserved (EXTCONA bit 0 참조)

/*
 EvaRegs.ACTRA.bit.CMP6ACT = 0x01 ;
 EvaRegs.ACTRA.bit.CMP5ACT = 0x01 ;
 EvaRegs.ACTRA.bit.CMP4ACT = 0x01 ;
 EvaRegs.ACTRA.bit.CMP3ACT = 0x01 ;
 EvaRegs.ACTRA.bit.CMP2ACT = 0x01 ;
 EvaRegs.ACTRA.bit.CMP1ACT = 0x01 ;
 // PWM1 - 6 = Active Low
*/


 EvaRegs.ACTRA.all = 0x0555 ;
 // *****************************************************
 // ACTRA Register은 bit단위로 설정을 하면 동작하지 않음.
 // *****************************************************

:Compare Action Control Register

 

 EvaRegs.CAPCONA.bit.CAPRES = 0 ;

:Capture Control Register
 asm(" RPT #12 || nop ") ;   // Reset는 3 ADC_CLK 지연이 발생한다.

 

 EvaRegs.DBTCONA.bit.DBT = 0x08 ; // Dadeband 8 * (x/8) clock
 EvaRegs.DBTCONA.bit.EDBT3 = 0x00 ;
 EvaRegs.DBTCONA.bit.EDBT2 = 0x00 ;
 EvaRegs.DBTCONA.bit.EDBT1 = 0x00 ;
 // Dadeband enable
 EvaRegs.DBTCONA.bit.DBTPS = 0x03 ; // Dadebank timer x/8

:Dead-Band Timer Control Register A

 

 EvaRegs.EXTCONA.bit.EVSOCE = 0x00 ; // EVSOC output disable
 EvaRegs.EXTCONA.bit.QEPIE = 0x00 ; // 코더 입력용 QEP index disable
 EvaRegs.EXTCONA.bit.QEPIQUAL = 0x00 ; // Qualification mode disable
 EvaRegs.EXTCONA.bit.INDCOE = 0x00 ; // compare output mode 개별설정 disable

:GP Extension Control Register A

 

 EvaRegs.T1CON.bit.TENABLE = 0x01 ; // Timer1 and 2 start


}

 

void Init_EVB()
{


 // PWM Operation
 // Setup TxPR according to the desired PWM(carrier) period
 // Setup TxCON to specify the counting mode and clock source, and start the operation
 // Load TxCMPR with values corresponding to the on-line calculated widths (duty cycles) of PWM pulses
 // GP Timer counting operation은 4가지가 있다 SPRU065의 1.4.17 참조
 // stop/hold mode, 연속 업 카운팅 모드, 방향성 업 다운 카운팅 모드, 연속 업 다운 카운팅 모드
 // 아래는 연속 업 카운팅 모드를 사용하여 비대칭 PWM을 생성한다.

 

 EvbRegs.T3PR = 1500 ; // 75MHz / 3000 = 25KHz
 EvbRegs.T4PR = 0xffff ;
 EvbRegs.T3CMPR = 0x7fff ;
 EvbRegs.T4CMPR = 0xffff ;
 EvbRegs.T3CNT = 0x0000 ;
 EvbRegs.T4CNT = 0x0000 ;
 EvbRegs.CMPR4 = 0 ;
 EvbRegs.CMPR5 = 0 ;
 EvbRegs.CMPR6 = 0x7fff ;

 

 EvbRegs.T3CON.bit.TMODE = 0x02 ; // 연속 ?카운트
 EvbRegs.T3CON.bit.TPS = 0x00 ;   // HSPCLK / 128 = 585937.5Hz
 EvbRegs.T3CON.bit.TENABLE = 0x00 ; // T1 동작 정지
 EvbRegs.T3CON.bit.TCLKS10 = 0x00 ; // 내부클럭 HSPCLK사?
 EvbRegs.T3CON.bit.TCLD10 = 0x00 ; // Timer compare register reload시점을 counter이 0일때 갱신
 EvbRegs.T3CON.bit.TECMPR = 0x01 ; // Timer compare disable

 

 EvbRegs.T4CON.bit.TMODE = 0x03 ;
 EvbRegs.T4CON.bit.TPS = 0x00 ;
 EvbRegs.T4CON.bit.T4SWT3 = 0x00 ; // Timer2의 동작의 start/stop을 Timer1의 TENABLE에 따름
 EvbRegs.T4CON.bit.TCLKS10 = 0x03 ;
 EvbRegs.T4CON.bit.TCLD10 = 0x00 ;
 EvbRegs.T4CON.bit.TECMPR = 0x01 ;
 EvbRegs.T4CON.bit.SET3PR = 0x00 ; // Timer2의 period를 Timer1의 것을 사용
 EvbRegs.T4CON.bit.TENABLE = 0x01 ;

 

 EvbRegs.EVBIFRA.all = 0x0000 ;
 EvbRegs.EVBIMRA.bit.PDPINTB = 0 ;

 

 EvbRegs.GPTCONB.bit.T4CTRIPE = 0x00 ; // T2CTRIP disable
 EvbRegs.GPTCONB.bit.T3CTRIPE = 0x00 ; // T1CTRIP disable
 // T2CTRIP, T1CTRIP가 enable 되어 있을경우 PWM 력?TxCTRIP핀이 low가 되면
 // 당 PWM 출력핀의 출력이 Hi-Z가 된다.
 EvbRegs.GPTCONB.bit.T4TOADC = 0x00 ; // ADC 이벤트 사용안함
 EvbRegs.GPTCONB.bit.T3TOADC = 0x00 ;
 // Timerx의 underflow, period match, compare match시 ADC의 start trigger로 사용할수 있음
 EvbRegs.GPTCONB.bit.TCMPOE = 0x01 ;  // TxPWM_TxCMP ?사용
 EvbRegs.GPTCONB.bit.T4CMPOE = 0x01 ;
 EvbRegs.GPTCONB.bit.T3CMPOE = 0x01 ;
 // reserved (EXTCONA bit 0 참조)
 EvbRegs.GPTCONB.bit.T4PIN = 0x02 ; // Active High
 EvbRegs.GPTCONB.bit.T3PIN = 0x01 ; // Active Low
 // Compare match가 발생했을때 Active High(Low -> High 로 천이)
 // Active Low는 High->Low로 천?
 // Forced Low(High)는 강제로 선택된 Low(High)로 유지

 

 EvbRegs.COMCONB.bit.CENABLE = 0x01 ; // Full Compare logic nonuse
 EvbRegs.COMCONB.bit.CLD = 0x00 ;
 EvbRegs.COMCONB.bit.SVENABLE = 0x00 ;
 EvbRegs.COMCONB.bit.ACTRLD = 0x00 ;
 EvbRegs.COMCONB.bit.FCOMPOE = 0x01 ;
 EvbRegs.COMCONB.bit.FCMP6OE = 0x00 ;
 EvbRegs.COMCONB.bit.FCMP5OE = 0x00 ;
 EvbRegs.COMCONB.bit.FCMP4OE = 0x00 ;
 // reserved (EXTCONA bit 0 참조)

/*
 EvaRegs.ACTRA.bit.CMP6ACT = 0x01 ;
 EvaRegs.ACTRA.bit.CMP5ACT = 0x01 ;
 EvaRegs.ACTRA.bit.CMP4ACT = 0x01 ;
 EvaRegs.ACTRA.bit.CMP3ACT = 0x01 ;
 EvaRegs.ACTRA.bit.CMP2ACT = 0x01 ;
 EvaRegs.ACTRA.bit.CMP1ACT = 0x01 ;
 // PWM1 - 6 = Active Low
*/
 EvbRegs.ACTRB.all = 0x0555 ;


 // *****************************************************
 // ACTRA Register은 bit단위로 설정을 하면 동작하지 않음.
 // *****************************************************

 EvbRegs.DBTCONB.bit.DBT = 0x08 ; // Dadeband 8 * (x/8) clock
 EvbRegs.DBTCONB.bit.EDBT3 = 0x00 ;
 EvbRegs.DBTCONB.bit.EDBT2 = 0x00 ;
 EvbRegs.DBTCONB.bit.EDBT1 = 0x00 ;
 // Dadeband enable
 EvbRegs.DBTCONB.bit.DBTPS = 0x03 ; // Dadebank timer x/8

 

 EvbRegs.EXTCONB.bit.EVSOCE = 0x00 ; // EVSOC output disable
 EvbRegs.EXTCONB.bit.QEPIE = 0x00 ; // 엔코더 입력?QEP index disable
 EvbRegs.EXTCONB.bit.QEPIQUAL = 0x00 ; // Qualification mode disable
 EvbRegs.EXTCONB.bit.INDCOE = 0x00 ; // compare output mode 개별설정 disable

 

 EvbRegs.T3CON.bit.TENABLE = 0x01 ; // Timer1 and 2 start


}

 

----------------------------------------------------------------------------------------------------------

DataSheet의 58p,

4.2 Event Manager Modules(EVA, EVB)를 참고한다

 

 

위의 표에서 알 수 있듯이 EMM은 아래와 같은 항목을 포함한다

- GP(general-purpose) timer

- Full-compare/PWM units

- Capture units

- Quadrature-encoder pulse circuits

 

EVA, EVB, compare units, capture units 는 독립적으로 동작한다.

 

EVA의 레지스터는 아래와 같다.

 

 

아래는 function block 이다

 

 

----------------------------------------------------------------------------------------------------------

<코드분석과 설명>

GPx x=1,2는 EVA에 대한 것이며, x=3,4는 EVB에 대한 것이다.

참고문서를 올려놓는다. 출처는 Texas Instrument 이다.

Even manager reference.pdf

 

152페이지의 방대한 분량은 다루지 못하고, 의미하는바만 작성하도록 한다.