打印
[DemoCode下载]

【520新唐听我讲】+N76E003的PWM

[复制链接]
8096|88
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
       PWM (脉冲宽度调制) 信号在控制方案中应用非常广泛。可用于电机驱动、风扇控制、背光调节、LED 光源调光或通过低通滤波器电路模拟一个简单的数模转换模块的输出。
N76E003 包含三对(6个PWM通道)16位精度、可调周期和占空比的PWM输出,非常适合用于电机控制。该模块架构适用于驱动单相或三相无刷直流电机(BLDC),或三相交流感应电机。每个信道PWM输出可配置为独立输出模式、互补模式或同步模式。当设定为互补模式时,通过插入可配置的死区时间,保护MOS管同时导通。PWM波形可配置边沿对齐或中心对齐来选择中断响应位置。
       脉冲宽度调制发生器
        脉冲宽度调制发生器时钟由系统时钟或定时器1计数溢出产生,可通过PWM时钟预分频调整1/1~1/128除频。
PWM周期由16位周期寄存器 {PWMPH, PWMPL} 组合预先设置。
所有PWM通道共享同一个16位周期计数器,周期是相同的。
每个PWM通道都有独立占空比寄存器分别为
{PWM0H, PWM0L}、
{PWM1H, PWM1L}、
{PWM2H, PWM2L}、
{PWM3H, PWM3L}、
{PWM4H, PWM4L}及
{PWM5H, PWM5L}。有6个占空比寄存器,6个通道都能产生独立占空比的PWM信号,PWM信号的周期和占空比可通过16位计数器跟周期和占空比寄存器比较产生。


沙发
huangcunxiake|  楼主 | 2018-5-19 10:48 | 只看该作者
为了更好适用于三相电机控制,通过设置GP (PWMCON1.5)位来使用组群模式, {PWM0H, PWM0L} 和{PWM1H, PWM1L}占空比寄存器决定PWM输出的占空比。
在三相电机控制应用中,另二对PWM输出产生完全相同的占空比信号,一旦组群模式启用{PWM2H, PWM2L}、 {PWM3H, PWM3L}、 {PWM4H, PWM4L} and {PWM5H, PWM5L} 寄存器失效。意味着寄存器{PWM2H, PWM2L} 和 {PWM4H, PWM4L}与{PWM0H, PWM0L}相同,{PWM3H, PWM3L} 和 {PWM5H, PWM5L}与{PWM1H, PWM1L}相同。
注:启用PWM输出,芯片不会自动配置管脚为“输出模式”,用户需要通过软件配置。
     脉冲宽度调制计数器产生六个PWM信号,称为PG0、PG1、PG2、PG3、PG4及PG5。这些信号通过PWM及故障刹车输出控制电路,输出至I/O管脚 。输出控制电路决定输出PWM信号的模式、死区时间、输出掩码、故障刹车以及PWM的极性。最后一个特性是PWM输出或I/O功能的多功能复用。用户可以设置PIOn位使相应管脚用于PWM输出。同样,可用于通用I/O功能。

使用特权

评论回复
板凳
huangcunxiake|  楼主 | 2018-5-19 10:53 | 只看该作者
请按照如下初始化步骤来产生PWM信号。
第一步,设定CLRPWM (PWMCON0.4)位,清零计数器以确保16位向上计数器计数正确。
然后设定{PWMPH, PWMPL} 及所有{PWMnH, PWMnL} 寄存器。对PWMRUN(PWMCON0.7) 置1,开始16位向上计数器计数。
PWM信号开始产生,对应管脚输出PWM信号。
所有的周期及占空比寄存器,具有硬件双缓存设计,因此 {PWMPH, PWMPL} 及 {PWMnH, PWMnL} 寄存器可随时被改写,但不会立即更新PWM周期和占空比,直到寄存器 LOAD (PWMCON0.6) 置1后和当前周期完成。用于防止产生非完整周期或占空比的PWM波形。如果一个新的周期和占空比需要更新,置1这位导入周期和和占空比寄存器所设新值。当前一个PWM周期输出结束,载入动作才会开始。更改的周期及占空比值将在下一个周期展现。当载入动作结束,硬件自动将LOAD位清0。这一特性会使得LOAD位写入及读出值可能不一致,意义也不相同。

使用特权

评论回复
地板
huangcunxiake|  楼主 | 2018-5-19 11:39 | 只看该作者
边沿对齐模式
边沿对齐模式,16位计数器设定为单周期模式,从0000H向上计数,直到与{PWMPH, PWMPL}匹配,然后重新从0000H开始开始向上计数。
PWM信号(PGn信号在PWM和故障刹车输出控制模块之前)在16位计数器与周期寄存器和占空比寄存器{PWMnH, PWMnL}设置值匹配时停止PGn信号,并且设置16位计数器为0000H。PWM输出波形为左边沿对齐方式。

中心对齐模式
中心对齐模式,16位计数器采用双周期模式,从0000H开始向上计数至{PWMPH, PWMPL},然后由{PWMPH,PWMPL}向下计数至0000H。
PGn信号在16位计数器向上计数,与周期寄存器和占空比寄存器{PWMnH,PWMnL}设置值匹配,然后16位计数器向下计数,与周期寄存器和占空比寄存器{PWMnH, PWMnL}设置值匹配,计数至0000H时停止PGn信号。中心对齐型PWM用于产生非重叠波形。



使用特权

评论回复
5
huangcunxiake|  楼主 | 2018-5-19 11:54 | 只看该作者
工作模式
PGn信号通过PWM和故障刹车输出控制电路后,PWM模式选择电路将产生不同类型的PWM输出模式,总共6个通道、三组,分别是PG0~PG5。支持独立输出模式,互补模式及同步模式。
独立输出模式
当PWMMOD[1:0] (PWMCON1[7:6]) 设定为 [0:0],PWM为独立输出模式。该模式为默认输出模式。 PG0, PG1, PG2, PG3, PG4 及 PG5 独立输出PWM信号。

带死区插入的互补模式
当PWMMOD[1:0] = [0:1],设定为互补模式。在该模式中PG0/2/4输出信号与独立模式下输出信号相同,但PG1/3/5 输出与PG0/2/4输出的信号互补。
同时忽略PG1/3/5占空比寄存器{PWMnH, PWMnL} (n:1/3/5)。该模式可使PG0/PG1形成一对互补的PWM输出。同样 PG2/PG3, PG4/PG5也可以用于互补输出。

在实际的电机应用中,互补模式PWM输出需要插入“死区时间”用来防止损坏电源开关器件,像用于控制半桥连续开关的GPIBS,用来控制不能同时开关的电源器件。
N76E003每组PWM共享一个9位“死区时间”计数器PDTCNT,用于产生在同组中两通道之间关闭时间,对同组两个PWM信号中插入“关闭时间”,同样,在PDTCNT定时器溢出,电平从0到1转换的边沿会加入一段延迟。下图:互补模式PG0/PG1组插入 “死区时间”的时序图,PG2/PG3组和PG4/PG5组也是同样的“死区时间”时序图。每组是否加入“死区时间”都可以通过PDTEN[3:0]寄存器来配置。
注: PDTCNT 及 PDTEN 寄存器都有时控保护 (TA)。仅当PWM配置为互补模式,“死区时间“控制才有效。

看这个图,也就是在每组的两个通路上出现上升沿的时候给一个称为死区的延时。

使用特权

评论回复
6
huangcunxiake|  楼主 | 2018-5-19 11:55 | 只看该作者
可以看出死区只是在每个通道上出现上升沿的时候让它延时一会儿再出现上升沿。而下降沿的位置保持不变。实际上死区是在降低每一路的占空比基础上实现的。

使用特权

评论回复
7
huangcunxiake|  楼主 | 2018-5-19 11:58 | 只看该作者

根据这个公式可知,启用死区后,至少要插入1个时钟周期的死区时间。

使用特权

评论回复
8
huangcunxiake|  楼主 | 2018-5-19 13:26 | 只看该作者
通过软件设置PWM的掩码寄存器可以屏蔽每个通道的PWM信号,PWM掩码输出功能广泛应用于电子换向电机如直流无刷电机BLDC。
PMEN寄存器包含6位掩码使能位,每个掩码使能位掩码使能各自的PWM通道。PMEN的默认值为00H,即所有PWM通道输出都不掩码。
注:掩码电位按照PMD设定值决定,并不受PNP寄存器影响。


使用特权

评论回复
9
huangcunxiake|  楼主 | 2018-5-19 13:29 | 只看该作者
故障刹车
故障刹车功能应用在增强型PWM电路中,配置为输入故障侦测, 保护电机系统防止损坏。
当FBINEN(PWMCON1.3) 置1,故障刹车输入脚(FB) 生效。
当故障发生,PWM相对应的管脚的FBD值会被更改,PWMRUN (PWMCON0.7)位自动被硬件清除,PWM输出停止,PWM 16位计数器复位清0,标志位FBF 通过硬件置1,如果中断使能了将会产生故障刹车中断。
即便软件清除FBF值,FBD数据内容仍然保持不变。
用户需要重新设置PWMRUN的值来重新启动输出PWM信号。
此时,故障刹车状态才会被释放,PWM按设定值正常输出。
故障刹车具有极性选择位FBINLS (FBD.6) 。
注意,FB管脚内部有固定的8/FSYS响应过滤结构,FB脚信号发生需要超过8个系统时钟故障刹车才会响应,以避免管脚干扰信号引发误操作。
另一个触发故障刹车的方式是ADC比较事件,与FB脚输入效果相同。


使用特权

评论回复
10
huangcunxiake|  楼主 | 2018-5-19 13:31 | 只看该作者

结构很简单。单片机很复杂吗,好多人说复杂,复杂那是你整体看,你要细分了看,每个部分都很简单。

使用特权

评论回复
11
huangcunxiake|  楼主 | 2018-5-19 14:48 | 只看该作者
极性控制
每路PWM带有独立的极性控制位PNP0~PNP5。默认正逻辑为高电平有效,即PWM输出高电平电源切换开,低电平电源切换关。用户可通过设置PNP位来改变PWM输出极性,产生相反的信号。
PWM 中断
PWM模块带有标志位PWMF (PWMCON0.5) 用来标志当前PWM周期完成状态。响应条件根据INTSEL[2:0]和 INTTYP[1:0] (PWMINTC[2:0]和[5:4])设置。注:中心点触发或终点触发中断仅适用于中心对齐模式。PWMF通过软件清零。
故障刹车事件请求另一个中断,故障刹车中断。具有独立的中断向量,不同于PWM中断向量。无论故障刹车管脚输入事件或是ADC比较事件发生,FBF(FBD.7)都会通过硬件置1,如果故障刹车中断EFB (EIE.5)使能位使能了,将产生故障刹车中断,FBF需通过软件清0


使用特权

评论回复
12
huangcunxiake|  楼主 | 2018-5-19 15:08 | 只看该作者
一般的PWM演示
/************************************************************************************************************
*    Main function
************************************************************************************************************/
void main(void)
{
    Set_All_GPIO_Quasi_Mode;

                PWM0_P12_OUTPUT_ENABLE;
                PWM2_P10_OUTPUT_DISABLE;
                PWM4_P01_OUTPUT_ENABLE;
                PWM5_P03_OUTPUT_ENABLE;
       
                PWM_IMDEPENDENT_MODE;
                PWM_CLOCK_DIV_8;
                PWMPH = 0x07;
                PWMPL = 0xCF;
/**********************************************************************
        PWM frequency = Fpwm/((PWMPH,PWMPL) + 1) <Fpwm = Fsys/PWM_CLOCK_DIV>
                                                                = (16MHz/8)/(0x7CF + 1)
                                                                = 1KHz (1ms)
***********************************************************************/
       
                PWM0H = 0x00;                                       
                PWM0L = 0xCF;
                PWM2H = 0x01;                                               
                PWM2L = 0xCF;
               
                set_SFRPAGE;                                                //PWM4 and PWM5 duty seting is in SFP page 1
                PWM4H = 0x03;                                               
                PWM4L = 0xCF;
                PWM5H = 0x05;                                               
                PWM5L = 0xCF;
                clr_SFRPAGE;                                                                                       
// PWM output inversly enable
                PWM2_OUTPUT_INVERSE;

//-------- PWM start run--------------
    set_LOAD;
    set_PWMRUN;
                while(1);
}

使用特权

评论回复
13
huangcunxiake|  楼主 | 2018-5-19 15:19 | 只看该作者
PWM中断
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2017 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

//***********************************************************************************************************
//  Nuvoton Technoledge Corp.
//  Website: http://www.nuvoton.com
//  E-Mail : MicroC-8bit@nuvoton.com
//  Date   : Apr/21/2017
//***********************************************************************************************************

//***********************************************************************************************************
//  File Function: N76E003 PWM Output demo code
//***********************************************************************************************************
#include "N76E003.h"
#include "Common.h"
#include "Delay.h"
#include "SFR_Macro.h"
#include "Function_define.h"


//*****************  The Following is in define in Fucntion_define.h  ***************************
//****** Always include Function_define.h call the define you want, detail see main(void) *******
//***********************************************************************************************
#if 0
//--------- PMW clock source select define ---------------------
//#define                PWM_CLOCK_FSYS                                        CKCON&=0xBF
//#define                PWM_CLOCK_TIMER1                                CKCON|=0x40
////--------- PWM clock devide define ----------------------------
//#define                PWM_CLOCK_DIV_2                                        PWMCON1|=0x01;PWMCON1&=0xF9
//#define                PWM_CLOCK_DIV_4                                        PWMCON1|=0x02;PWMCON1&=0xFA
//#define                PWM_CLOCK_DIV_8                                        PWMCON1|=0x03;PWMCON1&=0xFB
//#define                PWM_CLOCK_DIV_16                                PWMCON1|=0x04;PWMCON1&=0xFC
//#define                PWM_CLOCK_DIV_32                                PWMCON1|=0x05;PWMCON1&=0xFD
//#define                PWM_CLOCK_DIV_64                                PWMCON1|=0x06;PWMCON1&=0xFE
//#define                PWM_CLOCK_DIV_128                                PWMCON1|=0x07
////--------- PWM I/O select define ------------------------------
//#define                PWM5_P15_OUTPUT_ENABLE                BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;SFRS|=0x01;PIOCON1|=0x20;TA=0xAA;TA=0x55;SFRS&=0xFE;EA=BIT_TMP                                //P1.5 as PWM5 output enable
//#define                PWM5_P03_OUTPUT_ENABLE                PIOCON0|=0x20                                                                                                                                                                                                                //P0.3 as PWM5
//#define                PWM4_P01_OUTPUT_ENABLE                PIOCON0|=0x10                                                                                                                                                                                                                //P0.1 as PWM4 output enable
//#define                PWM3_P04_OUTPUT_ENABLE                BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;SFRS|=0x01;PIOCON1|=0x08;TA=0xAA;TA=0x55;SFRS&=0xFE;EA=BIT_TMP                                //P0.4 as PWM3 output enable
//#define                PWM3_P00_OUTPUT_ENABLE                PIOCON0|=0x08                                                                                                                                                                                                                //P0.0 as PWM3
//#define                PWM2_P05_OUTPUT_ENABLE                BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;SFRS|=0x01;PIOCON1|=0x04;TA=0xAA;TA=0x55;SFRS&=0xFE;EA=BIT_TMP                                //P1.0 as PWM2 output enable
//#define                PWM2_P10_OUTPUT_ENABLE                PIOCON0|=0x04                                                                                                                                                                                                                //P1.0 as PWM2
//#define                PWM1_P14_OUTPUT_ENABLE                BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;SFRS|=0x01;PIOCON1|=0x02;TA=0xAA;TA=0x55;SFRS&=0xFE;EA=BIT_TMP                                //P1.4 as PWM1 output enable
//#define                PWM1_P11_OUTPUT_ENABLE                PIOCON0|=0x02                                                                                                                                                                                                                //P1.1 as PWM1
//#define                PWM0_P12_OUTPUT_ENABLE                PIOCON0|=0x01                                                                                                                                                                                                                //P1.2 as PWM0 output enable
//#define         ALL_PWM_OUTPUT_ENABLE                        PIOCON0=0xFF;PIOCON1=0xFF
//#define                PWM5_P15_OUTPUT_DISABLE                BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;SFRS|=0x01;PIOCON1&=0xDF;TA=0xAA;TA=0x55;SFRS&=0xFE;EA=BIT_TMP                                //P1.5 as PWM5 output disable
//#define                PWM5_P03_OUTPUT_DISABLE                PIOCON0&=0xDF                                                                                                                                                                                                                //P0.3 as PWM5
//#define                PWM4_P01_OUTPUT_DISABLE                PIOCON0&=0xEF                                                                                                                                                                                                                //P0.1 as PWM4 output disable
//#define                PWM3_P04_OUTPUT_DISABLE                BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;SFRS|=0x01;PIOCON1&=0xF7;TA=0xAA;TA=0x55;SFRS&=0xFE;EA=BIT_TMP                                //P0.4 as PWM3 output disable
//#define                PWM3_P00_OUTPUT_DISABLE                PIOCON0&=0xF7                                                                                                                                                                                                                //P0.0 as PWM3
//#define                PWM2_P05_OUTPUT_DISABLE                BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;SFRS|=0x01;PIOCON1&=0xFB;TA=0xAA;TA=0x55;SFRS&=0xFE;EA=BIT_TMP                                //P1.0 as PWM2 output disable
//#define                PWM2_P10_OUTPUT_DISABLE                PIOCON0&=0xFB                                                                                                                                                                                                                //P1.0 as PWM2
//#define                PWM1_P14_OUTPUT_DISABLE                BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;SFRS|=0x01;PIOCON1&=0xFD;TA=0xAA;TA=0x55;SFRS&=0xFE;EA=BIT_TMP                                //P1.4 as PWM1 output disable
//#define                PWM1_P11_OUTPUT_DISABLE                PIOCON0&=0xFD                                                                                                                                                                                                                //P1.1 as PWM1
//#define                PWM0_P12_OUTPUT_DISABLE                PIOCON0&=0xFE                                                                                                                                                                                                                //P1.2 as PWM0 output disable
//#define         ALL_PWM_OUTPUT_DISABLE                PIOCON0=0x00;PIOCON1=0x00
////--------- PWM I/O Polarity Control ---------------------------
//#define                PWM5_OUTPUT_INVERSE                        PNP|=0x20                               
//#define                PWM4_OUTPUT_INVERSE                        PNP|=0x10                               
//#define                PWM3_OUTPUT_INVERSE                        PNP|=0x08                               
//#define                PWM2_OUTPUT_INVERSE                        PNP|=0x04                               
//#define                PWM1_OUTPUT_INVERSE                        PNP|=0x02                               
//#define                PWM0_OUTPUT_INVERSE                        PNP|=0x01                               
//#define                PWM_OUTPUT_ALL_INVERSE        PNP=0xFF
//#define                PWM5_OUTPUT_NORMAL                        PNP&=0xDF                               
//#define                PWM4_OUTPUT_NORMAL                        PNP&=0xEF                               
//#define                PWM3_OUTPUT_NORMAL                        PNP&=0xF7                               
//#define                PWM2_OUTPUT_NORMAL                        PNP&=0xFB                               
//#define                PWM1_OUTPUT_NORMAL                        PNP&=0xFD                               
//#define                PWM0_OUTPUT_NORMAL                        PNP&=0xFE                               
//#define                PWM_OUTPUT_ALL_NORMAL                PNP=0x00
////--------- PWM type define ------------------------------------
//#define                PWM_EDGE_TYPE                                                PWMCON1&=~SET_BIT4
//#define                PWM_CENTER_TYPE                                        PWMCON1|=SET_BIT4
////--------- PWM mode define ------------------------------------
//#define                PWM_IMDEPENDENT_MODE                PWMCON1&=0x3F
//#define                PWM_COMPLEMENTARY_MODE        PWMCON1|=0x40;PWMCON1&=0x7F
//#define                PWM_SYNCHRONIZED_MODE                PWMCON1|=0x80;PWMCON1&=0xBF
//#define         PWM_GP_MODE_ENABLE                        PWMCON1|=0x20
//#define                PWM_GP_MODE_DISABLE                        PWMCON1&=0xDF
////--------- PMW interrupt setting ------------------------------
//#define                PWM_FALLING_INT                                        PWMCON0&=0xF3
//#define                PWM_RISING_INT                                        PWMCON0|=0x04;PWMCON0&=0xF7
//#define                PWM_CENTRAL_POINT_INT                PWMCON0|=0x08;PWMCON0&=0xFB
//#define                PWM_PERIOD_END_INT                        PWMCON0|=0x0C
////--------- PWM interrupt pin select ---------------------------
//#define                PWM_INT_PWM0                                                PWMCON0&=0xFC
//#define                PWM_INT_PWM2                                                PWMCON0|=0x01;PWMCON0&=0xFD
//#define                PWM_INT_PWM4                                                PWMCON0|=0x02;PWMCON0&=0xFE
//#define                PWM_INT_PMW6                                                PWMCON0|=0x03
////--------- PWM Dead time setting ------------------------------
//#define         PWM45_DEADTIME_ENABLE                        BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;PDTEN|=0x04;EA=BIT_TMP
//#define         PWM34_DEADTIME_ENABLE                        BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;PDTEN|=0x02;EA=BIT_TMP
//#define         PWM01_DEADTIME_ENABLE                        BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;PDTEN|=0x01;EA=BIT_TMP
#endif


/************************************************************************************************************
*   PWM interrupt subroutine
************************************************************************************************************/
void PWM_ISR (void) interrupt 13
{
    clr_PWMF;               // clear PWM interrupt flag
    P12 = ~P12;                                                        // GPIO1 show PWM INT
}

/************************************************************************************************************
*    Main function
************************************************************************************************************/
void main(void)
{
    Set_All_GPIO_Quasi_Mode;
/**********************************************************************
        PWM frequency = Fpwm/((PWMPH,PWMPL) + 1) <Fpwm = Fsys/PWM_CLOCK_DIV>
                                                                = (22.1184MHz/8)/(0x3FF + 1)
                                                                = 2.7KHz
***********************************************************************/
                PWM2_P10_OUTPUT_ENABLE;
                PWM_INT_PWM2;       
                PWM_FALLING_INT;                                        //Setting Interrupt happen when PWM0 falling signal
       
                PWM_CLOCK_DIV_8;
                PWMPH = 0x03;                                                        //Setting PWM period
                PWMPL = 0xFF;
                PWM0H = 0x01;                                                        //PWM0 high duty = 1/2 PWM period
                PWM0L = 0xFF;       

                set_EPWM;                                                                        //Enable PWM interrupt
                set_EA;                                                                       
    set_LOAD;
    set_PWMRUN;
                while(1);
}

使用特权

评论回复
评论
Imperator 2019-8-14 11:29 回复TA
为什么我用Keil的逻辑分析仪看P10的波形是个恒定的值,而不是方波。 
14
huangcunxiake|  楼主 | 2018-5-19 15:22 | 只看该作者
死区控制
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2017 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

//***********************************************************************************************************
//  Nuvoton Technoledge Corp.
//  Website: http://www.nuvoton.com
//  E-Mail : MicroC-8bit@nuvoton.com
//  Date   : Apr/21/2017
//***********************************************************************************************************

//***********************************************************************************************************
//  File Function: N76E003 PWM Output with dead time insert demo code
//***********************************************************************************************************

#include "N76E003.h"
#include "Common.h"
#include "Delay.h"
#include "SFR_Macro.h"
#include "Function_define.h"

//*****************  The Following is in define in Fucntion_define.h  ***************************
//****** Always include Function_define.h call the define you want, detail see main(void) *******
//***********************************************************************************************
#if 0
////--------- PMW clock source select define ---------------------
//#define                PWM_CLOCK_FSYS                                        CKCON&=0xBF
//#define                PWM_CLOCK_TIMER1                                CKCON|=0x40
////--------- PWM clock devide define ----------------------------
//#define                PWM_CLOCK_DIV_2                                        PWMCON1|=0x01;PWMCON1&=0xF9
//#define                PWM_CLOCK_DIV_4                                        PWMCON1|=0x02;PWMCON1&=0xFA
//#define                PWM_CLOCK_DIV_8                                        PWMCON1|=0x03;PWMCON1&=0xFB
//#define                PWM_CLOCK_DIV_16                                PWMCON1|=0x04;PWMCON1&=0xFC
//#define                PWM_CLOCK_DIV_32                                PWMCON1|=0x05;PWMCON1&=0xFD
//#define                PWM_CLOCK_DIV_64                                PWMCON1|=0x06;PWMCON1&=0xFE
//#define                PWM_CLOCK_DIV_128                                PWMCON1|=0x07
////--------- PWM I/O select define ------------------------------
//#define                PWM5_P15_OUTPUT_ENABLE                BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;SFRS|=0x01;PIOCON1|=0x20;TA=0xAA;TA=0x55;SFRS&=0xFE;EA=BIT_TMP                                //P1.5 as PWM5 output enable
//#define                PWM5_P03_OUTPUT_ENABLE                PIOCON0|=0x20                                                                                                                                                                                                                //P0.3 as PWM5
//#define                PWM4_P01_OUTPUT_ENABLE                PIOCON0|=0x10                                                                                                                                                                                                                //P0.1 as PWM4 output enable
//#define                PWM3_P04_OUTPUT_ENABLE                BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;SFRS|=0x01;PIOCON1|=0x08;TA=0xAA;TA=0x55;SFRS&=0xFE;EA=BIT_TMP                                //P0.4 as PWM3 output enable
//#define                PWM3_P00_OUTPUT_ENABLE                PIOCON0|=0x08                                                                                                                                                                                                                //P0.0 as PWM3
//#define                PWM2_P05_OUTPUT_ENABLE                BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;SFRS|=0x01;PIOCON1|=0x04;TA=0xAA;TA=0x55;SFRS&=0xFE;EA=BIT_TMP                                //P1.0 as PWM2 output enable
//#define                PWM2_P10_OUTPUT_ENABLE                PIOCON0|=0x04                                                                                                                                                                                                                //P1.0 as PWM2
//#define                PWM1_P14_OUTPUT_ENABLE                BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;SFRS|=0x01;PIOCON1|=0x02;TA=0xAA;TA=0x55;SFRS&=0xFE;EA=BIT_TMP                                //P1.4 as PWM1 output enable
//#define                PWM1_P11_OUTPUT_ENABLE                PIOCON0|=0x02                                                                                                                                                                                                                //P1.1 as PWM1
//#define                PWM0_P12_OUTPUT_ENABLE                PIOCON0|=0x01                                                                                                                                                                                                                //P1.2 as PWM0 output enable
//#define         ALL_PWM_OUTPUT_ENABLE                        PIOCON0=0xFF;PIOCON1=0xFF
//#define                PWM5_P15_OUTPUT_DISABLE                BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;SFRS|=0x01;PIOCON1&=0xDF;TA=0xAA;TA=0x55;SFRS&=0xFE;EA=BIT_TMP                                //P1.5 as PWM5 output disable
//#define                PWM5_P03_OUTPUT_DISABLE                PIOCON0&=0xDF                                                                                                                                                                                                                //P0.3 as PWM5
//#define                PWM4_P01_OUTPUT_DISABLE                PIOCON0&=0xEF                                                                                                                                                                                                                //P0.1 as PWM4 output disable
//#define                PWM3_P04_OUTPUT_DISABLE                BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;SFRS|=0x01;PIOCON1&=0xF7;TA=0xAA;TA=0x55;SFRS&=0xFE;EA=BIT_TMP                                //P0.4 as PWM3 output disable
//#define                PWM3_P00_OUTPUT_DISABLE                PIOCON0&=0xF7                                                                                                                                                                                                                //P0.0 as PWM3
//#define                PWM2_P05_OUTPUT_DISABLE                BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;SFRS|=0x01;PIOCON1&=0xFB;TA=0xAA;TA=0x55;SFRS&=0xFE;EA=BIT_TMP                                //P1.0 as PWM2 output disable
//#define                PWM2_P10_OUTPUT_DISABLE                PIOCON0&=0xFB                                                                                                                                                                                                                //P1.0 as PWM2
//#define                PWM1_P14_OUTPUT_DISABLE                BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;SFRS|=0x01;PIOCON1&=0xFD;TA=0xAA;TA=0x55;SFRS&=0xFE;EA=BIT_TMP                                //P1.4 as PWM1 output disable
//#define                PWM1_P11_OUTPUT_DISABLE                PIOCON0&=0xFD                                                                                                                                                                                                                //P1.1 as PWM1
//#define                PWM0_P12_OUTPUT_DISABLE                PIOCON0&=0xFE                                                                                                                                                                                                                //P1.2 as PWM0 output disable
//#define         ALL_PWM_OUTPUT_DISABLE                PIOCON0=0x00;PIOCON1=0x00
////--------- PWM I/O Polarity Control ---------------------------
//#define                PWM5_OUTPUT_INVERSE                        PNP|=0x20                               
//#define                PWM4_OUTPUT_INVERSE                        PNP|=0x10                               
//#define                PWM3_OUTPUT_INVERSE                        PNP|=0x08                               
//#define                PWM2_OUTPUT_INVERSE                        PNP|=0x04                               
//#define                PWM1_OUTPUT_INVERSE                        PNP|=0x02                               
//#define                PWM0_OUTPUT_INVERSE                        PNP|=0x01                               
//#define                PWM_OUTPUT_ALL_INVERSE        PNP=0xFF
//#define                PWM5_OUTPUT_NORMAL                        PNP&=0xDF                               
//#define                PWM4_OUTPUT_NORMAL                        PNP&=0xEF                               
//#define                PWM3_OUTPUT_NORMAL                        PNP&=0xF7                               
//#define                PWM2_OUTPUT_NORMAL                        PNP&=0xFB                               
//#define                PWM1_OUTPUT_NORMAL                        PNP&=0xFD                               
//#define                PWM0_OUTPUT_NORMAL                        PNP&=0xFE                               
//#define                PWM_OUTPUT_ALL_NORMAL                PNP=0x00
////--------- PWM type define ------------------------------------
//#define                PWM_EDGE_TYPE                                                PWMCON1&=~SET_BIT4
//#define                PWM_CENTER_TYPE                                        PWMCON1|=SET_BIT4
////--------- PWM mode define ------------------------------------
//#define                PWM_IMDEPENDENT_MODE                PWMCON1&=0x3F
//#define                PWM_COMPLEMENTARY_MODE        PWMCON1|=0x40;PWMCON1&=0x7F
//#define                PWM_SYNCHRONIZED_MODE                PWMCON1|=0x80;PWMCON1&=0xBF
//#define         PWM_GP_MODE_ENABLE                        PWMCON1|=0x20
//#define                PWM_GP_MODE_DISABLE                        PWMCON1&=0xDF
////--------- PMW interrupt setting ------------------------------
//#define                PWM_FALLING_INT                                        PWMCON0&=0xF3
//#define                PWM_RISING_INT                                        PWMCON0|=0x04;PWMCON0&=0xF7
//#define                PWM_CENTRAL_POINT_INT                PWMCON0|=0x08;PWMCON0&=0xFB
//#define                PWM_PERIOD_END_INT                        PWMCON0|=0x0C
////--------- PWM interrupt pin select ---------------------------
//#define                PWM_INT_PWM0                                                PWMCON0&=0xFC
//#define                PWM_INT_PWM2                                                PWMCON0|=0x01;PWMCON0&=0xFD
//#define                PWM_INT_PWM4                                                PWMCON0|=0x02;PWMCON0&=0xFE
//#define                PWM_INT_PMW6                                                PWMCON0|=0x03
////--------- PWM Dead time setting ------------------------------
//#define         PWM45_DEADTIME_ENABLE                        BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;PDTEN|=0x04;EA=BIT_TMP
//#define         PWM34_DEADTIME_ENABLE                        BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;PDTEN|=0x02;EA=BIT_TMP
//#define         PWM01_DEADTIME_ENABLE                        BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;PDTEN|=0x01;EA=BIT_TMP
#endif

void PWM_DEAD_TIME_VALUE(UINT16        DeadTimeData)
{
        UINT8 deadtmphigh,deadtmplow;
        deadtmplow = DeadTimeData;
        deadtmphigh = DeadTimeData>>8;
        BIT_TMP = EA;
        if (deadtmphigh==0x01)
        {
                EA = 0;
                TA = 0xAA;
                TA = 0x55;
                PDTEN|=0x10;
        }
        TA = 0xAA;
        TA = 0x55;
        PDTCNT = deadtmplow;
        EA = BIT_TMP;
}
//------------------- PWM Define End ------------------------------

/************************************************************************************************************
*    Main function
*                 PWM4 P0.5 simple output a 2.7KHz 1/4high duty signal
************************************************************************************************************/
void main(void)
{
    Set_All_GPIO_Quasi_Mode;
/*-----------------------------------------------------------------------------------------------------------------
        PWM frequency         = Fpwm/((PWMPH,PWMPL)+1) = (16MHz/8)/(0x7CF+1) = 1KHz (1ms)
        PWM4 high duty         = PWM4H,PWM4L = 0x01CF = 1/4 PWM period
        PWM0 high duty         = PWM0H,PMW0L = 0x03CF = 1/2 PWM period
        Dead time                         = 0x1FF <PDTEN.4+PDTCNT[7:0]>/Fsys = 0x1FF/Fsys = 512/16000000 = 32 us (max value)
-----------------------------------------------------------------------------------------------------------------*/
                PWM0_P12_OUTPUT_ENABLE;
                PWM1_P11_OUTPUT_ENABLE;
                PWM4_P01_OUTPUT_ENABLE;
                PWM5_P15_OUTPUT_ENABLE;

       
                PWM_COMPLEMENTARY_MODE;                                        //Only this mode support deat time function
                PWM_CLOCK_DIV_8;
                PWMPH = 0x07;
                PWMPL = 0xCF;

                PWM0H = 0x03;
                PWM0L = 0xCF;
                set_SFRPAGE;                                                                                // PWM4 and PWM5 duty value need set SFPPAGE 1
                PWM4H = 0x01;
                PWM4L = 0xCF;
                clr_SFRPAGE;
               
                PWM01_DEADTIME_ENABLE;
                PWM45_DEADTIME_ENABLE;
                PWM_DEAD_TIME_VALUE(0x1FF);                        //value never over 0x1FF
               
//Please always setting Dead time if needed before PWM run.               
    set_LOAD;
    set_PWMRUN;
                while(1);               
}

使用特权

评论回复
15
xinpian101| | 2018-5-19 15:49 | 只看该作者
捋顺了,容易懂。

使用特权

评论回复
16
wahahaheihei| | 2018-5-19 21:47 | 只看该作者
详细的教程,讲的很透彻。这个中断是有什么用,那么断的时间。

使用特权

评论回复
17
dongliushui| | 2018-5-19 23:03 | 只看该作者
通过插入可配置的死区时间,保护MOS管同时导通。

使用特权

评论回复
18
xixi2017| | 2018-5-20 23:24 | 只看该作者
死区让占空比无形中降低了。

使用特权

评论回复
19
antusheng| | 2018-5-20 23:58 | 只看该作者
刚好够控制无刷电机的。

使用特权

评论回复
20
捉虫天师| | 2018-5-21 17:39 | 只看该作者
不会立即更新PWM周期和占空比,直到寄存器 LOAD (PWMCON0.6) 置1后和当前周期完成。用于防止产生非完整周期或占空比的PWM波形。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

189

主题

3407

帖子

9

粉丝