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: TMS320F280045基于CCS10.0数据计算错误的问题。

Part Number: TMS320F280045

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内截图说明,谢谢

  • 20210615-1.rar

    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;
    就这段代买,可以实时模式查看CurrentIu ,CurrentIv,CurrentIw的值,本身我已经强制转换并限制了,结果还是出现65535,-65535奇怪数字。
    Mscnt是1ms时基。附件是我新建的一个工程文件。
  • 我使用开发板测试了一下,结果如下

  • 不是这样设置断点,这样看一般也没问题,你实时看,偶尔会波动到65535,你看我都限死了的,怎么会波动那么大呢?我出问题的时候把数据导出来了,就是这个变量有问题,一下子值很大。

  • 你实时看,偶尔会波动到65535

    请问您的硬件情况是怎样的?我直接使用launchpad,无其他外接,实时模式下,数值是固定的

  • 可以看视频,这个代码跟我发你的一摸一样,另外,1、即使你说的波动也不正确啊,你看到我是限制在±5以内么,2、你看我提供的代码,应该跟硬件环境也没关系啊,我目前也只是给DSP供5V电。

  • 使用launchpad不能进入

    void MotorCtlEntryIsr(void)
    {
    CurSampleDeal();
    }

    所以我将CurSampleDeal();添加到了main函数的循环内

  • 加到main函数一样,跟放中断的结果没区别,我也放主循环试了。

  • 现在我能复现您的情况了,偶尔会出现65535这样的数据。

    我会在确认后给您回复

  • 好的,谢谢您~

  • 请您参考下

    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

    以及我之前的回复贴

    https://e2echina.ti.com/support/microcontrollers/c2000/f/c2000-microcontrollers-forum/203543/tms320f28379s-long-0-65535 

    个人认为和

    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的数字了

    https://www.ti.com/lit/ug/spru514w/spru514w.pdf 

  • 嗯,stack我之前也改过,但是按道理,本身分配的堆栈空间就比较大,你也可以看到,程序实际执行的代码很少,应该不会有影响才对,其实我还有另外一个问题,就是我的代码把一个16位定义成32位有时会进入非法中断,即使我再删掉很多变量也一样,无法解释。不过这个问题我是完整工程容易复现,如果后续贵司有技术人员来我司,可以讨论下是什么原因,相关代码我已经保存好了。

  • 请您试一下

    使用

    unsigned long iTempLAAx;

    unsigned int TempAx;

  • 但是结果不对啊,我之前各种数据格式都试过,无符号的确不太容易出现,但偶尔还是会出现。在联系你们之前,我是尝试过只要有规避方案都可以,但实际上不行,无符号32位只是出现几率更小,但依然会出现,而且即使无符号没问题,我们最终也是需要有符号的运算的。

  • 我们最终也是需要有符号的运算的。

    了解了。我去咨询下相关BU后给您回复

  • 嗯,感谢,邹工也已经帮我咨询BU了,看下你们是否有重复咨询

    sir.ext.ti.com/.../EXT_EP-10403

  • 两天了,请问这个问题有没有阶段性的结论?以及,我发现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的情况