static void tiHSetupPeripheral(void) { unsigned int PTPERvalue = pwm_period; unsigned int SEVTCMPvalue, PTCONvalue, PWMCON1value, PWMCON2value; SEVTCMPvalue = sevtcmp_pwm; PTCONvalue = PWM_EN & PWM_IDLE_CON & PWM_OP_SCALE1 & PWM_IPCLK_SCALE1 & PWM_MOD_FREE; PWMCON1value = PWM_MOD1_IND & PWM_PEN1L & PWM_MOD2_IND & PWM_PEN2L & PWM_MOD3_IND & PWM_PEN3L & PWM_MOD4_IND & PWM_PEN4L; PWMCON2value = PWM_SEVOPS4 & PWM_OSYNC_TCY & PWM_UEN; ConfigIntMCPWM(PWM_INT_DIS & PWM_FLTA_DIS_INT & PWM_FLTB_DIS_INT); //Call Microchip library setup function OpenMCPWM(PTPERvalue, SEVTCMPvalue, PTCONvalue, PWMCON1value, PWMCON2value); }
void SetupPWM(void){ LATB = 0x0000; TRISB = 0b0000011011111011; PORTBbits.RB8 = 0; PORTBbits.RB11 = 0; unsigned int SEVTCMPvalue, PTCONvalue, PWMCON1value, PWMCON2value; SEVTCMPvalue = 160; //Special event compare register triggers special event //SEVTCMPvalue = 4839; //Special event compare register triggers special event //at this point in the PWM period. Useful for sampling //back EMF when motor is turned off, for example. //Values larger than 4839 for a time base of 4999 give //unreliable results. Consequently, running the motor //at greater than 96.7% duty cycle means you cannot //sense back EMF. PTCONvalue = PWM_EN & PWM_IDLE_CON & PWM_OP_SCALE1 & // PWM_IPCLK_SCALE4 & PWM_MOD_FREE; PWM_IPCLK_SCALE16 & PWM_MOD_FREE; PWMCON1value = PWM_MOD1_IND & PWM_PEN1L & PWM_PEN1H & PWM_MOD2_IND & PWM_PEN2L & PWM_PEN2H & PWM_MOD3_IND & PWM_PEN3L & PWM_PEN3H; PWMCON2value = PWM_SEVOPS1 & PWM_OSYNC_TCY & PWM_UEN; ConfigIntMCPWM(PWM_INT_DIS & PWM_FLTA_DIS_INT & PWM_FLTB_DIS_INT); OpenMCPWM(PTPERvalue, SEVTCMPvalue, PTCONvalue, PWMCON1value, PWMCON2value); P1OVDCONbits.POVD1L = 1; P1OVDCONbits.POVD1H = 1; P1OVDCONbits.POVD2L = 1; P1OVDCONbits.POVD2H = 1; P1OVDCONbits.POVD3L = 1; P1OVDCONbits.POVD3H = 1; SetDCMCPWM(1, 0, 0); SetDCMCPWM(2, 0, 0); SetDCMCPWM(3, 0, 0); }
static void mcSetupPeripheral(void) { //unsigned int PTPERvalue = 10000; unsigned int PTPERvalue = 2000; //unsigned int PTPERvalue = 2000; unsigned int SEVTCMPvalue, PTCONvalue, PWMCON1value, PWMCON2value; SEVTCMPvalue = 1920; SEVTCMPvalue = 9940; SEVTCMPvalue = 1988; // ok up to 96% of time base, according to Aaron // SEVTCMPvalue = 160; // Special Event Trigger Compare Value for ADC in phase with PWM //PTCONvalue = PWM_EN & PWM_IDLE_CON & PWM_OP_SCALE1 & // PWM_IPCLK_SCALE4 & PWM_MOD_FREE; PTCONvalue = PWM_EN & PWM_IDLE_CON & PWM_OP_SCALE1 & PWM_IPCLK_SCALE1 & PWM_MOD_FREE; PWMCON1value = PWM_MOD1_IND & PWM_PEN1L & PWM_MOD2_IND & PWM_PEN2L & PWM_MOD3_IND & PWM_PEN3L & PWM_MOD4_IND & PWM_PEN4L; PWMCON2value = PWM_SEVOPS1 & PWM_OSYNC_TCY & PWM_UEN; ConfigIntMCPWM(PWM_INT_DIS & PWM_FLTA_DIS_INT & PWM_FLTB_DIS_INT); SetDCMCPWM(1, 0, 0); OpenMCPWM(PTPERvalue, SEVTCMPvalue, PTCONvalue, PWMCON1value, PWMCON2value); SetDCMCPWM(2, 0, 0); OpenMCPWM(PTPERvalue, SEVTCMPvalue, PTCONvalue, PWMCON1value, PWMCON2value); //Stan's // For 1KHz at MIPS == 40 /* pwm_period_ = 624; ConfigIntMCPWM(PWM_INT_DIS & PWM_FLTA_DIS_INT & PWM_FLTB_DIS_INT); PTPER = pwm_period_; PWMCON1bits.PMOD1 = 1; PWMCON1bits.PMOD2 = 1; PWMCON1bits.PMOD3 = 0; PWMCON1bits.PMOD4 = 0; PWMCON1bits.PEN1H = 0; PWMCON1bits.PEN2H = 0; PWMCON1bits.PEN3H = 0; PWMCON1bits.PEN4H = 0; PWMCON1bits.PEN1L = 1; PWMCON1bits.PEN2L = 1; PWMCON1bits.PEN3L = 0; PWMCON1bits.PEN4L = 0; PWMCON2bits.SEVOPS = 1; // postscale 1:1 PWMCON2bits.OSYNC = 0; PWMCON2bits.IUE = 1; PWMCON2 |= PWM_UEN; P1SECMPbits.SEVTDIR = 1; PTCONbits.PTMOD = 0; // Free running mode PTCONbits.PTOPS = 0b11; // postscale 1:1 PTCONbits.PTCKPS = 0b11; // postscale 1:64 PTCONbits.PTSIDL = 0; // runs in CPU idle mode PTCONbits.PTEN = 1; PDC1 = 0x35; // duty cycle = 0 PDC2 = 0x35; SEVTCMP = 600; // Special Event Trigger Compare Value for ADC in phase with PWM //P1SECMPbits.SEVTCMP = 600; AD1CON1bits.SSRC = 0b011; */ }