DSP28335开发问题CCS代码请教

在使用CCS软件开发DSP28335时,我想使用代码发出三个正弦波,来代替三相正弦交流电压,但是我写的代码发出的正弦波会时不时产生一个突变(如下图所示),可以帮我看看代码吗?

img

img

img

img

代码如下所示

float eabcsim[360];
int number1=0,number2=120,number3=240;

int i=0;
eabcsim[i] = 220.0*sin(2.0*PI*i/360);
i++;
if (i > 359)
{
      i=0;
}

e_A = eabcsim[number1]; number1++;     if (number1>359)         {         number1=0;        }
e_B = eabcsim[number2]; number2++;     if (number2>359)         {         number2=0;        }
e_C = eabcsim[number3]; number3++;     if (number3>359)         {         number3=0;        }

可以借鉴下

DSP28335生成正弦波的程序

//产生周期变化的正弦波

#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File

#include "DSP2833x_Examples.h" // DSP2833x Examples Include File

#include "IQmathLib.h"

#include "qmath.h"

#include "math.h"

#define N 33

#define PI 3.1415925

#define PRD 600

float M=0.8;

int i;

//double a[N];

//unsigned int n=0;

//float Q;

#define PWM1_INT_ENABLE 1

#define PWM2_INT_ENABLE 1

#define PWM3_INT_ENABLE 1

void InitEPwm1Example(void);

//void InitEPwm2Example(void);

//void InitEPwm3Example(void);

interrupt void epwm1_timer_isr(void);

//interrupt void epwm2_timer_isr(void);

//interrupt void epwm3_timer_isr(void);

//void InitCmp();

//extern Uint16 NN,MM;

//Uint16 NN=24,MM=1;

//Uint16 n=0;

Uint16 cmp1[360],cmp2[360],cmp3[360];

Uint32 EPwm1TimerIntCount;

Uint32 EPwm2TimerIntCount;

Uint32 EPwm3TimerIntCount;

void main(void)

{

InitSysCtrl();

InitEPwm1Gpio();

// InitEPwm2Gpio();

// InitEPwm3Gpio();

DINT;

InitPieCtrl();

IER = 0x0000;

IFR = 0x0000;

InitPieVectTable();

EALLOW; // This is needed to write to EALLOW protected registers

PieVectTable.EPWM1_INT = &epwm1_timer_isr;

// PieVectTable.EPWM2_INT = &epwm2_timer_isr;

// PieVectTable.EPWM3_INT = &epwm3_timer_isr;

EDIS;

EALLOW;

SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; // Stop all the TB clocks

EDIS;

InitEPwm1Example();

// InitEPwm2Example();

// InitEPwm3Example();

// InitCmp();

EALLOW;

SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;

EDIS;

EPwm1TimerIntCount = 0;

EPwm2TimerIntCount = 0;

EPwm3TimerIntCount = 0;

IER |= M_INT3;

PieCtrlRegs.PIEIER3.bit.INTx1 = PWM1_INT_ENABLE;

// PieCtrlRegs.PIEIER3.bit.INTx2 = PWM2_INT_ENABLE;

// PieCtrlRegs.PIEIER3.bit.INTx3 = PWM3_INT_ENABLE;

EINT; // Enable Global interrupt INTM

ERTM;

{

asm(" NOP");

}

}

void InitEPwm1Example()

{

EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;//zhuyi

EPwm1Regs.TBPRD = PRD; //载波周期=2*1500TBCLK

EPwm1Regs.TBPHS

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
首先,这个突变可能是由于产生了相位跳变或者幅值跳变导致的。

针对你提供的代码,可能存在下面几个问题:

  1. 首先,你只是在代码开始时对一个数组进行了赋值,等到调用的时候才使用。所以在调用函数时可能会出现数组下标越界的情况。可以将数组赋值代码放到函数调用前面,或者将其定义为全局数组。

  2. 其次,你在循环遍历数组时,只对数组进行了一次赋值,没有按照时间顺序不断赋值,所以会导致出现跳变的情况。可以按照时间步长不断对数组进行赋值,并且保证相邻元素之间的差值小于一个周期内的分辨率(通常周期内分辨率与采样频率有关)。

下面是修改代码的参考示例:

#define PI 3.1415926
#define AMP 220.0 // 设定正弦波幅值
#define FS 1000   // 设定采样频率
#define FREQ 50   // 设定正弦波频率
#define PHASE 0   // 设定正弦波相位差

float eabcsim[360];
int number1=0,number2=120,number3=240;

void generate_sin(float *sin, int len, float amp, float freq, float fs, float phase)
{
    int i;
    float t;
    float delta = 1.0 / fs;
    for (i = 0; i < len; i++) {
        t = (float)i / fs;
        sin[i] = amp * sin(2 * PI * freq * t + phase);
    }
}

int main(void)
{
    generate_sin(eabcsim, 360, AMP, FREQ, FS, PHASE);

    int i = 0;
    while (true) {
        e_A = eabcsim[number1]; number1++;     if (number1 > 359)   number1 = 0;
        e_B = eabcsim[number2]; number2++;     if (number2 > 359)   number2 = 0;
        e_C = eabcsim[number3]; number3++;     if (number3 > 359)   number3 = 0;
        delay_us(1000); // 控制输出频率
    }

    return 0;
}

这段代码可以启动一个无限循环,每次遍历数组并给三相电压赋值。控制输出频率可以使用延时函数或者定时器来实现。
如果我的回答解决了您的问题,请采纳!

以下答案由GPT-4.5Plus大模型(语音)与博主A努力中.......共同编写:

DSP28335是TI公司的一款数字信号处理器,使用CCS(Code Composer Studio)进行开发。

根据你在CSDN提问中描述的问题,主要有以下几点:

  1. DSP28335开发板上的LED灯无法点亮,怀疑是GPIO配置的问题。
GPIO的配置主要在DSP2833x_Headers_nonBIOS.cmd文件中,需要将对应的GPIO引脚配置为输出模式,并指定默认电平。比如:
*  Set GPIO-A pins to output 
GPIO_SetupPinOptions(31,0)    ; Set GPIO31 as GP output 
GPIO_SetupPinMux(31,0)        ; Set GP31 to GPIO31 function
GpioDataRegs.GPASET.bit.GPIO31 = 1;   Set GPIO31 output to 1 
这会将GPIOA7配置为输出,并默认输出高电平,点亮LED。

  1. 编译后出现"undefined reference to `__TI_auto_init'"错误。
这是因为编译器选项中禁用了自动初始化函数,需要在DSP2833x_Headers_nonBIOS.cmd文件中手动调用初始化函数:
 
*// Auto initialize TI runtime environment 
__TI_auto_init();  
在programming flow中最开始调用这个初始化函数即可解决。

  1. FLASH烧录出现"FLASH API: Flash not erased!"错误

这是因为FLASH没有进行擦除,在执行FLASH写入操作前,需要先调用FLASH擦除 API进行擦除,比如:

c
EALLOW;
Flash2833x_Erase(FLASH_optimal_sector); // 擦除FLASH扇区 
EDIS;

然后才能进行FLASH写入操作。

希望以上回答能帮助你解决DSP28335的开发问题,特别是GPIO配置、自动初始化函数调用和FLASH擦除等方面的问题。