This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
TMS320F280045基于CCS10.3.1.00003_win64软件编译环境,出现数据计算错误的问题,将有符号32位数据强制转换为有符号16位也出现错误,本身转换后应该在-32768~32767范围,实际偶尔会出现65535或-65535这类奇怪的数据。以下代码 int32 iTempLAAx; Uint16 TempAx; if(Mscnt % 10 == 0){TempAx = 32606;} if(Mscnt % 10 == 1){TempAx = 32617;} if(Mscnt % 10 == 2){TempAx = 32607;} if(Mscnt % 10 == 3){TempAx = 32609;} if(Mscnt % 10 == 4){TempAx = 32616;} if(Mscnt % 10 == 5){TempAx = 32612;} if(Mscnt % 10 == 6){TempAx = 32611;} if(Mscnt % 10 == 7){TempAx = 32608;} if(Mscnt % 10 == 8){TempAx = 32615;} if(Mscnt % 10 == 9){TempAx = 32613;} CurU = TempAx; if(CurU > 32622){CurU = 32622;} if(CurU < 32602){CurU = 32602;} iTempLAAx = (int)((int)CurU - (int)32612); if(iTempLAAx > 5){iTempLAAx = 5;} if(CurrentIw < -5){iTempLAAx = -5;} CurrentIu = iTempLAAx; DIANLIUU = CurrentIu; CurW = TempAx;//IW_RST; if(CurW > 32622){CurW = 32622;} if(CurW < 32602){CurW = 32602;} iTempLAAx = (int)((int)CurW - (int)32612); if(iTempLAAx > 5){iTempLAAx = 5;} if(iTempLAAx < -5){iTempLAAx = -5;} CurrentIw = iTempLAAx; DIANLIUW = CurrentIw; CurrentIv = - (int)(CurrentIu + CurrentIw); DIANLIUV = CurrentIv; 所有变量全部定义为有符号32位类型,其计算结果即使加了限制条件,仍然会出现65535、-65535,该问题很严重,请尽快回复,十分感谢。
若是可以的话,请您直接私信一下工程,我们在280049开发板上测试一下
若是不方便的话,请您以插入代码的形式上传代码并给出详细问题的CCS内截图说明,谢谢
不是这样设置断点,这样看一般也没问题,你实时看,偶尔会波动到65535,你看我都限死了的,怎么会波动那么大呢?我出问题的时候把数据导出来了,就是这个变量有问题,一下子值很大。
可以看视频,这个代码跟我发你的一摸一样,另外,1、即使你说的波动也不正确啊,你看到我是限制在±5以内么,2、你看我提供的代码,应该跟硬件环境也没关系啊,我目前也只是给DSP供5V电。
使用launchpad不能进入
void MotorCtlEntryIsr(void)
{
CurSampleDeal();
}
所以我将CurSampleDeal();添加到了main函数的循环内
请您参考下
https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/976596/tms320f28386d-unsigned-type-negative-integer-cast-difference-in-cpu-and-cm/3607991?tisearch=e2e-sitesearch&keymatch=65535#3607991
以及我之前的回复贴
个人认为和
int32 iTempLAAx;
Uint16 TempAx;
的定义有关
1、同样代码同样编译环境我在28035和28335上验证测试没问题;
2、int32我尝试过换成long,Uint16我也直接换成了unsigned int,现象一样。
int32我尝试过换成long,Uint16我也直接换成了unsigned int,现象一样。
我测试了一下,也是这样
而后我增加了stack,修改了您的cmd文件
RAMLS7 : origin = 0x00A800, length = 0x001000
RAMGS0 : origin = 0x00C000, length = 0x003000 //Stack
// RAMGS : origin = 0x00D000, length = 0x002000
RAMGS : origin = 0x00F000, length = 0x004FF8 //susan
这样极少出现类似65535的数字的,但是还是会出现,目前还没有明确原因
Update:
使用
unsigned long iTempLAAx;
unsigned int TempAx;
不会出现类似65535的数字了
嗯,stack我之前也改过,但是按道理,本身分配的堆栈空间就比较大,你也可以看到,程序实际执行的代码很少,应该不会有影响才对,其实我还有另外一个问题,就是我的代码把一个16位定义成32位有时会进入非法中断,即使我再删掉很多变量也一样,无法解释。不过这个问题我是完整工程容易复现,如果后续贵司有技术人员来我司,可以讨论下是什么原因,相关代码我已经保存好了。
请您试一下
使用
unsigned long iTempLAAx;
unsigned int TempAx;
但是结果不对啊,我之前各种数据格式都试过,无符号的确不太容易出现,但偶尔还是会出现。在联系你们之前,我是尝试过只要有规避方案都可以,但实际上不行,无符号32位只是出现几率更小,但依然会出现,而且即使无符号没问题,我们最终也是需要有符号的运算的。
两天了,请问这个问题有没有阶段性的结论?以及,我发现28388D和2837xD的引脚是PINtoPIN的,所以能否帮我测试一下28388D上是否有类似的问题?如果没有的话,我将考虑成本,将28388D作为备选方案。非常感谢!
请问这个问题有没有阶段性的结论?
这个后续交给BU解决
https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000-microcontrollers---internal/f/c2000-microcontrollers---internal-forum/1010465/tms320f280045-calculation-results-abnormal
我发现28388D和2837xD的引脚是PINtoPIN的,所以能否帮我测试一下28388D上是否有类似的问题?如果没有的话,我将考虑成本,将28388D作为备选方案。
好的,我来测试一下,之后给您回复
所以能否帮我测试一下28388D上是否有类似的问题?如果没有的话,我将考虑成本,将28388D作为备选方案。非常感谢!
到目前没有发现类似出现65535的情况