DSP28335代码问题

我想给DSP28335一个假的三相并网电压电流数据来测试代码,代码如下所示,但是我的ea、eb、ec、ia、ib、ic正常在变换,接下来计算代码的e_alpha、e_beta等变量却不能随着ea、eb、ec、ia、ib、ic变换,变量如图所示。这是为什么?是我给的三相并网电压电流数据有误还是代码有其他问题?

/**
 * main.c
 */
#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
#include "math.h"
#include "test1.h"
#include "init_sin.h"

float   e_A, e_B, e_C;//电压值
float   i_A, i_B, i_C;//电流值
float e_alpha;
float e_beta;
float i_alpha;
float i_beta;
float Ttype_ps;
float Ttype_qs;
float Ep;
float Eq;
#define JDQ_XH  GpioDataRegs.GPACLEAR.bit.GPIO31 = 1  //继电器吸合
#define JDQ_DK  GpioDataRegs.GPASET.bit.GPIO31 = 1    //继电器断开

void configJDQ(void);
interrupt void cpu_timer0_isr(void);

void main(void)
{
    InitSysCtrl();
//    configtestled();
    configJDQ();
    InitXintf();                //  配置外部存储器的访问时序

//↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓中断初始化↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
    DINT;                       //禁用CPU中断
    InitPieCtrl();              // 初始化中断控制寄存器,禁用所有PIE中断并清楚标志位
    IER = 0x0000;               // 关闭总中断
    IFR = 0x0000;               // 清除中断信号
    InitPieVectTable();         // 初始化中断向量表
//       EALLOW;
//              SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1;  //开启cpu time0时钟
//       EDIS;

        EALLOW;
              PieVectTable.TINT0 = &cpu_timer0_isr;
    //        PieVectTable.SCIRXINTB = &sci485_isr;
        EDIS;

//        EALLOW;
//            SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0;    //同步PWM时钟信号
//        EDIS;
//
//        EALLOW;
//            SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1;    //同步PWM时钟信号
//        EDIS;

        InitCpuTimers();
    //  ConfigCpuTimer(&CpuTimer0, 150, 33.3); //周期10us,开关频率18kHz
        ConfigCpuTimer(&CpuTimer0, 150, 100);    //周期10us,开关频率10kHz


        StartCpuTimer0();//打开定时器
    //    Init_sci_485_config();

        IER |= M_INT1;//使能CPU INT1和INT9
        IER |= M_INT9;
        PieCtrlRegs.PIECTRL.bit.ENPIE = 1;   //使能pie模块
        PieCtrlRegs.PIEIER1.bit.INTx7 = 1;   //Enable TINT0(1.7)
        PieCtrlRegs.PIEIER9.bit.INTx3 = 1;   //Enable SCIRXINTB(9.3)

        EINT;
        ERTM;
//↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

        CpuTimer0Regs.TCR.bit.TSS = 0; //立即启动定时器0
        JDQ_XH;

            for(;;)
            {
                if(CpuTimer0Regs.TCR.bit.TIF == 0)//if(current_flag == 1)     // 确保中断已更新全部数据
                {
                ;
                }
                else
                {;}
            }

}

interrupt void cpu_timer0_isr(void)
{
      ABC_ref();
      formula();
//    sector_partition();

    CpuTimer0.InterruptCount = (CpuTimer0.InterruptCount >= 18000)? 0:CpuTimer0.InterruptCount+1;   //1s

    // Acknowledge this interrupt to receive more interrupts from group 1
    PieCtrlRegs.PIEACK.all |= PIEACK_GROUP1;
//    PieCtrlRegs.PIEACK.all |= PIEACK_GROUP9;
    CpuTimer0Regs.TCR.bit.TIF = 1;  //1清除中断标志(该位为1表明进入中断,该位为0表明中断函数结束)
    CpuTimer0Regs.TCR.bit.TRB = 1;
}


#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
#include "init_sin.h"
#include "test1.h"
#include "math.h"

extern float i_A,i_B,i_C;
extern float e_A, e_B, e_C;
extern float e_alpha;
extern float e_beta;
extern float i_alpha;
extern float i_beta;
extern float Ttype_ps;
extern float Ttype_qs;
extern float Ep;
extern float Eq;

void formula(void)
{
  e_alpha = e_A-0.5*e_B-0.5*e_C;                              //
  e_beta = 1.7320508076/2.0*e_B-1.7320508076/2.0*e_C;         //
  e_alpha = 0.6666666667*e_alpha;
  e_beta = 0.6666666667*e_beta;

  i_alpha = i_A-0.5*i_B-0.5*i_C;                              //
  i_beta = 1.7320508076/2.0*i_B-1.7320508076/2.0*i_C;         //
  i_alpha = 0.6666666667*i_alpha;
  i_beta = 0.6666666667*i_beta;

  Ttype_ps = e_alpha*i_alpha+e_beta*i_beta;
  Ttype_qs = e_beta*i_alpha-e_alpha*i_beta;             //瞬时功率理论
  Ttype_ps = 1.5*Ttype_ps;
  Ttype_qs = 1.5*Ttype_qs;

  Ep = Pref-Ttype_ps;
  Eq = Qref-Ttype_qs;
}

#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
#include "init_sin.h"
#include "test1.h"
#include "math.h"

extern float   e_A, e_B, e_C;//实际电压值
extern float   i_A, i_B, i_C;//实际电流值

void ABC_ref(void)    //初始化正弦波数据
{
    int i;
    for(i=0;i<=359;i++)
    {
        e_A = 311*sin(2*PI*i/360);
        e_B = 311*sin(2*PI*(i-120)/360);
        e_C = 311*sin(2*PI*(i+120)/360);
        i_A = 6.8*sin(2*PI*i/360);
        i_B = 6.8*sin(2*PI*(i-120)/360);
        i_C = 6.8*sin(2*PI*(i+120)/360);

        }
}

img

看下变量的改变,以及对应端口的输出,是否一致。

参考GPT和自己的思路,可能是因为计算代码的变量 e_alpha 和 e_beta 没有更新,导致它们的值一直保持不变。在代码中,e_alpha 和 e_beta 的计算依赖于 e_A、e_B、e_C 和三相电压正弦变量。因此,如果这些变量的值没有在代码的其他位置被更新,则 e_alpha 和 e_beta 的值将保持不变。

您需要确保三相电压和电流变量的值在 formula() 函数调用之前正确更新。检查一下您的代码,以确保 e_A、e_B、e_C、i_A、i_B 和 i_C 变量在传递到 formula() 函数之前已经更新了。

参考GPT和自己的思路:看代码没有问题,只是与 e_alpha,e_beta,i_alpha,i_beta 相关的变量。如果这些变量没有正确初始化,则它们的值可能会保留到下一次计算,这可能导致计算结果不正确。

您可以在代码的开始位置对这些变量进行初始化。例如,将这些变量初始化为零值:

float   e_A, e_B, e_C;//电压值
float   i_A, i_B, i_C;//电流值
float e_alpha = 0.0;
float e_beta = 0.0;
float i_alpha = 0.0;
float i_beta = 0.0;
float Ttype_ps = 0.0;
float Ttype_qs = 0.0;
float Ep = 0.0;
float Eq = 0.0;


该回答引用GPTᴼᴾᴱᴺᴬᴵ
这个代码片段缺少一些必要的函数,如ABC_ref(),formula(),sector_partition(),因此很难确定出现问题的位置。请注意,e_alpha和e_beta没有任何初始化,因此它们的值应该是未定义的。

然而,你可以检查以下事项:

1.确保您正确地计算了电压和电流值,并且每个值都在变换后正确。

2.确保您正确地计算了e_alpha和e_beta,并且您正在使用正确的公式进行计算。

3.确保您的代码没有其他逻辑错误。

4.尝试添加一些调试输出来验证代码中的值。

基于最新版ChatGPT4的回答,望采纳,有其他问题也可以询问我哦(最新版更智能,功能更加强大):
从您提供的代码来看,我发现ABC_ref()函数中,e_A、e_B、e_C、i_A、i_B和i_C变量的值只在循环内进行更新。这意味着在循环结束后,它们将保留最后一次循环中的值。而在cpu_timer0_isr()中断服务程序中调用的ABC_ref()函数执行后,这些变量的值会保持不变。

为了解决这个问题,您可以将ABC_ref()函数中的循环去掉,改为根据时间步长计算正弦波的相位。这是一个简化的示例:

// 增加一个全局变量用于跟踪相位角
int phase_angle = 0;

void ABC_ref(void)
{
    e_A = 311 * sin(2 * PI * phase_angle / 360);
    e_B = 311 * sin(2 * PI * (phase_angle - 120) / 360);
    e_C = 311 * sin(2 * PI * (phase_angle + 120) / 360);
    i_A = 6.8 * sin(2 * PI * phase_angle / 360);
    i_B = 6.8 * sin(2 * PI * (phase_angle - 120) / 360);
    i_C = 6.8 * sin(2 * PI * (phase_angle + 120) / 360);

    // 更新相位角,使其在每次调用ABC_ref时递增
    phase_angle = (phase_angle + 1) % 360;
}

然后,在cpu_timer0_isr()中断服务程序中,将在每个时间步长上调用ABC_ref()函数,计算e_A、e_B、e_C、i_A、i_B和i_C的当前值。这将使e_alpha、e_beta、i_alpha和i_beta变量能够随着e_A、e_B、e_C、i_A、i_B和i_C的变化而变化。