打印
[技术问答]

新唐N76E003关于死区最小时间

[复制链接]
1690|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 liuqian0806 于 2018-5-17 00:13 编辑

在使用新唐N76E003单片机PWM互补模式下,2分频、频率23.4KHZ,        PWMPH = 0x01;PWMPL = 0x54;PWM0H = 0x00;PWM0L = 0xAA; PDTCNT死区时间设置0x00死区时间也是15us左右,死区比PWM高电平时间还长了,我打算做一个闭环电源,PWM波形希望和SG3525一样,谁知道麻烦给知道下。

TIM截图20180517000827.jpg (242.21 KB )

波形图片

波形图片
沙发
dongnanxibei| | 2018-5-18 22:57 | 只看该作者
应该是没有设置对。死区控制是不是还有其他寄存器。

使用特权

评论回复
板凳
huangcunxiake| | 2018-5-19 10:14 | 只看该作者
意思是设置了无效?试试老版本的库函数。

使用特权

评论回复
地板
huangcunxiake| | 2018-5-19 10:15 | 只看该作者
老版本的头文件。

使用特权

评论回复
5
huangcunxiake| | 2018-5-19 10:17 | 只看该作者
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* 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);               
}

使用特权

评论回复
6
huangcunxiake| | 2018-5-19 10:17 | 只看该作者
用这个例子里的函数实现。

使用特权

评论回复
7
xinpian101| | 2018-5-19 15:59 | 只看该作者
死区比PWM高电平时间还长?怎么可能死区是在高电平上减掉一部分的。死区永远小于高电平的。

使用特权

评论回复
8
yiy| | 2018-5-20 16:03 | 只看该作者
概念上搞错了。

使用特权

评论回复
9
xixi2017| | 2018-5-20 22:53 | 只看该作者
开玩笑呢,死区要有互补的PWM才叫死区,而且死区是小于高电平的。

使用特权

评论回复
10
xixi2017| | 2018-5-20 22:53 | 只看该作者
也就是让上升沿开始的地方少一部分,叫死区。

使用特权

评论回复
11
小灵通2018| | 2018-5-21 20:23 | 只看该作者
概念就不对吧,你两个波都贴出来。

使用特权

评论回复
12
734774645| | 2018-5-21 23:33 | 只看该作者
看了你的配置和波形,没毛病啊,你是不是理解错死区是啥了。

使用特权

评论回复
13
自己和自己玩| | 2018-9-12 09:32 | 只看该作者
不错

使用特权

评论回复
14
tianxj01| | 2018-9-12 10:24 | 只看该作者
本帖最后由 tianxj01 于 2018-9-12 10:26 编辑

SG3525模式?你是驱动半桥类型的吧,这和互补模式没有半毛钱关系啊,这是2路同步PWM输出,相位差90°的概念。也不需要死区概念。用PWM的中心对齐模式,2个输出数字比较器分别是满分辨率数字的互补就可以了。
比如pwm0是满位256,那么pwm0=255,极性为正。pwm1=1,极性为负,这样就可以直接输出相位差为90°的导通时间为1的脉冲。每次刷新pwm只需要更新PWM0=256-T,PWM1=T就可以。这里控制时候到是有个死区概念,就是控制T<128-死区时间。(由于采用中心对齐方式,实际分辨率降低一半)

使用特权

评论回复
15
tianxj01| | 2018-9-12 10:41 | 只看该作者
用中央对齐方式,极性互为相反,PWM数字互补的2路PWM,产生90°互补单极性驱动是唯一正确的方法,纯硬件,只需要异步刷新pwm数据即可。
见过采用失败的乒乓模式,用一路输出开放另外一路同时关闭自己。中断处理,时间资源占用可想而知,关键是如果中断冲突,理论上就是灾难,所以注定是失败的。

使用特权

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

本版积分规则

1

主题

2

帖子

0

粉丝