CCS代码编写问题请教


#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
#include "init_sin.h"
#include "math.h"
#include "test1.h"
extern float   e_A, e_B, e_C;//实际电压值
extern float   i_A, i_B, i_C;//实际电流值
//extern float VAref,VBref,VCref;
//extern float Viref,ViBref,ViCref;

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

       i_A = 6.8*sin(2*M_PI*i/360);
       i_B = 6.8*sin(2*M_PI*(i-120)/360);
       i_C = 6.8*sin(2*M_PI*(i+120)/360);
   }
}
#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
#include "test1.h"
#include "math.h"
#include "init_sin.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;

//extern float u_alpha0;
//extern float u_beta0;
//extern float center_sector_alpha[6];
//extern float center_sector_beta[6];
//extern unsigned char N;
//Uint16 j=0;
//

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 "math.h"
#include "test1.h"
#include "init_sin.h"


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

float e_alpha;
float e_beta;
float i_alpha;
float i_beta;
float Ttype_ps;
float Ttype_qs;
float Ep;
float Eq;
float fp;
float fq;
//float u_alpha0;
//float u_beta0;
//float center_sector_alpha[6];
//float center_sector_beta[6];
//unsigned char N=0;


#define JDQ_XH  GpioDataRegs.GPACLEAR.bit.GPIO31 = 1  //继电器吸合
#define JDQ_DK  GpioDataRegs.GPASET.bit.GPIO31 = 1    //继电器断开

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



int main(void)
{
    InitSysCtrl();

    configtestled();
    configJDQ();

    InitXintf();                //  配置外部存储器的访问时序
        DINT;                       //禁用CPU中断
        InitPieCtrl();              // 初始化中断控制寄存器,禁用所有PIE中断并清楚标志位
        IER = 0x0000;               // 关闭总中断
        IFR = 0x0000;               // 清除中断信号
        InitPieVectTable();         // 初始化中断向量表

        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;


        //    balance_flag = 0;

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

}

interrupt void cpu_timer0_isr(void)
{
//    semaphore = 1; // 中断服务函数中设置信号量
     ABC_ref();
     formula();   //在循环中调用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;
    CpuTimer0Regs.TCR.bit.TIF = 1;  //1清除中断标志(该位为1表明进入中断,该位为0表明中断函数结束)
    CpuTimer0Regs.TCR.bit.TRB = 1;
}


CCS代码问题请教。以上两段代码是我写的两段功能函数,但是运行时第二段代码中的变量不随着第一段代码中的变量变化,如下图所示。中断没有问题。请问这是什么原因呢?

img

参考GPT和自己的思路:根据你提供的代码,你的问题可能是因为ABC_ref()函数没有调用导致的。

在ABC_ref()函数中,你初始化了e_A、e_B、e_C、i_A、i_B和i_C变量。但是,这些变量的值只在ABC_ref()函数中被初始化。如果你在其他函数中使用这些变量,它们将保持它们的初始值,除非你在其他地方重新赋值。

因此,当你调用formula()函数时,它将使用ABC_ref()函数中的变量的初始值,而不是在ABC_ref()函数中更新的值。

解决这个问题的方法是在调用formula()函数之前先调用ABC_ref()函数,以确保变量的值已经被正确地初始化。
你可以在调用formula()函数之前先调用ABC_ref()函数,以确保变量的值已经被正确地初始化。例如,你可以在main函数中先调用ABC_ref()函数,然后再调用formula()函数。以下是示例代码:

#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#include "init_sin.h"
#include "math.h"
#include "test1.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 ABC_ref(void)
{
    int i;
    for(i=0;i<=359;i++)
    {
        e_A = 311*sin(2*M_PI*i/360);
        e_B = 311*sin(2*M_PI*(i-120)/360);
        e_C = 311*sin(2*M_PI*(i+120)/360);
 
        i_A = 6.8*sin(2*M_PI*i/360);
        i_B = 6.8*sin(2*M_PI*(i-120)/360);
        i_C = 6.8*sin(2*M_PI*(i+120)/360);
    }
}

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;
}

void main(void)
{
    InitSysCtrl();
    InitPieCtrl();
    DINT;
    InitPieVectTable();
 
    ABC_ref(); //调用ABC_ref()函数,确保变量的值已经被正确地初始化
 
    while(1)
    {
        formula(); //在循环中调用formula()函数
    }
}


在这个示例代码中,我们在main函数中先调用ABC_ref()函数,然后在循环中调用formula()函数。这样可以确保变量的值已经被正确地初始化,而且可以随着时间的推移更新这些变量的值。

根据代码,第一段函数ABC_ref()内部对全局变量e_A、e_B、e_C、i_A、i_B、i_C进行了赋值操作,但是没有返回任何值。因此,第二段函数formula()在运行时,使用的e_A、e_B、e_C、i_A、i_B、i_C变量并没有被更新。

为了解决这个问题,可以在第一段函数中添加一个参数来传递需要更新的变量,或者将这些变量设置为全局变量。如果这些变量被设置为全局变量,则在函数中对其进行赋值时,不需要使用extern关键字。

另外,代码中也没有看到Pref和Qref的定义,如果这两个变量也是全局变量,则需要在代码中添加对其的声明。

参考GPT和自己的思路,在第一段代码中,你使用for循环来初始化电压和电流值,但是在for循环内部,你的电压和电流变量每次都会被覆盖为新的数值,最后只有最后一次循环得到的数值被保留。因此在第二段代码中,你读取的电压和电流值始终都是最后一次循环得到的值,而不是每次循环中的实时值。

为了解决这个问题,你可以使用一个数组来存储每个角度下的电压和电流值,然后在第二段代码中访问该数组的元素来获取实时值。下面是修改后的第一段代码:

void ABC_ref(void)
{
  int i;
  float e_A_arr[360], e_B_arr[360], e_C_arr[360];
  float i_A_arr[360], i_B_arr[360], i_C_arr[360];

  for(i=0;i<=359;i++)
  {
    e_A_arr[i] = 311*sin(2*M_PI*i/360);
    e_B_arr[i] = 311*sin(2*M_PI*(i-120)/360);
    e_C_arr[i] = 311*sin(2*M_PI*(i+120)/360);

    i_A_arr[i] = 6.8*sin(2*M_PI*i/360);
    i_B_arr[i] = 6.8*sin(2*M_PI*(i-120)/360);
    i_C_arr[i] = 6.8*sin(2*M_PI*(i+120)/360);
  }

  for(i=0;i<=359;i++)
  {
    e_A = e_A_arr[i];
    e_B = e_B_arr[i];
    e_C = e_C_arr[i];
 
    i_A = i_A_arr[i];
    i_B = i_B_arr[i];
    i_C = i_C_arr[i];
  }
}

在这个修改后的版本中,我们首先声明了6个数组来存储每个角度下的电压和电流值。然后我们在第一个for循环中使用sin函数来填充这些数组。接下来,我们使用第二个for循环来遍历数组中的每个元素,并将其分配给实际的电压和电流变量。这样,在第二段代码中,每次访问电压和电流变量时,它们将具有实时的值,而不是最后一次循环的值。

回答不易,还请采纳!!!

根据您提供的代码和问题描述,在第二段代码中,变量e_A、e_B、e_C等没有被正确初始化,导致变量值不随着第一段代码中的变化。

以下是一种修改方案,将ABC_ref函数中初始化正弦波数据的代码移到formula函数中:

#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#include "init_sin.h"
#include "math.h"
#include "test1.h"

float e_A, e_B, e_C;
float i_A, i_B, i_C;

void ABC_ref(void)
{
    int i;
    for(i=0;i<=359;i++)
    {
        e_A = 311*sin(2*M_PI*i/360);
        e_B = 311*sin(2*M_PI*(i-120)/360);
        e_C = 311*sin(2*M_PI*(i+120)/360);

        i_A = 6.8*sin(2*M_PI*i/360);
        i_B = 6.8*sin(2*M_PI*(i-120)/360);
        i_C = 6.8*sin(2*M_PI*(i+120)/360);
    }
}

float e_alpha, e_beta;
float i_alpha, i_beta;
float Ttype_ps, Ttype_qs;
float Ep, Eq;

void formula(void)
{
    ABC_ref(); // 调用ABC_ref函数初始化正弦波数据

    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;
}

这样做的效果是,在formula函数中调用ABC_ref函数来初始化正弦波数据,而不是在main函数中分别调用两个函数。希望这个修改方案能够解决您的问题。

基于bing、GPT部分内容和本人思考总结:
可能是以下几种原因导致第二段代码中的变量不随着第一段代码中的变量变化:

变量定义不正确:第一段代码中的变量和第二段代码中的变量定义不一致,导致编译器认为它们是不同的变量。

变量作用域不正确:第一段代码中的变量是在中断函数中定义的,作用域仅限于中断函数内部。如果第二段代码中的变量定义在另一个函数或全局范围内,那么它们是不同的变量。

代码逻辑问题:第一段代码中的变量值改变后,没有触发第二段代码中的相关操作。这可能是由于代码逻辑问题导致的,需要检查代码逻辑是否正确。
建议您仔细检查代码,确保变量定义、作用域和代码逻辑都正确。如果仍然无法解决问题,请提供更多代码和详细信息以供参考。