您的当前位置:首页正文

SPWM波形产生及代码编写

2020-04-25 来源:意榕旅游网
4.2 SPWM波形生产及驱动算法的编写

由于4.1节中只有方案(d)可成功实现电容侧电压的正确采样,因此下面只对这种方式的算法进行说明。

根据ATxmegaD4芯片资料,设定单片机工作在双斜坡操作(Dual-slope PWM)模式下,输出的PWM频率,也即载波频率,可以通过下列公式计算得到:

fPWM_DSfclkPER

2NPER式中:fclk为芯片时钟频率(32MHz);N代表分频系数(1、8、64、256或1024);通过调整PER值可以调整载波频率。我们认为一个周期40个点可以准确地描述一个完整波形,因此假定电机驱动频率为f,则载波频率40f即可。相应PER取值为:

PERfclkPER

2N40f 比如:为了产生40Hz的交流电,具体芯片各个寄存器设置情况及代码如表4.2所示:

表4.2 各寄存器设置及设置代码编写

模式5WGMODE21WGMODE10WGMODE01波形产生位描述定时器/计数器工作模式计数上限值TOPDual-slope PWMPERvoid Setup_timer_DS_T(void) 更新时刻BOTTOMOVF标志设置TOP注:为了产生40Hz的频率,载波频率为1600Hz,N取值为8,PER值为1250。CLKSEL30时钟选择位描述CLKSEL2CLKSEL110中断方式描述OVFINTLVL1OVFINTLVL011CLKSEL00{ TCC0.CTRLA=TC_CLKSEL_DIV8_gc; TCC0.CTRLB=TC_WGMODE_DS_T_gc; //Prescale: Clk/8 //Mode: Dual-slope PWM 注:变量N为8中断方式溢出中断TCC0.INTCTRLA=TC_OVFINTLVL_HI_gc; //HIGH-level interrupt //TCC0.PER=125;//f_PWM=f_clk/(2*N*PER)=32M/(2*8*1250)=1600Hz 中断级别 HI}

通过表4.2各寄存器的设置,确定了载波频率(40*f)、中断方式(溢出中断)、PWM模式(双边中心对齐)。但是为了输出四路SPWM还需要建立正弦波样本表,下图为两路呈180度的正弦波样本表,另外两路为其互补形式。

double sine40_UP[]={ }; double sine40_VP[]={ }; 1.0000, 0.9969, 0.9877, 0.9724, 0.9511, 0.9239, 0.8910, 0.8526, 0.8090, 0.7604, 0.7071, 0.6494, 0.5878, 0.5225, 0.4540, 0.3827, 0.3090, 0.2334, 0.1564, 0.0785, 0.0000, 0.0785, 0.1564, 0.2334, 0.3090, 0.3827, 0.4540, 0.5225, 0.5878, 0.6494, 0.7071, 0.7604, 0.8090, 0.8526, 0.8910, 0.9239, 0.9511, 0.9724, 0.9877, 0.9969, 0.0000, 0.0785, 0.1564, 0.2334, 0.3090, 0.3827, 0.4540, 0.5225, 0.5878, 0.6494, 0.7071, 0.7604, 0.8090, 0.8526, 0.8910, 0.9239, 0.9511, 0.9724, 0.9877, 0.9969, 1.0000, 0.9969, 0.9877, 0.9724, 0.9511, 0.9239, 0.8910, 0.8526, 0.8090, 0.7604, 0.7071, 0.6494, 0.5878, 0.5225, 0.4540, 0.3827, 0.3090, 0.2334, 0.1564, 0.0785,

在一个周期内,内部硬件会不断地在一个载波周期内输出一个三角波,定时/计数器在计数过程中,通过不断与样本表比较匹配,产生一组呈正弦变化的方波序列,就形成了SPWM。通过四路SPWM及逆变电路即可产生所需的输入电压。

图4.7 Dual-slope PWM时序图

为了使逆变模块成功输出图4.1波形,还需要插入死区时间,防止上、下桥臂同时导通引起短路。由于ATxmegaD4自带电机模块(AWeX),只要设定死区时间,就能避免短路发生。

#define DEAD_TIME_CYCLES 96 //(DEAD_TIME_CYCLE/32) us 96/32us=3us void SPWM_driver_SS_2(void) { } TCC0.CCCBUF=Scale*(TCC0.PER-1)*sine40_UP[icnt]; TCC0.CCDBUF=Scale*(TCC0.PER-1)*sine40_VP[icnt];

最终获得的四路SPWM如下如所示,插入的死区时间为3us,大于IGBT开关时间1.5us。

死区时间

图4.8 四路SPWM及死区时间的设置

因篇幅问题不能全部显示,请点此查看更多更全内容