SVPWM 源程序
第 15 章 用 TMS320LF2407 实现空间矢量 PWM(SVPWM)
15.3 利用 TMS320LF240x 实现 SVPWM 算法的程序
下面给出了利用 TMS320LF2407 实现 SVPWM 算法的一个应用程序。在该程序中,我们假设有 200 个电
压矢量 Uout 平均分布在电角度为 2π 的范围内,通过改变 SVPWM 的调制周期 T 可以改变输出的 3 相正
弦波的频率。
源程序代码:
(1) 所需的复位和中断矢量定义文件“vectors.asm”请读者参考本书相关章节。
(2) 主程序
// 该程序用于简单的 SVPWM 演示,产生 3 相互差 120 度电角度的正弦交流电压,此程序实
// 时计算 cmp1 和 cmp2 的值
#include "register.h"
#include "float.h"
#include "math.h"
float ualfa[200],ubeta[200]; // 存储电压矢量 Uout 的(α,β)轴分量 ualfa、ubeta 的数组
int sector[200]; // 定义存储扇区数的数组
#define PI2 2*3.1415926 // 定义 2π 的值
#define DETA PI2/200 // 定义相临两个 Uout 之间的电角度的差值
#define INIA 3.1415926/180 // 定义 Uout 的初始电角度
#define TP 1200 // t1 的周期寄存器的值,其值等于 SVPWM 调制周期 T 的一半,
// 因为在该程序中 2π 电角度内 Uout 的点数一定,故改变此值
// 可以改变输出的 3 相正弦交流电压的频率
#define KP 0.7 // 定义 Uout 的标幺值,KP 的值在 0 和 1 之间,改变此值可以
// 改变逆变桥输出电压的幅值
// 屏蔽中断子程序
void inline disable()
{
asm(" setc INTM");
}
// 系统初始化子程序
viod initial()
{
*IFR=0xFFFF; // 清除所有的中断标志
*IMR=0X0; // 屏蔽所有中断
*SCSR1=0x81FE; // CLKIN=6M,CLKOUT=24M
*WDCR=0xE8; // 不使能看门狗
*T3PER=TP; // 通用定时器 1 的周期=PWM 的周期/指令周期/2
*T3CON=0X0802; // 设置通用定时器 1 为连续增减模式,以产生对称的 PWM,
// 且为了便于调试,使仿真一挂起时时钟就停止运行
*ACTRB=0X666; // PWM7、9、11 高有效,PWM8、10、12 低有效
*COMCONB=0X9200; // 使能 PWM 输出和比较动作
*EVBIMRA=0X00; // 禁止 EVB 和时钟及比较有关的中断
*T3CNT=0X00; // T1 的计数器清 0