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