⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pwmfullbridge.c

📁 pulse width modulation pwm of multilevel inverter
💻 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 + -