dsPIC33EP 高速PWM模块初始化设置及应用
//文件 p33pwm6.h #ifndef _P33PWM6_H_ #define _P33PWM6_H_ //#include "p33pwm6.h" #define FSYNCOEN (1<<8)//主时基同步使能位 #define FSYNCEN (1<<7)//外步时基同步使能位 //输入时钟预分频选择 #define PWMCLK_DIV1 (0<<0) #define PWMCLK_DIV2 (1<<0) #define PWMCLK_DIV4 (2<<0) #define PWMCLK_DIV8 (3<<0) #define PWMCLK_DIV16 (4<<0) #define PWMCLK_DIV32 (5<<0) #define PWMCLK_DIV64 (6<<0) #define V_PTPER 720//1000 //主控时基周期值 #define POH1_ValidH IOCON1 &= ~(1<<13) //上管引脚高电平有效 #define POH1_ValidL IOCON1 |= (1<<13) //上管引脚低电平有效 #define POH2_ValidH IOCON2 &= ~(1<<13) //上管引脚高电平有效 #define POH2_ValidL IOCON2 |= (1<<13) //上管引脚低电平有效 #define POH3_ValidH IOCON3 &= ~(1<<13) //上管引脚高电平有效 #define POH3_ValidL IOCON3 |= (1<<13) //上管引脚低电平有效 #define PWMAH_ENB IOCON1bits.OVRENH = 0 #define PWMBH_ENB IOCON2bits.OVRENH = 0 #define PWMCH_ENB IOCON3bits.OVRENH = 0 #define PWMAH_DIS IOCON1bits.OVRENH = 1 #define PWMBH_DIS IOCON2bits.OVRENH = 1 #define PWMCH_DIS IOCON3bits.OVRENH = 1 //=============================================== extern void Init_Pwm6(uint16 InClkdiv,uint16 CycPwm) ; extern void ToPwmValue(uint16 Tcon) ; #endif //文件 p33pwm6.c #include "global.h" #include "p33pwm6.h" //*************************************** // 函数名称:Init_Pwm6 // 函数功能:初始化PWM // 入口参数:PWM时钟分频 PWM周期值 // 出口参数:无 // 返回值:无 // pwm 的时钟源为Fosc (即系统时钟) //*************************************** void Init_Pwm6(uint16 InClkdiv,uint16 CycPwm) { PTCON = 0x0000 ; //PWM模块禁止 每次比较产生触发事件 PTCON2 = InClkdiv ; //输入时钟预分频 PTPER = CycPwm ; //主控周期值 PHASE1 = CycPwm ; //主移相寄存器 PHASE2 = CycPwm ; PHASE3 = CycPwm ; SEVTCMP = 0X0000 ; //特殊事件比较计数值位 CHOP = 0X0000 ; //斩波时钟发生器-- 禁止 MDC = 0x0000 ; //主控占空比值 PDC1 = 0x0000 ; //pwm占空比寄存器 PDC2 = 0x0000 ; PDC3 = 0x0000 ; /* //PTPER 提供周期 mdc为PWM提供占空比 PWMCON1 = 0X0180 ; //禁止死区控制 PWMCON2 = 0X0180 ; //禁止死区控制 PWMCON3 = 0X0180 ; //禁止死区控制 */ //PHASEx 提供周期 PDCx为PWM提供占空比 PWMCON1 = 0X0280 ; //禁止死区控制 PWMCON2 = 0X0280 ; //禁止死区控制 PWMCON3 = 0X0280 ; //禁止死区控制 /* //PHASEx 提供周期 PDCx为PWM提供占空比 PWMCON1 = 0X0380 ; //禁止死区控制 PWMCON2 = 0X0380 ; //禁止死区控制 PWMCON3 = 0X0380 ; //禁止死区控制 */ DTR1 = 0X0000 ; //死区寄存器 DTR2 = 0X0000 ; DTR3 = 0X0000 ; ALTDTR1 = 0X0000 ; //备用死区寄存器 ALTDTR2 = 0X0000 ; ALTDTR3 = 0X0000 ; TRGCON1 = 0X0000 ; //PWM触发控制寄存器 TRGCON2 = 0X0000 ; TRGCON3 = 0X0000 ; /* PWM模块控制H管 GPIO控制L管 PWM IO引脚模式处于独立模式 */ IOCON1 = 0X8c00 ; //PWM IO 控制寄存器 IOCON2 = 0X8c00 ; IOCON3 = 0X8c00 ; POH1_ValidH ; //上管引脚 高电平有效 POH2_ValidH ; POH3_ValidH ; TRIG1 = 0X0000 ;//PWM主触发比较值寄存器 TRIG2 = 0X0000 ; TRIG3 = 0X0000 ; //PWM故障限流控制寄存器 禁止限流 禁止故障输入 FCLCON1 = 0X0003 ; FCLCON2 = 0X0003 ; FCLCON3 = 0X0003 ; LEBCON1 = 0X0000 ;//前沿消隐控制寄存器 LEBCON2 = 0X0000 ; LEBCON3 = 0X0000 ; LEBDLY1 = 0X0000 ; //前沿消隐延时寄存器 限流和故障输入消隐 LEBDLY2 = 0X0000 ; LEBDLY3 = 0X0000 ; AUXCON1 = 0X0000 ; //PWM附属控制寄存器 AUXCON2 = 0X0000 ; AUXCON3 = 0X0000 ; PTCON |= (FSYNCOEN|FSYNCEN) ;//主时基同步使能 //当PWM不使能时 PWMH PWML管脚输出的电平状态 //第1位为上管 第0位为下管 IOCON1bits.OVRDAT = 0X00 ; //PWM禁止时 PWMH PWML输出0 IOCON1bits.OVRDAT = 0X00 ; // IOCON1bits.OVRDAT = 0X00 ; // PWMCON1 |= 0X0001 ; //立即更新有效位 PWMCON2 |= 0X0001 ; //立即更新有效位 PWMCON3 |= 0X0001 ; //立即更新有效位 PTCON = 0x8000 ;//PWM模块使能 } //*************************************** // 函数名称:Init_Pwm6 // 函数功能:初始化时钟 // 入口参数:时钟来源选择 处理器与CPU时钟分频比 pll倍频比 // 出口参数:无 // 返回值:无 //*************************************** void ToPwmValue(uint16 Tcon) { PDC1 = Tcon ; //pwm占空比寄存器 PDC2 = Tcon ; PDC3 = Tcon ; // MDC = Tcon; //主控占空比值 } //应用实例 void main(void) { uint16 g_wTmp1 ; //初始化PWM //独立时期 独立占空比 PWM固定频率16K Init_Pwm6(PWMCLK_DIV8,V_PTPER) ;//Fosc/8 16k pwm 最大占空比值为720 while(1) { ToPwmValue(200) ; //设置PWM占空比 PWMAH_ENB ; //输出PWM到H1管 PWMAH_DIS ;//禁止输出PWM到H1管 } }