在使用CCS软件开发DSP28335时,我想使用代码发出三个正弦波,来代替三相正弦交流电压,但是我写的代码发出的正弦波会时不时产生一个突变(如下图所示),可以帮我看看代码吗?
代码如下所示
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大模型与博主波罗歌共同编写:
首先,这个突变可能是由于产生了相位跳变或者幅值跳变导致的。
针对你提供的代码,可能存在下面几个问题:
首先,你只是在代码开始时对一个数组进行了赋值,等到调用的时候才使用。所以在调用函数时可能会出现数组下标越界的情况。可以将数组赋值代码放到函数调用前面,或者将其定义为全局数组。
其次,你在循环遍历数组时,只对数组进行了一次赋值,没有按照时间顺序不断赋值,所以会导致出现跳变的情况。可以按照时间步长不断对数组进行赋值,并且保证相邻元素之间的差值小于一个周期内的分辨率(通常周期内分辨率与采样频率有关)。
下面是修改代码的参考示例:
#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提问中描述的问题,主要有以下几点:
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。
这是因为编译器选项中禁用了自动初始化函数,需要在DSP2833x_Headers_nonBIOS.cmd文件中手动调用初始化函数:
*// Auto initialize TI runtime environment
__TI_auto_init();
在programming flow中最开始调用这个初始化函数即可解决。
这是因为FLASH没有进行擦除,在执行FLASH写入操作前,需要先调用FLASH擦除 API进行擦除,比如:
c
EALLOW;
Flash2833x_Erase(FLASH_optimal_sector); // 擦除FLASH扇区
EDIS;
然后才能进行FLASH写入操作。
希望以上回答能帮助你解决DSP28335的开发问题,特别是GPIO配置、自动初始化函数调用和FLASH擦除等方面的问题。