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 이다.
152페이지의 방대한 분량은 다루지 못하고, 의미하는바만 작성하도록 한다.
'Project > Balancing Robot' 카테고리의 다른 글
[초기화5] Init_SPI() (0) | 2014.07.23 |
---|---|
[초기화4] Init_SCIA(), Init_SCIB() (0) | 2014.07.23 |
[초기화2] Init_GPIO() (0) | 2014.07.23 |
[초기화1] DSP_Init() (0) | 2014.07.23 |
들어가면서 (0) | 2014.07.23 |