본문 바로가기

[Microchip]/dsPIC33-SM

dsPIC33 PWM 테스트

dsPIC33 PWM 테스트

dspic_pwm.pdf



dsPIC33FJ32MC302/304, dsPIC33FJ64MCX02/X04 and dsPIC33FJ128MCX02/X04 시리즈는 Motor Control PWM (MCPWM)을 제공하기 때문에 모터 제어용 PWM만 테스트 했는데 이번에 일반 dsPIC33은 MCPWM모듈을 제공하지 않기 때문에  Output Compare module를 이용하여 PWM을 출력 할수 가 있다.



블록도를 보면 Timer2, 3을 기준으로 PWM을 생성할 수 있다. 


PWM출력은 OCFA(OC1:PD0~OC4:PD3) 핀과 OCFB(OC5:PD4~OC8:PD7) 핀에 할당되어 있다.




OCxCON: Output Compare x Control Register


OCTSEL: Output Compare x Timer Select bit

1 = Timer3 is the clock source for Output Compare x

0 = Timer2 is the clock source for Output Compare x



OCM<2:0>: Output Compare x Mode Select bits

111 = PWM mode with fault protection. PWM mode on OCx, Fault pin is enabled

110 = PWM mode without fault protection. PWM mode on OCx, Fault pin is disabled

101 = Continuous Pulse mode. Initialize OCx pin low, generate continuous output pulses on OCx pin

100 = Delayed One-Shot mode. Initialize OCx pin low, generate single output pulse on OCx pin

011 = Toggle mode. Compare event toggles OCx pin

010 = Active High One-Shot mode. Initialize OCx pin high, compare event forces OCx pin low

001 = Active Low One-Shot mode. Initialize OCx pin low, compare event forces OCx pin high

000 = Module Disabled. Output Compare module is disabled




dsPIC33 PWM 모드별 출력 상태








dsPIC33 PWM 테스트 소스 코드


void InitTimer2(void)

{

//타이머2 설정

T2CONbits.TON = 1; //초기치 타이머2 동작 ON

T2CONbits.TSIDL = 0; //아이들 모드시에도 동작 설정

T2CONbits.TGATE = 0; //TGATE 동작 모드 금지

T2CONbits.TCKPS1 = 0; //프리스케일러 분주비 1:1,TCKPS<1:0> = 00

T2CONbits.TCKPS0 = 0;

T2CONbits.TCS = 0; //내부 클럭 소스 사용( Fosc / 2 = Tcy)


TMR2 = 0; //TMR2 초기화

PR2 = 4096; //10khz

}


void InitPwm1(int Enable)

{

if(Enable)

{

InitTimer2();

//OC1CON 레지스터 설정

OC1CONbits.OCSIDL = 0; //아이들 모드시에도 동작 설정

OC1CONbits.OCFLT = 0; //PWM Fault 핀 입력 사용 불가능 설정

OC1CONbits.OCTSEL = 0; //타이머 2 설정

OC1CONbits.OCM = 6; //PWM 모드와 Fault핀 사용 불가 설정, OCM<2:0> = 110

 

//SetPwm1(MAX_PWM_VALUE/2);

SetPwm1(0);

}

else

{

SetPwm1(0);

OC1CONbits.OCM = 0;

}


}



void SetPwm1(unsigned int Value)

{

OC1R = Value;

OC1RS = Value;

}



void __attribute__((__interrupt__)) _OC1Interrupt(void)

{

IFS0bits.OC1IF = 0;

}



반응형