This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Code Composer Studio
您好!
我使用以下 CCS 程序来帮助三相逆变器的正弦 PWM。
我正在获得输出、但我对采样时间有疑问、尤其是在两条线路之后
SAMPLE_TIME = 20000.0/(200.0*A);
ConfigCpuTimer (&CpuTimer0、150、sample_time);
应花费多少采样时间。 对于不同样本、iAM 会在输出中发生变化。
请帮助。 如果您有用于三相逆变器的正弦 PWM 的其他代码、请发送。
以下是程序:
void main (void)
{
InitSysCtrl(); // DSP2833x_sysctrl.c 中的基本内核初始化
EALLOW;
SysCtrlRegs.WDCR= 0x00AF; //重新启用看门狗
EDIS; // 0x00AF 要不禁用看门狗、预分频器= 64
Dint; //禁用所有中断
GPIO_SELECT(); //选择所需的引脚作为输出
InitPieCtrl(); // PIE 表的基本设置;
InitPieVectTable(); // PIE 中的默认 ISR
EALLOW;
PieVectTable.TINT0 =&CPU_timer0_ISR;
EDIS;
InitCpuTimer(); //基本设置 CPU Timer0、1和2
PieCtrlRegs.PIEIER1.bit.INTx7=1;
IER |=1; //为 ePWM1启用 INT3
EINT;
ERTM;
SETUP_ePWM1 (); // ePWM 引脚初始化
SAMPLE_TIME = 20000.0/(200.0*A);
ConfigCpuTimer (&CpuTimer0、150、sample_time);
CpuTimer0Regs.TCR.bit.TSS = 0; //启动 timer0
while (1)
{
while (CpuTimer0.InterruptCount = 0);
CpuTimer0.InterruptCount = 0;
EALLOW;
SysCtrlRegs.WDKEY = 0x55; //服务 WD #1
EDIS;
sine_value1 =(a*sin (2*3.141593* index/200.0)+0.9999)/2.0;
EPwm1Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD -_IQsat (_IQ10mpy (_IQ10 (sine_value1)、EPwm1Regs.TBPRD)、EPwm1Regs.TBPRD、0);
sine_value2 =(a*sin (((2*3.141593*index/200.0)+(2*3.141593/3))+0.9999)/2.0;
EPwm2Regs.CMPA.half.CMPA = EPwm2Regs.TBPRD -_IQsat (_IQ10mpy (_IQ10 (sine_value2)、EPwm2Regs.TBPRD)、EPwm2Regs.TBPRD、0);
sine_value3 =(a*sin (((2*3.141593* index/200.0)+(4*3.141593/3))+0.9999)/2.0;
EPwm3Regs.CMPA.half.CMPA = EPwm3Regs.TBPRD -_IQsat (_IQ10mpy (_IQ10 (sine_value3)、EPwm3Regs.TBPRD)、EPwm3Regs.TBPRD、0);
索引+=1; //转到下一个样本
如果(索引>199)索引=0;
} // while 循环结束
}// main 的末尾()
void GPIO_select (void)
{
EALLOW;
GpioCtrlRegs.GPAMUX1.ALL = 0; // GPIO15... GPIO0 =通用尸体 I/O
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // ePWM1A 有效
GpioCtrlRegs.GPAMUX1.bit.GPIO1=1; // ePWM1B 激活
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1; // ePWM2A 有效
GpioCtrlRegs.GPAMUX1.bit.GPIO3=1; // ePWM2B 有效
GpioCtrlRegs.GPAMUX1.bit.GPIO4=1; // ePWM3A 激活
GpioCtrlRegs.GPAMUX1.bit.GPIO5=1; // ePWM3B 有效
GpioCtrlRegs.GPAMUX2.ALL = 0; // GPIO31... GPIO16 =通用 I/O
GpioCtrlRegs.GPBMUX1.ALL = 0; // GPIO47... GPIO32 =通用 I/O
GpioCtrlRegs.GPBMUX2.ALL = 0; // GPIO63... GPIO48 =通用 I/O
GpioCtrlRegs.GPCMUX1.ALL = 0; // GPIO79... GPIO64 =通用 I/O
GpioCtrlRegs.GPCMUX2.ALL = 0; // GPIO87... GPIO80 =通用 I/O
GpioCtrlRegs.GPADIR.ALL = 0;
GpioCtrlRegs.GPBDIR.ALL = 0xFFFFFFFF; //
GpioCtrlRegs.GPCDIR.ALL = 0xFFFFFFF; //
EDIS;
}
void Setup_ePWM1 (void)
{
//EPwm1Regs.TBCTL.ALL = 0xC932;
EPwm1Regs.TBCTL.bit.CLKDIV = 0; // CLKDIV = 1
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0; // HSPCLKDIV = 1
EPwm1Regs.TBCTL.bit.CTRMODE = 2; //向上-向下计数模式
EPwm1Regs.AQCTLA.ALL = 0x0060; //在 CMPA 上设置 ePWM1A
EPwm1Regs.TBPRD =(150000*1000/(2100*2.0)); // 2.100KHz 的定时器周期
EPwm1Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD / 2; //首先占空比为50%
EPwm1Regs.CMPB = EPwm1Regs.TBPRD/2;
EPwm1Regs.DBRED = 19; // 2微秒死区
EPwm1Regs.DBFED = 19;
EPwm1Regs.DBCTL.bit.OUT_MODE = 3;
EPwm1Regs.DBCTL.bit.POLSEL = 2;
EPwm1Regs.DBCTL.bit.IN_MODE = 0;
///----------------------------------------------
EPwm2Regs.TBCTL.bit.CLKDIV = 0; // CLKDIV = 1
EPwm2Regs.TBCTL.bit.HSPCLKDIV = 0; // HSPCLKDIV = 1
EPwm2Regs.TBCTL.bit.CTRMODE = 2; //向上-向下计数模式
EPwm2Regs.AQCTLA.ALL = 0x0060; //在 CMPA 上设置 ePWM2A
EPwm2Regs.TBPRD =(150000*1000/(2100*2.0)); // 2.100KHz 的定时器周期
EPwm2Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD / 2; //首先占空比为50%
EPwm2Regs.CMPB = EPwm1Regs.TBPRD/2;
EPwm2Regs.DBRED = 19; // 2微秒死区
EPwm2Regs.DBFED = 19;
EPwm2Regs.DBCTL.bit.OUT_MODE = 3;
EPwm2Regs.DBCTL.bit.POLSEL = 2;
EPwm2Regs.DBCTL.bit.IN_MODE = 0;
///----------------------------------------------
EPwm3Regs.TBCTL.bit.CLKDIV = 0; // CLKDIV = 1
EPwm3Regs.TBCTL.bit.HSPCLKDIV = 0; // HSPCLKDIV = 1
EPwm3Regs.TBCTL.bit.CTRMODE = 2; //向上-向下计数模式
EPwm3Regs.AQCTLA.ALL = 0x0060; //在 CMPA 上设置 ePWM2A
EPwm3Regs.TBPRD =(150000*1000/(2100*2.0)); // 2.100KHz 的定时器周期
EPwm3Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD / 2; //首先占空比为50%
EPwm3Regs.CMPB = EPwm1Regs.TBPRD/2;
EPwm3Regs.DBRED = 19; // 2微秒死区
EPwm3Regs.DBFED = 19;
EPwm3Regs.DBCTL.bit.OUT_MODE = 3;
EPwm3Regs.DBCTL.bit.POLSEL = 2;
EPwm3Regs.DBCTL.bit.IN_MODE = 0;
///----------------------------------------------
EPwm1Regs.ETSEL.ALL = 0;
EPwm1Regs.ETSEL.bit.INTEN = 1; //针对 ePWM1启用中断
EPwm1Regs.ETSEL.bit.INTSEL = 5; // CMPA 上的中断向下匹配
EPwm1Regs.ETPS.bit.INTPRD = 1; //第一个事件发生中断
EPwm2Regs.ETSEL.ALL = 0;
EPwm2Regs.ETSEL.bit.INTEN = 1; //针对 ePWM2启用中断
EPwm2Regs.ETSEL.bit.INTSEL = 5; // CMPA 上的中断向下匹配
EPwm2Regs.ETPS.bit.INTPRD = 1; //第一个事件发生中断
EPwm3Regs.ETSEL.ALL = 0;
EPwm3Regs.ETSEL.bit.INTEN = 1; //针对 ePWM2启用中断
EPwm3Regs.ETSEL.bit.INTSEL = 5; // CMPA 上的中断向下匹配
EPwm3Regs.ETPS.bit.INTPRD = 1; //第一个事件发生中断
}
中断空 CPU_timer0_ISR (空)
// ISR 每2000ns 运行一次(PWM 频率= 500KHz)
//且由 ePWM1比较事件触发
//运行- ISR 的时间为630ns
{
CpuTimer0.InterruptCount++;
//每个中断处理看门狗
EALLOW;
SysCtrlRegs.WDKEY = 0xAA; //服务监视器#2
EDIS;
//确认此中断以接收来自组3的更多中断
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;
}