'Project/Balancing Robot'에 해당되는 글 9건

  1. 2014.07.27 엔코더와 풀업, 전압분배
  2. 2014.07.23 실습코드 해석. 순서
  3. 2014.07.23 [초기화6] Init_ADC()
  4. 2014.07.23 [초기화5] Init_SPI()
  5. 2014.07.23 [초기화4] Init_SCIA(), Init_SCIB()
  6. 2014.07.23 [초기화3] Init_EVA(), Init_EVB()
  7. 2014.07.23 [초기화2] Init_GPIO()
  8. 2014.07.23 [초기화1] DSP_Init()
  9. 2014.07.23 들어가면서
Project/Balancing Robot2014. 7. 27. 23:13

엔코더를 사용할 때, 풀업을 해주어야 한다. 이와 관련해서 설명하고자 한다.

 

 

 

위의 그림을 보면 A와 B상의 output이 저항을 건너 MCU의 Input에 연결되어 있다.

아래는 이에 대한 설명이다(맞는지 모르겠다. 틀린곳이 있다면 설명 바랍니다. 회로쪽은 잘 몰라서...)

 

 

내가 이해를 잘 못했을지도 모르겠고 나중에 다시 물어봐서 수정해야 겠다.

 

 

일단, 엔코더를 사용할 때는, 엔코더에 넣어주는 전원은 MCU와는 따로 사용해 준다.

엔고더의 센서에서 나오는 전류값은 낮다. 저항을 통해 센서와 입력부 사이에 DC 5V전원을 연결해 주었을 때, 센서가 High 상태이면 전원부의 전류는 입력으로 흐를것이고 OFF상태이면 센서로 흐를것이다.




 

 

'Project > Balancing Robot' 카테고리의 다른 글

실습코드 해석. 순서  (0) 2014.07.23
[초기화6] Init_ADC()  (0) 2014.07.23
[초기화5] Init_SPI()  (0) 2014.07.23
[초기화4] Init_SCIA(), Init_SCIB()  (0) 2014.07.23
[초기화3] Init_EVA(), Init_EVB()  (0) 2014.07.23
Posted by 십자성군
Project/Balancing Robot2014. 7. 23. 19:15

 

 

 

'Project > Balancing Robot' 카테고리의 다른 글

엔코더와 풀업, 전압분배  (0) 2014.07.27
[초기화6] Init_ADC()  (0) 2014.07.23
[초기화5] Init_SPI()  (0) 2014.07.23
[초기화4] Init_SCIA(), Init_SCIB()  (0) 2014.07.23
[초기화3] Init_EVA(), Init_EVB()  (0) 2014.07.23
Posted by 십자성군
Project/Balancing Robot2014. 7. 23. 14:53

void Init_ADC()
{


// AdcRegs.ADCTRL1.bit.RESET = 1 ;  // Adc module Reset
// asm(" RPT #12 || nop ") ;   // Reset는 3 ADC_CLK 지연이 발생한다.
          // 현재 ADC_CLK으로
 InitAdc();

 // ADC 설정
 AdcRegs.ADCTRL3.bit.ADCCLKPS = 15;     // ADCCLKPS = HSPCLK / 30 (ADCCLKPS = 2.5MHz)
 AdcRegs.ADCTRL1.bit.CPS = 1;   // ADCCLK = ADCCLKPS / 2 (ADC의 구동 클럭을 결정 : ADCCLK = 1.25MHz)
 AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;  // 시퀀스 직렬 모드
 AdcRegs.ADCTRL1.bit.ACQ_PS = 7 ;  // 샘플링 윈도우 size를 8 ADC_CLK 설정
// AdcRegs.ADCMAXCONV.all = 0x0002;       // ADC??개수 설정 : 모두 2개 ADC를 변환
 AdcRegs.ADCMAXCONV.all = 0x0004;
 AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0;  // Murata [ Gyro ]
 AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 1; // SA1 [ Tilt ] 4
// AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 2; // Z [ Accelerometer ]
// AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 3; // Y [ Accelerometer ]
// AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 8; // X [ Accelerometer ]
// AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 5; // SCA10T [ Tilt ] 5

// AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 2;
 AdcRegs.ADCTRL1.bit.CONT_RUN = 1;    // Cont. conv. mode
 AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1;  // 시퀀스 시작


}

'Project > Balancing Robot' 카테고리의 다른 글

엔코더와 풀업, 전압분배  (0) 2014.07.27
실습코드 해석. 순서  (0) 2014.07.23
[초기화5] Init_SPI()  (0) 2014.07.23
[초기화4] Init_SCIA(), Init_SCIB()  (0) 2014.07.23
[초기화3] Init_EVA(), Init_EVB()  (0) 2014.07.23
Posted by 십자성군
Project/Balancing Robot2014. 7. 23. 14:52

void Init_SPI()
{


 SpiaRegs.SPICCR.bit.CLKPOLARITY =0;
 SpiaRegs.SPICTL.bit.CLK_PHASE =0;

 SpiaRegs.SPICCR.bit.SPISWRESET =0;
 asm(" RPT #10 || nop ") ;
 SpiaRegs.SPICCR.bit.CLKPOLARITY =0;
 SpiaRegs.SPICCR.bit.SPILBK =0;
 SpiaRegs.SPICCR.bit.SPICHAR = 0xff;
 SpiaRegs.SPICCR.bit.SPISWRESET =1;

 SpiaRegs.SPICTL.bit.SPIINTENA =0;   //master,slave 선택
 SpiaRegs.SPICTL.bit.TALK =1;    //spi활성화
 SpiaRegs.SPICTL.bit.MASTER_SLAVE =1;
 SpiaRegs.SPICTL.bit.CLK_PHASE =0;
 SpiaRegs.SPICTL.bit.OVERRUNINTENA=0;
 SpiaRegs.SPICTL.bit.SPIINTENA =0;

 SpiaRegs.SPIPRI.bit.FREE = 1;
 SpiaRegs.SPIBRR = 7 ;

 

}

 

'Project > Balancing Robot' 카테고리의 다른 글

실습코드 해석. 순서  (0) 2014.07.23
[초기화6] Init_ADC()  (0) 2014.07.23
[초기화4] Init_SCIA(), Init_SCIB()  (0) 2014.07.23
[초기화3] Init_EVA(), Init_EVB()  (0) 2014.07.23
[초기화2] Init_GPIO()  (0) 2014.07.23
Posted by 십자성군
Project/Balancing Robot2014. 7. 23. 14:51

void Init_SCIA()
{


 SciaRegs.SCICCR.bit.STOPBITS = 0 ;  // One Stop bit
 SciaRegs.SCICCR.bit.PARITY = 0 ;  // Odd parity(ignored)
 SciaRegs.SCICCR.bit.PARITYENA = 0 ;  // Parity disable
 SciaRegs.SCICCR.bit.LOOPBKENA = 0 ;  // loop back mode disable
 SciaRegs.SCICCR.bit.ADDRIDLE_MODE = 0 ; // Idle-line mode (normal)
 SciaRegs.SCICCR.bit.SCICHAR = 0x07 ; // SCI char-length 8 bit

 SciaRegs.SCICTL1.bit.RXERRINTENA = 1 ; // SCI receive error interrupt disable
 SciaRegs.SCICTL1.bit.SWRESET = 0 ;  // SCI module reset
 asm(" RPT #10 || nop ") ;
 SciaRegs.SCICTL1.bit.SWRESET = 1 ;  // SCI mdoule reset release
 SciaRegs.SCICTL1.bit.TXWAKE = 0 ;  // SCI transmitter wake-up method (non use)
 SciaRegs.SCICTL1.bit.SLEEP = 0 ;  // SCI sleep mode non use
 SciaRegs.SCICTL1.bit.TXENA = 1 ;  // SCI transmitter enable
 SciaRegs.SCICTL1.bit.RXENA = 1 ;  // SCI receiver enable

// SciaRegs.SCIHBAUD = 0x01 ;    // ( 37.5M / (9600 * 8) ) - 1 = 0x01e7
// SciaRegs.SCILBAUD = 0xe7 ;
 SciaRegs.SCIHBAUD = 0x00 ;    // ( 37.5M / (38400 * 8 ) - 1 = 0x0079
 SciaRegs.SCILBAUD = 0x79 ;
// SciaRegs.SCIHBAUD = 0x00 ;    // ( 37.5M / (57600 * 8) ) - 1 = 0x0050
// SciaRegs.SCILBAUD = 0x50 ;

 SciaRegs.SCICTL2.bit.RXBKINTENA = 1 ; // Receive buffer or break interrup enable
 SciaRegs.SCICTL2.bit.TXINTENA = 1 ;  // SCITXBUF-register interrupt enable

 SciaRegs.SCIFFTX.bit.SCIRST = 1 ;  // SCI FIFO can resume transmit or receive
 SciaRegs.SCIFFTX.bit.SCIFFENA = 0 ;  // SCI FIFO enhancements are enable
 SciaRegs.SCIFFTX.bit.TXFIFOXRESET = 0 ; // Transmitter FIFO Re-Enable (FIFO Point to zero reset)
 SciaRegs.SCIFFTX.bit.TXFFIENA = 0 ;  // Transmitter FIFO Interrupt enable
 SciaRegs.SCIFFTX.bit.TXFFILIL = 0 ;  // Transmitter FIFO deep level (5)

 SciaRegs.SCIFFRX.bit.RXFIFORESET = 0 ; // Receive FIFO Re-Enable
 SciaRegs.SCIFFRX.bit.RXFFIENA = 0 ;  // Receive FIFO Interrupt Enable
 SciaRegs.SCIFFRX.bit.RXFIFST = 4;       // RX FIFO 4개로 함
 SciaRegs.SCIFFRX.bit.RXFFIL = 0 ;  // Receive FIFO deep level (5)

 

}

 

void Init_SCIB()
{


 ScibRegs.SCICCR.bit.STOPBITS = 0 ;  // One Stop bit
 ScibRegs.SCICCR.bit.PARITY = 0 ;  // Odd parity(ignored)
 ScibRegs.SCICCR.bit.PARITYENA = 0 ;  // Parity disable
 ScibRegs.SCICCR.bit.LOOPBKENA = 0 ;  // loop back mode disable
 ScibRegs.SCICCR.bit.ADDRIDLE_MODE = 0 ; // Idle-line mode (normal)
 ScibRegs.SCICCR.bit.SCICHAR = 0x07 ; // SCI char-length 8 bit

 ScibRegs.SCICTL1.bit.RXERRINTENA = 1 ; // SCI receive error interrupt disable
 ScibRegs.SCICTL1.bit.SWRESET = 0 ;  // SCI module reset
 asm(" RPT #10 || nop ") ;
 ScibRegs.SCICTL1.bit.SWRESET = 1 ;  // SCI mdoule reset release
 ScibRegs.SCICTL1.bit.TXWAKE = 0 ;  // SCI transmitter wake-up method (non use)
 ScibRegs.SCICTL1.bit.SLEEP = 0 ;  // SCI sleep mode non use
 ScibRegs.SCICTL1.bit.TXENA = 1 ;  // SCI transmitter enable
 ScibRegs.SCICTL1.bit.RXENA = 1 ;  // SCI receiver enable

// ScibRegs.SCIHBAUD = 0x01 ;    // ( 37.5M / (9600 * 8) ) - 1 = 0x01e7
// ScibRegs.SCILBAUD = 0xe7 ;
 ScibRegs.SCIHBAUD = 0x00 ;    // ( 37.5M / (38400 * 8 ) - 1 = 0x0079
 ScibRegs.SCILBAUD = 0x79 ;
// ScibRegs.SCIHBAUD = 0x00 ;    // ( 37.5M / (57600 * 8) ) - 1 = 0x0050
// ScibRegs.SCILBAUD = 0x50 ;

 ScibRegs.SCICTL2.bit.RXBKINTENA = 1 ; // Receive buffer or break interrup enable
 ScibRegs.SCICTL2.bit.TXINTENA = 1 ;  // SCITXBUF-register interrupt enable

 ScibRegs.SCIFFTX.bit.SCIRST = 1 ;  // SCI FIFO can resume transmit or receive
 ScibRegs.SCIFFTX.bit.SCIFFENA = 0 ;  // SCI FIFO enhancements are enable
 ScibRegs.SCIFFTX.bit.TXFIFOXRESET = 0 ; // Transmitter FIFO Re-Enable (FIFO Point to zero reset)
 ScibRegs.SCIFFTX.bit.TXFFIENA = 0 ;  // Transmitter FIFO Interrupt enable
 ScibRegs.SCIFFTX.bit.TXFFILIL = 0 ;  // Transmitter FIFO deep level (5)

 ScibRegs.SCIFFRX.bit.RXFIFORESET = 0 ; // Receive FIFO Re-Enable
 ScibRegs.SCIFFRX.bit.RXFFIENA = 0;  // Receive FIFO Interrupt Enable
 ScibRegs.SCIFFRX.bit.RXFFIL = 0 ;  // Receive FIFO deep level (5)


}

 

'Project > Balancing Robot' 카테고리의 다른 글

[초기화6] Init_ADC()  (0) 2014.07.23
[초기화5] Init_SPI()  (0) 2014.07.23
[초기화3] Init_EVA(), Init_EVB()  (0) 2014.07.23
[초기화2] Init_GPIO()  (0) 2014.07.23
[초기화1] DSP_Init()  (0) 2014.07.23
Posted by 십자성군
Project/Balancing Robot2014. 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페이지의 방대한 분량은 다루지 못하고, 의미하는바만 작성하도록 한다.

 

'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
Posted by 십자성군
Project/Balancing Robot2014. 7. 23. 14:48

void Init_GPIO()
{


 EALLOW ;


 // GPIO MUX Set
 GpioMuxRegs.GPAMUX.all = 0x0000 ;
 GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA0 = 1 ;    // PWM
 GpioMuxRegs.GPAMUX.bit.CAP1Q1_GPIOA8 = 1 ;  // QEP
 GpioMuxRegs.GPAMUX.bit.CAP2Q2_GPIOA9 = 1 ;  // QEP

 

 GpioMuxRegs.GPBMUX.all = 0x0000 ;
 GpioMuxRegs.GPBMUX.bit.PWM7_GPIOB0 = 1 ;    // PWM
// GpioMuxRegs.GPBMUX.bit.PWM8_GPIOB1=1
// GpioMuxRegs.GPBMUX.bit.PWM9_GPIOB2 = 1 ;    // PWM

 GpioMuxRegs.GPBMUX.bit.CAP4Q1_GPIOB8 = 1 ;  // QEP
 GpioMuxRegs.GPBMUX.bit.CAP5Q2_GPIOB9 = 1 ;  // QEP

 

 GpioMuxRegs.GPDMUX.all = 0x0000 ;


 GpioMuxRegs.GPEMUX.all = 0x0000 ;
 GpioMuxRegs.GPEMUX.bit.XINT1_XBIO_GPIOE0 = 1 ;
 GpioMuxRegs.GPEQUAL.bit.QUALPRD = 0xff ;

 

 GpioMuxRegs.GPFMUX.all = 0x0000 ;
 GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5 = 1 ; // Serial RX_A
 GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4 = 1 ; // Serial TX_A

 

 GpioMuxRegs.GPGMUX.all = 0x0000 ;
 GpioMuxRegs.GPGMUX.bit.SCIRXDB_GPIOG5 = 1 ; // Serial Rx_B
 GpioMuxRegs.GPGMUX.bit.SCITXDB_GPIOG4 = 1 ; // Serial TX_B

 

 GpioMuxRegs.GPFMUX.bit.SPICLKA_GPIOF2 = 1; //SPI_SCLK
 GpioMuxRegs.GPFMUX.bit.SPISIMOA_GPIOF0 = 1; //SPI_SIMO
 GpioMuxRegs.GPFMUX.bit.SPISOMIA_GPIOF1 = 1; //SPI_SOMI
 GpioMuxRegs.GPFMUX.bit.SPISTEA_GPIOF3 = 1; //SPI_SS


 // GPIO DIR Set
 GpioMuxRegs.GPADIR.bit.GPIOA1 = 1 ;  // output for motor direction
 GpioMuxRegs.GPADIR.bit.GPIOA2 = 1 ;  // 컨트롤주기 확인
 GpioMuxRegs.GPADIR.bit.GPIOA4 = 0 ; // 시스템 중간값(offset) 시작위한 스위치. I/O로 설정


 GpioMuxRegs.GPBDIR.bit.GPIOB1 = 1 ;  // output for motor direction
 GpioMuxRegs.GPBDIR.bit.GPIOB2 = 1 ;  // output for motor break


// GpioMuxRegs.GPFDIR.bit.GPIOF3 = 1 ; // output for SS break


 GpioMuxRegs.GPGDIR.bit.GPIOG4 = 1 ; // SCIB TX
 GpioMuxRegs.GPGDIR.bit.GPIOG5 = 1 ; // SCIB RX

 

 GpioMuxRegs.GPAQUAL.all = 0x05 ;

 

// GpioMuxRegs.

 EDIS ;
 GpioDataRegs.GPFDAT.bit.GPIOF5 = 0 ;


 GpioDataRegs.GPADAT.bit.GPIOA1 = 1 ;
 GpioDataRegs.GPADAT.bit.GPIOA2 = 1 ;
 GpioDataRegs.GPADAT.bit.GPIOA4 = 0 ; // 시스템 중간값.. 해당포트를 입력으로 사용 스위치 켜면 3.3v 전압 인가해서 HIGH가 됨


 GpioDataRegs.GPGDAT.bit.GPIOG4 = 1 ;
 GpioDataRegs.GPGDAT.bit.GPIOG5 = 1 ;
// GpioDataRegs.GPFDAT.bit.GPIOF3 = 1 ;


}

 

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

<GPIO Mux Register>

용도 : 핀들의 기능(작동)을 선택하기 위해서

각각이 Digital I/O 로써 동작하거나 Peripheral I/P 신호에 접속될 수 있다.

Digital I/O 모드로 선택될 경우, 핀의  방향성을 설정할 수 있고(GPxDIR registers) 입력신호의 노이즈를 없애도록 해줄 수 있다(GPxQUAL register)    ???

 

 

 

핀맵을 참고하자

 

 

 

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

<설명>

그렇구나 하고 대충 훓어보기 바란다.

 

MUX Register에 대한 구조체부터 살펴보면

struct GPIO_MUX_REGS {
   union  GPAMUX_REG   GPAMUX;
   union  GPADIR_REG   GPADIR;
   union  GPAQUAL_REG  GPAQUAL;
   Uint16              rsvd1;
   union  GPBMUX_REG   GPBMUX;
   union  GPBDIR_REG   GPBDIR;
   union  GPBQUAL_REG  GPBQUAL;  
   Uint16              rsvd2[5];
   union  GPDMUX_REG   GPDMUX;
   union  GPDDIR_REG   GPDDIR;
   union  GPDQUAL_REG  GPDQUAL;  
   Uint16              rsvd3;
   union  GPEMUX_REG   GPEMUX;
   union  GPEDIR_REG   GPEDIR;
   union  GPEQUAL_REG  GPEQUAL;  
   Uint16              rsvd4;
   union  GPFMUX_REG   GPFMUX;
   union  GPFDIR_REG   GPFDIR;
   Uint16              rsvd5[2];
   union  GPGMUX_REG   GPGMUX;
   union  GPGDIR_REG   GPGDIR;
   Uint16              rsvd6[6];
};

 

위와같이 A,B,D,E,F,G에 대한 구조를 확인 할 수 있다. 각각 MUX와 DIR 이 있고 A,B,D,E에는 QUAL 레지스터도 있다.

 

union GPAMUX_REG {
   Uint16             all;
   struct GPAMUX_BITS bit;
};

 

GPIOA의 MUX 레지스터 구조이고

 

struct GPAMUX_BITS  {        // bits   description
   Uint16 PWM1_GPIOA0:1;     // 0 
   Uint16 PWM2_GPIOA1:1;     // 1
   Uint16 PWM3_GPIOA2:1;     // 2 
   Uint16 PWM4_GPIOA3:1;     // 3 
   Uint16 PWM5_GPIOA4:1;     // 4 
   Uint16 PWM6_GPIOA5:1;     // 5
   Uint16 T1PWM_GPIOA6:1;    // 6 
   Uint16 T2PWM_GPIOA7:1;    // 7       
   Uint16 CAP1Q1_GPIOA8:1;   // 8
   Uint16 CAP2Q2_GPIOA9:1;   // 9
   Uint16 CAP3QI1_GPIOA10:1; // 10
   Uint16 TDIRA_GPIOA11:1;   // 11
   Uint16 TCLKINA_GPIOA12:1; // 12
   Uint16 C1TRIP_GPIOA13:1;  // 13 
   Uint16 C2TRIP_GPIOA14:1;  // 14 
   Uint16 C3TRIP_GPIOA15:1;  // 15  
        
};

 

GPIOA의 비트구조이다

 

작성한 소스코드를 다시 보면

 

 // GPIO MUX Set


 GpioMuxRegs.GPAMUX.all = 0x0000 ;
 GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA0 = 1 ;    // PWM
 GpioMuxRegs.GPAMUX.bit.CAP1Q1_GPIOA8 = 1 ;  // QEP
 GpioMuxRegs.GPAMUX.bit.CAP2Q2_GPIOA9 = 1 ;  // QEP

 

:핀맵과 함게 보면 CN9200의 A0, A8, A9의 기능을 알 수 있다. 처음에는 all=0x0000으로 모두 비활성화 시킨 후 A에서 사용하는 기능만을 활성화 시켰다.

 

 GpioMuxRegs.GPBMUX.all = 0x0000 ;
 GpioMuxRegs.GPBMUX.bit.PWM7_GPIOB0 = 1 ;    // PWM
// GpioMuxRegs.GPBMUX.bit.PWM8_GPIOB1=1
// GpioMuxRegs.GPBMUX.bit.PWM9_GPIOB2 = 1 ;    // PWM

 GpioMuxRegs.GPBMUX.bit.CAP4Q1_GPIOB8 = 1 ;  // QEP
 GpioMuxRegs.GPBMUX.bit.CAP5Q2_GPIOB9 = 1 ;  // QEP

 

 GpioMuxRegs.GPDMUX.all = 0x0000 ;


 GpioMuxRegs.GPEMUX.all = 0x0000 ;
 GpioMuxRegs.GPEMUX.bit.XINT1_XBIO_GPIOE0 = 1 ;
 GpioMuxRegs.GPEQUAL.bit.QUALPRD = 0xff ;

 

 GpioMuxRegs.GPFMUX.all = 0x0000 ;
 GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5 = 1 ; // Serial RX_A
 GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4 = 1 ; // Serial TX_A

 

 GpioMuxRegs.GPGMUX.all = 0x0000 ;
 GpioMuxRegs.GPGMUX.bit.SCIRXDB_GPIOG5 = 1 ; // Serial Rx_B
 GpioMuxRegs.GPGMUX.bit.SCITXDB_GPIOG4 = 1 ; // Serial TX_B

 

 GpioMuxRegs.GPFMUX.bit.SPICLKA_GPIOF2 = 1; //SPI_SCLK
 GpioMuxRegs.GPFMUX.bit.SPISIMOA_GPIOF0 = 1; //SPI_SIMO
 GpioMuxRegs.GPFMUX.bit.SPISOMIA_GPIOF1 = 1; //SPI_SOMI
 GpioMuxRegs.GPFMUX.bit.SPISTEA_GPIOF3 = 1; //SPI_SS

 

나머지도 마찬가지로 모두 비활성화 시킨 후 사용하는 핀만을 활성화 시킨것이다.

 

 

 // GPIO DIR Set


 GpioMuxRegs.GPADIR.bit.GPIOA1 = 1 ;  // output for motor direction
 GpioMuxRegs.GPADIR.bit.GPIOA2 = 1 ;  // 컨트롤주기 확인
 GpioMuxRegs.GPADIR.bit.GPIOA4 = 0 ; // 시스템 중간값(offset) 시작위한 스위치. I/O로 설정


 GpioMuxRegs.GPBDIR.bit.GPIOB1 = 1 ;  // output for motor direction
 GpioMuxRegs.GPBDIR.bit.GPIOB2 = 1 ;  // output for motor break


// GpioMuxRegs.GPFDIR.bit.GPIOF3 = 1 ; // output for SS break


 GpioMuxRegs.GPGDIR.bit.GPIOG4 = 1 ; // SCIB TX
 GpioMuxRegs.GPGDIR.bit.GPIOG5 = 1 ; // SCIB RX

 

 GpioMuxRegs.GPAQUAL.all = 0x05 ;

 

Digital Input Output 용도로 사용할 때는 DIR로 조절한다.

GPAQUAL.all = 0x05로 0b0000000000000101일 것이고 즉, GPA0, GPA2에 대해서 잡아준 것일 것이다.

위 코드에서 A0를 PWM, A2를 컨트롤 주기 확인용으로 쓴다는데, 자세한 사항은 추후에 수정하겠다.

 

// GpioMuxRegs.

 

 EDIS ;
 GpioDataRegs.GPFDAT.bit.GPIOF5 = 0 ;


 GpioDataRegs.GPADAT.bit.GPIOA1 = 1 ;
 GpioDataRegs.GPADAT.bit.GPIOA2 = 1 ;
 GpioDataRegs.GPADAT.bit.GPIOA4 = 0 ; // 시스템 중간값.. 해당포트를 입력으로 사용 스위치 켜면 3.3v 전압 인가해서 HIGH가 됨


 GpioDataRegs.GPGDAT.bit.GPIOG4 = 1 ;
 GpioDataRegs.GPGDAT.bit.GPIOG5 = 1 ;

 

현재 시스템에서 F5는 SCI RX A로 사용중이고 A4는 어떠한 용도의 스위치로 사용하고 있다.

G4및 G5는 SCI B의 RX 및 TX로써 사용중이다.

'Project > Balancing Robot' 카테고리의 다른 글

[초기화5] Init_SPI()  (0) 2014.07.23
[초기화4] Init_SCIA(), Init_SCIB()  (0) 2014.07.23
[초기화3] Init_EVA(), Init_EVB()  (0) 2014.07.23
[초기화1] DSP_Init()  (0) 2014.07.23
들어가면서  (0) 2014.07.23
Posted by 십자성군
Project/Balancing Robot2014. 7. 23. 13:40

void DSP_Init()
{

 InitSysCtrl();

 Init_GPIO() ;

 

 DINT;

 

 InitPieCtrl();

 

 IER = 0x0000;
 IFR = 0x0000;

 

 InitPieVectTable();

 

 EALLOW;

 

 PieVectTable.TINT0 = &cpu_timer0_isr;

 PieVectTable.RXAINT = &RXA_ISR ;
 PieVectTable.RXBINT = &RXB_ISR ;
 PieVectTable.TXBINT = &TXB_ISR ;

 

 EDIS;

 

 Init_Timer0() ;

 Init_EVA() ;
 Init_EVB() ;
 Init_SCIA() ;
 Init_SCIB() ;
 Init_SPI() ;
 Init_ADC() ;

 

 PieCtrlRegs.PIECRTL.bit.ENPIE = 1 ;
 PieCtrlRegs.PIEIER9.bit.INTx1 = 1 ;
 PieCtrlRegs.PIEIER9.bit.INTx3 = 1 ;
 PieCtrlRegs.PIEIER9.bit.INTx4 = 1 ;
 PieCtrlRegs.PIEIER1.bit.INTx4 = 1 ;
 PieCtrlRegs.PIEIER1.bit.INTx6 = 1 ;
 PieCtrlRegs.PIEIER1.bit.INTx7 = 1 ;

 

 IER |= M_INT1;
 IER |= M_INT9 ;

 

 EINT; 
 ERTM;

}

 

<명령>

DINT : 전역 인터럽트 해제

EINT : 전역 인터럽트 가동

ERTM : 리얼타임 전역 인터럽트 가동

EALLOW : MRR 보호영역 해제

EDIS : MRR 보호

 

InitSysCtrl() : 시스템 설정

GpioCtrlRegs : GPIO컨트롤 레지스터

PieVectTable

PieCtrlRegs

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

<설명1>

 

1.InitSysCtrl()

DSP281x_SysCtrl 헤더 및 C파일에 있는 함수로써 내용은 아래와 같다.

 

void InitSysCtrl(void)
{
   // Disable the watchdog
   DisableDog();

   // Initialize the PLLCR to 0xA
   InitPll(0xA);

   // Initialize the peripheral clocks
   InitPeripheralClocks();
}

 

와치독을 정지시키고 PLLCR을 초기화, peripheral clocks를 초기화 시킨다. 자세한 의미는 필요할 때 다시 알아보자.

 

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

<설명2>

GpioCtrlRegs

 

PieVectTable

PieCtrlRegs

 

 PIE(Peripheral Interrupt Expansion) : 퍼리퍼럴 인터럽트 확장

 

위에서 보면 PIE vector table은 EALLOW에 의해서 보호되고 있다. 따라서 벡터테이블을 수정하려면 EALLOW를 사용하여 보호를 해제한 후 수정하고 다시 보호해준다. 수정내용을 살펴보면

 

 PieVectTable.TINT0 = &cpu_timer0_isr;

 PieVectTable.RXAINT = &RXA_ISR ;
 PieVectTable.RXBINT = &RXB_ISR ;
 PieVectTable.TXBINT = &TXB_ISR ;

 

나중에 나오겠지만 cpu_timer0_isr, RXA_SIR 등등은 사용자가 만들어 놓은 함수이다. 타이머 관련 함수 및 SCIA와 SCIB와 관련된 통신함수이다. 즉 이 함수에 대한 인터럽트 설정으로 보인다. 자세한 내용은 차후 확인한 후 수정한다.

 

이후 각종 초기화 함수들을 실행한 후 아래와 같이 입력하였다.

 PieCtrlRegs.PIECRTL.bit.ENPIE = 1 ;
 PieCtrlRegs.PIEIER9.bit.INTx1 = 1 ;
 PieCtrlRegs.PIEIER9.bit.INTx3 = 1 ;
 PieCtrlRegs.PIEIER9.bit.INTx4 = 1 ;
 PieCtrlRegs.PIEIER1.bit.INTx4 = 1 ;
 PieCtrlRegs.PIEIER1.bit.INTx6 = 1 ;
 PieCtrlRegs.PIEIER1.bit.INTx7 = 1 ;

INTx1,x3,x4는 각각 SCI A RX와 B RX, B TX를 Enable 시킨것이다

x6 및 x7은 각각 ADC 및 Timer를 Enable 시킨것이다.

자세한 내용은 차후 확인한 후 수정한다.

 

아래는 PIE관련 표와 그림이다.

 

 

 IER |= M_INT1;
 IER |= M_INT9 ;

 

위를 통해 CPU Intterupt1과 9를 Enable 시켰다.

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

<나머지 주석처리했던 내용>

 

PieVectTable.TXAINT = &TXA_ISR ;
PieVectTable.XINT1 = &Xint1_isr ;
PieVectTable.ADCINT = &adc_isr;

 

Init_XINT() ;

'Project > Balancing Robot' 카테고리의 다른 글

[초기화5] Init_SPI()  (0) 2014.07.23
[초기화4] Init_SCIA(), Init_SCIB()  (0) 2014.07.23
[초기화3] Init_EVA(), Init_EVB()  (0) 2014.07.23
[초기화2] Init_GPIO()  (0) 2014.07.23
들어가면서  (0) 2014.07.23
Posted by 십자성군
Project/Balancing Robot2014. 7. 23. 13:34

완성된 시스템에 대한 소스해석을 하면서 동시에 2812를 공부한다

'Project > Balancing Robot' 카테고리의 다른 글

[초기화5] Init_SPI()  (0) 2014.07.23
[초기화4] Init_SCIA(), Init_SCIB()  (0) 2014.07.23
[초기화3] Init_EVA(), Init_EVB()  (0) 2014.07.23
[초기화2] Init_GPIO()  (0) 2014.07.23
[초기화1] DSP_Init()  (0) 2014.07.23
Posted by 십자성군