📄 spwm.c
字号:
#include "IQmathLib.h"
#include "DSP281x_Device.h"
#include <math.h>
#include "parameter.h"
//#define CPU_CLOCK_SPEED 6.6667L // for a 150MHz CPU clock speed
#define DELAY_US(A) DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_CLOCK_SPEED) - 9.0L) / 5.0L)
#define ADC_usDELAY 5000L
#define ADC_usDELAY2 20L
#define PI 3.14159265358979
#define PI23 2.094395102
#define PI43 4.188790204
// 定义指示灯控制寄存器地址和寄存器类型
#define LBDS (*((unsigned int *)0xc0000))
// 定义拨码开关控制寄存器地址和寄存器类型
#define DIPS (*(unsigned int *)0xc0001)
//global variable definition
int k = 0;
_iq F2M=_IQ(0.018); //调制度对调制波频率的比例系数0.9/50
_iq21 PITC = _IQ21(0.0001*PI); //PI倍载波周期,original value is"0.0001*PI"
int T_QUA = 1875; //Tc/4的定时器计数脉冲个数,定时周期为100us(7500个脉冲)
_iq16 F_CARR = _IQ16(10000); //载波频率,10KHz,original value is"10000"
_iq16 F_MODU = _IQ16(50); //调制波频率
int PMIN = 600; //最小正脉宽(脉冲个数)。
int PMAX = 6900; //最小负脉宽时的最大正脉宽(脉冲个数)。
int Pperiod = 7500; //一个周期的脉冲数
int N,KMAX; //载波比N,K循环次数KMAX
_iq M; //调制度
_iq TEMP1,TEMP2,TEMP3,TEMP4,TEMP5,TEMP6;
_iq16 Q16TEMP1,Q16TEMP2,Q16TEMP3,Q16TEMP4,Q16TEMP5,Q16TEMP6;
int PULSE1 = 0;
int PULSE2,PULSE3;
//main function
void main(void)
{
//system initialization
InitSysCtrl();
//Disable and clear all of the cpu interrupts:
DINT;
IER = 0x0000;
IFR &= 0x0000;
//Initialize PIE to the default status:
InitPieCtrl();
//Initialize PIE vector table:
InitPieVectTable();
// Enable PIE group 2 interrupt 6 for T1UFINT
PieCtrlRegs.PIEIER2.all = M_INT6;
// Enable CPU INT2 for ADCINT:
IER |= M_INT2;
EINT;
ERTM;
//F_MODU = _IQ16(50); //调制波频率
N = _IQ16int(_IQ16div(F_CARR,F_MODU));
KMAX = 2*N;
M = _IQmpy(F2M,_IQ16toIQ(F_MODU));
//Initialize EVA: HSPCLK=7.5 MHz(0.133333333us)
EvaRegs.COMCONA.all=0x06E0; //禁止比较操作;不使能空间矢量PWM方式;T3CNT下溢或周期匹配时重装载ACTRA
//PWM1-6输出由相应比较逻辑驱动。
EvaRegs.ACTRA.all = 0x0999; //;CMP1,3,5高有效,CMP2,4,6低有效
EvaRegs.T1CON.all = 0x0802; //一旦仿真挂起,立即停。连续增/减计数模式。
//输入时钟预定标系数X/1。使用内部CPU时钟,禁止定时器操作
EvaRegs.COMCONA.all = 0x8200;
EvaRegs.EVAIMRA.bit.T1UFINT = 1;//使能定时器1下溢中断
EvaRegs.T1PR = 0x0EA6; //Time1周期寄存器写入3750,定时100us。
EvaRegs.DBTCONA.all = 0x0CFC; //定时PWM死区时间5 us
EvaRegs.CMPR1 = 0x1D4C; //占空比初值0%
EvaRegs.CMPR2 = 0x1D4C;
EvaRegs.CMPR3 = 0x1D4C;
EvaRegs.T1CON.bit.TENABLE = 1; //使能定时器1
//Initialize GPIO:
EALLOW;
GpioMuxRegs.GPAMUX.all = 0x003F; //将GPIOA0-GPINA5(PWM1-PWM6)配置为外设I/O端口
GpioMuxRegs.GPADIR.all = 0x007F; //将GPIOA0-GPINA5(PWM1-PWM6)配置为输出,T1PWM作为run输出信号
GpioMuxRegs.GPDMUX.all = 0x0001; //将GPIOD0(PDPINTA)配置为外设I/O端口
GpioMuxRegs.GPDDIR.all = 0x0000; //将GPIOD0(PDPINTA)配置为输入
EDIS;
PieVectTable.T1UFINT = & T1UFINT_ISR;
//Loop and wait
//for(;;);
while ( 1 )
{
LBDS=DIPS; // 读取拨码开关状态直接送指示灯显示
GpioDataRegs.GPADAT.all = DIPS<<6;
}
}
interrupt void T1UFINT_ISR(void)
{
TEMP1 = _IQ21toIQ(_IQ21mpy(_IQ21(k),PITC));
TEMP1 = _IQmpy(TEMP1,_IQ16toIQ(F_MODU));
TEMP2 = TEMP1+_IQ(PI23);
if((TEMP2-_IQmpy(_IQ(2),_IQ(PI))) > _IQ(0))
TEMP2 = TEMP2-_IQmpy(_IQ(2),_IQ(PI));
TEMP3 = TEMP1+_IQ(PI43);
if((TEMP3-_IQmpy(_IQ(2),_IQ(PI))) > _IQ(0))
TEMP3 =TEMP3-_IQmpy(_IQ(2),_IQ(PI));
TEMP1 = _IQmpy(M,_IQsin(TEMP1));
TEMP2 = _IQmpy(M,_IQsin(TEMP2));
TEMP3 = _IQmpy(M,_IQsin(TEMP3));
TEMP1 = _IQ(1)+TEMP1;
TEMP2 = _IQ(1)+TEMP2;
TEMP3 = _IQ(1)+TEMP3;
Q16TEMP1 = _IQ16mpy(_IQ16(T_QUA),_IQtoIQ16(TEMP1));
Q16TEMP2 = _IQ16mpy(_IQ16(T_QUA),_IQtoIQ16(TEMP2));
Q16TEMP3 = _IQ16mpy(_IQ16(T_QUA),_IQtoIQ16(TEMP3));
k=k+1;
TEMP4 = _IQ21toIQ(_IQ21mpy(_IQ21(k),PITC));
TEMP4 = _IQmpy(TEMP4,_IQ16toIQ(F_MODU));
TEMP5 = TEMP4+_IQ(PI23);
if((TEMP5-_IQmpy(_IQ(2),_IQ(PI))) > _IQ(0))
TEMP5 = TEMP5-_IQmpy(_IQ(2),_IQ(PI));
TEMP6 = TEMP4+_IQ(PI43);
if((TEMP6-_IQmpy(_IQ(2),_IQ(PI))) > _IQ(0))
TEMP6 = TEMP6-_IQmpy(_IQ(2),_IQ(PI));
TEMP4 = _IQmpy(M,_IQsin(TEMP4));
TEMP5 = _IQmpy(M,_IQsin(TEMP5));
TEMP6 = _IQmpy(M,_IQsin(TEMP6));
TEMP4 = _IQ(1)+TEMP4;
TEMP5 = _IQ(1)+TEMP5;
TEMP6 = _IQ(1)+TEMP6;
Q16TEMP4 = _IQ16mpy(_IQ16(T_QUA),_IQtoIQ16(TEMP4));
Q16TEMP5 = _IQ16mpy(_IQ16(T_QUA),_IQtoIQ16(TEMP5));
Q16TEMP6 = _IQ16mpy(_IQ16(T_QUA),_IQtoIQ16(TEMP6));
Q16TEMP1=Q16TEMP1+Q16TEMP4;
Q16TEMP2=Q16TEMP2+Q16TEMP5;
Q16TEMP3=Q16TEMP3+Q16TEMP6;
PULSE1 = _IQ16int(Q16TEMP1); //C相脉宽(脉冲数)
PULSE2 = _IQ16int(Q16TEMP2); //B相脉宽(脉冲数)
PULSE3 = _IQ16int(Q16TEMP3); //A相脉宽(脉冲数)
if(PULSE1<PMIN)
PULSE1 = 0;
else if(PULSE1>PMAX)
PULSE1 = Pperiod;
if(PULSE2<PMIN)
PULSE2 =0;
else if(PULSE2>PMAX)
PULSE2 = Pperiod;
if(PULSE3<PMIN)
PULSE3 =0;
else if(PULSE3>PMAX)
PULSE3 = Pperiod;
PULSE1 = (Pperiod-PULSE1)/2;
PULSE2 = (Pperiod-PULSE2)/2;
PULSE3 = (Pperiod-PULSE3)/2;
EvaRegs.CMPR1 = PULSE1;
EvaRegs.CMPR2 = PULSE2;
EvaRegs.CMPR3 = PULSE3;
k=k+1;
if(k>KMAX)
k = 0;
//清除中断标志
EvaRegs.EVAIFRA.bit.T1UFINT = 1;
PieCtrlRegs.PIEACK.bit.ACK2 = 1;
IER |= M_INT2;
EINT;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -