📄 pwmfullbridge.c
字号:
#define XTFREQ 7372800UL // On-board Crystal freq#define PLLMODE 16 // On-chip PLL setting#define Fosc (XTFREQ*PLLMODE) // Freq of oscillator = 117,964,800 Hz#define FCY (Fosc/4) // Instruction Cycle Freq = 29,491,200 Hz, TCY = 33.9 nsec#include <p30Fxxxx.h>#define FHz2Tus(FHZ) (1.0e6/FHZ) // convert freq Hz to period usecconst double TCY = FHz2Tus(FCY); // processor instruction period, usec#define FPWM 160000 // PWM frequency, Hzconst float TPWM = FHz2Tus(FPWM); // PWM period int pwmPTPER;int pwmPDC; // PDC, Pulse Duty Cycleint main(void){ LATE = 0x0; // PWM pins low TRISE = 0b1111111111000000; // PWM RE0-5=PWM1L,...,PWM3H RE8=~FLTA<-also INT0 /*~~~~~~~~~~~~~~~~~~~~~~~ PWM Configuration ~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ const int PRESCALE = 1; PTCON = 0; PTCONbits.PTOPS = 0; // output post scale 1:1 = 0 PTCONbits.PTCKPS = 0; // time base clock pre scale 1:1,1:4,1:16,1:64 = 0,1,2,3 PTCONbits.PTMOD = 0; // free run=0, single-event=1, up-down=2, up-down-interrupts=3 PWMCON1 = 0; PWMCON1bits.PMOD1 = 0; // output mode: 0=complementary, 1=independent PWMCON1bits.PMOD2 = 0; // output mode: 0=complementary, 1=independent PWMCON1bits.PMOD2 = 0; // output mode: 0=complementary, 1=independent PWMCON1bits.PEN1L = 1; // PWM1L is controlled by PWM module RE0=pin 26 PWMCON1bits.PEN1H = 1; // PWM1H is controlled by PWM module RE1=pin 25 PWMCON1bits.PEN2L = 1; // PWM2L is controlled by PWM module RE2=pin 24 PWMCON1bits.PEN2H = 1; // PWM2H is controlled by PWM module RE3=pin 23 PWMCON1bits.PEN3L = 0; // PWM3 not used, RE4=pin 22 digital I/O PWMCON1bits.PEN3H = 0; // PWM3 not used, RE5=pin 21 digital I/O // OVDCON = 0; // clearing OVDCON kills PWM output PWMCON2 = 0; SEVTCMP = 0; // special event compare PTMRbits.PTMR = 0; #define CALC_PTPER_FREE_RUN(scale,freqHz) ((scale * FHz2Tus(freqHz)) / TCY - 1. + 0.5) #define CALC_PTPER_UP_DOWN(scale,freqHz) ((scale * FHz2Tus(freqHz) - 0.75) / (2. * TCY) + 0.5) #define CALC_PTPER(scale,freqHz) CALC_PTPER_FREE_RUN(scale,freqHz) // using free run//#define CALC_PTPER(scale,freqHz) CALC_PTPER_UP_DOWN(scale,freqHz) // using up-down pwmPTPER = CALC_PTPER(PRESCALE,FPWM); PTPER = pwmPTPER; // 100% duty cycle is actually 50% since we are generating AC via the H-bridge pwmPDC = 2*pwmPTPER; // scope measures 50% duty cycle on PWM[12]H, DTCON1 = 0 PDC1 = pwmPDC; PDC2 = 0; PDC3 = 0; DTCON1 = 0; // dead time: eg if 10, 10 TCY = 10 * 33.9 nsec = 339 nsec IFS2bits.PWMIF = 0; // interrupt off, if already active IEC2bits.PWMIE = 1; // enable interrupt PTCONbits.PTEN = 1; // Enable PWM Module while(1) ;}void __attribute__((__interrupt__, no_auto_psv)) _PWMInterrupt(void){ static int bToggle = 0; IFS2bits.PWMIF = 0; if(bToggle) { PDC1 = 0; PDC2 = pwmPDC; #if 0 // enabling and disabling PEN1+PEN2 did not produce full wave H-bridge PWMCON1bits.PEN1H = 0; PWMCON1bits.PEN1L = 0; PWMCON1bits.PEN2H = 1; PWMCON1bits.PEN2L = 1; #endif } else { PDC1 = pwmPDC; PDC2 = 0; #if 0 // enabling and disabling PEN1+PEN2 did not produce full wave H-bridge PWMCON1bits.PEN1H = 1; PWMCON1bits.PEN1L = 1; PWMCON1bits.PEN2H = 0; PWMCON1bits.PEN2L = 0; #endif } bToggle = !bToggle; } /* vim: set cin et ts=2 sw=2 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -