DSP

N76E003 PWM程序及分析2(互补模式&死区插入)

2019-07-13 20:59发布

互补模式是N76E003单片机提供的第二种PWM输出模式,相较于上一次我们所讨论的N76E003 PWM 程序及分析(边沿对齐、独立输出模式),我们下面就来看看此种模式有合不同。 首先我们需要了解,什么是“死区时间
通常,大功率电机、变频器等,末端都是由大功率管、IGBT等元件组成的H桥或3相桥。每个桥的上半桥和下半桥是是绝对不能同时导通的,但高速的PWM驱动信号在达到功率元件的控制极时,往往会由于各种各样的原因产生延迟的效果,造成某个半桥元件在应该关断时没有关断,造成功率元件烧毁。死区就是在上半桥关断后,延迟一段时间再打开下半桥或在下半桥关断后,延迟一段时间再打开上半桥,从而避免功率元件烧毁。这段延迟时间就是死区。(就是上、下半桥的元件都是关断的)死区时间控制在通常的低端单片机所配备的PWM中是没有的。死区时间是PWM输出时,为了使H桥或半H桥的上下管不会因为开关速度问题发生同时导通而设置的一个保护时段,所以在这个时间,上下管都不会有输出。
其次,我们需要看看什么是“互补模式
在这里插入图片描述
如上图,是在另一篇文章N76E003 PWM之极性控制中使用P0.1和P0.3两个管脚,程序中PWM5为极性控制输出,PWM4为正常输出,占空比均设定为0.25ms,周期1ms
上图就可以看做是没有插入死区的互补模式。
在这里插入图片描述
上图就是带死区时间的互补模式(源自官方手册) 理解了互补模式&死区后,接下来就让我们来看看相关寄存器如何配置。 在这里插入图片描述
首先将PWMMOD配置为互补模式 set_PWMMOD0; clr_PWMMOD1;
在该模式中PG0/2/4输出信号与独立模式下输出信号相
同,但PG1/3/5 输出与PG0/2/4输出的信号互补。 同时忽略PG1/3/5占空比寄存器{PWMnH, PWMnL}
(n:1/3/5)。
在这里插入图片描述
在这里插入图片描述
具体的死区时间设置,需要查看使用开关管的开通与关断的时间,即DT>TON+TOFF
在此例程中,我们设定为5us
(PS:补充说明,之前例程中测量的死区时间,与设计时间差距严重,之后再翻阅新唐官方例程中,发现其使用了如下函数进行较为准确的死区时间设定,故在此修改本程序,望周知) #include "N76E003.h" #include "Common.h" #include "Delay.h" #include "SFR_Macro.h" #include "Function_define.h" //此PWM_DEAD_TIME_VALUE引用自新唐官方例程 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; } /* PWM5_P03输出1khz频率,0.5ms占空比的PWM */ void main(void) { Set_All_GPIO_Quasi_Mode;//所有IO设置为双向模式 PWM5_P03_OUTPUT_ENABLE;//使能PWM5,通过P03引脚输出 PWM4_P01_OUTPUT_ENABLE; // PWM2_P10_OUTPUT_DISABLE; // PWM_IMDEPENDENT_MODE; clr_PWMTYP;//边沿对齐模式 set_PWMMOD0;//设置为独立输出模式 clr_PWMMOD1; set_PDT45EN;//使能死区 PWM_CLOCK_DIV_8;//8分频模式 PWMPH = 0x07;//1999(Dec)1ms周期 PWMPL = 0xCF; // PDTCNT=0x09;//设定死区时间5us(必须放在使能死区后,此种方法使用,得到的死区时间不准确) PWM_DEAD_TIME_VALUE(9); /********************************************************************** PWM frequency = Fpwm/((PWMPH,PWMPL) + 1) = (16MHz/8)/(0x7CF + 1) = 1KHz (1ms) PWMDT=(PDTCNT+1)/Fpwm =10/2Mhz=0.005ms ***********************************************************************/ set_SFRPAGE;//PWM4 and PWM5 duty seting is in SFP page 1 PWM4H = 0x01;//500(Dec) PWM4L = 0xf4; clr_SFRPAGE; set_LOAD;//载入周期和占空比 set_PWMRUN;//开始输出PWM while(1) { //构建你的代码,LOAD会自动重载,PWM持续输出。 } } 在这里插入图片描述在这里插入图片描述 最终效果如上图所示(由于时间太短,直接观察效果不明显,故使用两张图拼接)