Other Parts Discussed in Thread: CONTROLSUITE
Thread 中讨论的其他器件:controlSUITE
工具/软件:Code Composer Studio
朋友们、您好!
我正在使用 ePWM 进行正弦波生成编码、我使用的控制器是 F28027F。
我正在关注这个线程中的一个代码
https://e2e.ti.com/support/microcontrollers/c2000/f/171/p/553678/2025201
并根据我使用的控制器更改了代码。
问题:
当我尝试构建和调试时、它会失败、并生成此错误报告
"C:/ti/controlSUITE/device_support/f2802x/v230/f2802x_common/cmd/F2802x_generic_ram.cmd "、第121行:错误:
程序将不能放入可用的内存中。 放置方式
".econst"大小为0x100页1的对齐/分块失败。 可用
存储器范围:
RAMM1大小:0x400未使用:0xd6最大孔:0xd6
econst:>RAMM1,PAGE = 1
错误:在链接期间遇到错误;"Example_2802xEPwmUpDownAQ.out"没有
已构建
>>编译失败
gmake:***[Example_2802xEPwmUpDownAQ.out]错误1.
gmake:目标`全部'不会由于错误而重制。
我的想法:
有一个名为 b[101]的浮点数组(plz 在给定代码中观察它)。 根据错误报告、我认为 由于超出控制器的内存限制而导致生成失败。 此外、我尝试将数组的数量减少到仅5或将浮点替换为整数、然后我可以轻松地构建代码、但通过这样做对我来说完全没用、无法实现我的正弦波生成目标。 请帮我解决这个问题。 不能使用 F28027f 来生成正弦波吗? 如果是、请告诉我该怎么做。
提前感谢。
#include "DSP28x_Project.h"
#include "math.h"
#include "float.h" //不确定是否需要
typedef 结构
{
volatile struct ePWM_regs * EPwmRegHandle;
}
ePWM_INFO;
#define EPWM2_TIMER_TBPRD 5000 // 5kHz PWM 周期寄存器
#define PI 3.14159265358979323846
void InitEPwm2Examples(void);
_interrupt void epwm2_ISR (void);
unsigned int i=0、m=0、k=0;
float A=0;
float b[101]={0}; //这是我要讨论的 b float 数组
void main (void)
{
#ifdef _flash
memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);
#endif
InitSysCtrl();
对于(m=0;m<100;m++)
{
a=sin (pi*0.02*m);
如果(A<=0)
{
A=-a;
}
b[m]=5000*a;
}
B[100]=0;
InitEPwm2Gpio();
Dint;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.EPWM2_INT =&epwm2_ISR;
EDIS
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0;
EDIS;
InitEPwm2Examples();
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1;
EDIS;
IER |= M_INT3;
PieCtrlRegs.PIEIER3.bit.INTx2 = 1;
EALLOW;
SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK=1;
//最初在线程中,此行是 CpuSysRegs.PCLKCR2.bit.EPWM2=1;对于 F28377s
EDIS;
EINT;
ERTM;
for (;;)
{
_asm (" NOP");
}
}
_interrupt void epwm2_ISR (void)
{
/*在这里,我的代码将一个新的 sin 值分配到比较寄存器中。 对于正弦波的负极侧、PWM 逻辑反相。*/
a=sin (pi*0.02*i);
如果(A>=0){
EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;//在事件 A 上清除 PWM2A、向上
EPwm2Regs.AQCTLA.bit.CAD =AQ_SET;//在事件 B 上设置 PWM2A、向下
EPwm2Regs.CMPA.half.CMPA =b[i];
}
否则{
EPwm2Regs.AQCTLA.bit.CAU =AQ_SET;//在事件 A 上设置 PWM2A、向上
EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR;//在事件 B 上清除 PWM2A,向下
EPwm2Regs.CMPA.half.CMPA =b[i];//对于 F28027F 位、替换为一半
}
i++;
如果(i=101){
I=0;
}
EPwm2Regs.ETCLR.bit.INT = 1;
PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;
}
空 InitEPwm2Examples()
{
EPwm2Regs.ETSEL.bit.INTSEL = 0;//et_CTR_ZERO;// TBRD zamaninda 中断别名。
EPwm2Regs.ETSEL.bit.INTEN = 1;//启用 INT
EPwm2Regs.ETPS.bit.INTPRD = 1;//et_1st;//在发生第一个事件时生成 INT
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上和向下计数
EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV2;
EPwm2Regs.CMPCTL.bit.SHDWAMODE = 1;//CC_IMMETERM;
//******* 位被半个*******取代
EPwm2Regs.CMPA.half.CMPA =0;
EPwm2Regs.TBPRD = EPWM2_TIMER_TBPRD;//设置计时器周期801 TBCLK
//******* 位被半个*******取代
EPwm2Regs.TBPHS.Half.TBPHS = 0x0000;//相位为0
EPwm2Regs.TBCTR = 0x0000;//清除计数器
}