[Microchip]/dsPIC33-SM2009. 6. 10. 17:09

[dsPIC33 MotorDriver] 타이머 인터럽트 테스트

[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;
}

Posted by nexp

댓글을 달아 주세요