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

}