zoukankan      html  css  js  c++  java
  • 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管
    	}
    	
    
    }
    
    


  • 相关阅读:
    【解决】Windows7任务栏输入法图标无法显示
    【解决】任务栏中找不到语言栏
    SQL Server中根据起始星期计算星期数和周次数的函数
    SharePoint 2010 中如何配置同步配置文件
    如何禁止Windows系统自动安装驱动
    [要点总结]SharePoint 2010:如何配置表单认证(FBA)
    【解决】如何升级网站集内容数据库
    [解决]Office 2010不能同步文件到SharePoint
    羽毛球比赛规则简略版
    [转]SharePoint 2013中如何恢复“用不同用户登录”链接
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3397949.html
Copyright © 2011-2022 走看看