我想给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);
}
}
看下变量的改变,以及对应端口的输出,是否一致。
参考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的变化而变化。