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.

关于C2000 DSP位域操作

首先在PFC程序中定义了一个故障标志结构体变量SystemFaultFlag,后级通过一个光耦传递一个硬件故障位给PFC,程序中是这么写的

...

#define LLCFaultState GpioDataRegs.GPADAT.bit.GPIO13

...

PFC程序直接利用位域操作进行赋值:

SystemFaultFlag.bit.LLCFault = LLCFaultState;

这样程序执行异常(这个硬件位实际却是存在干扰),PFC无端关闭驱动,但是没有任何标志位,改用if条件语句判断之后,能够正常执行。

DSP用的28035

请问,这样操作有什么问题?位域操作是怎么编译的?有没有相应的手册?

  • 这样定义是没有问题的,程序执行有什么样的异常呢?
  • 一开始能够正常运行,但是过一段时间,PFC只关闭驱动,但是不报任何故障位,上位机也观测到这一点。而且ePWM寄存器的值一直在变,TZ配置的CBC保护,能够封锁驱动的配置都传到上位机看过了,都正常,没有封锁驱动信号的。除了没有驱动,其他都很正常
    这句话去掉,程序就能够正常运行。
    哦,除了GPIO配置没去确认,也没理由会有影响
  • 是不是与volitile有关系
  • 我的故障位是个全局变量,这句话执行完过一会儿就会执行故障标志位判断,中间只有几行电压保护的判断语句。(在同一个函数中,这个函数放在AD中断中,优先级比较高)

    void Protection()

    {

    ...

    SystemFaultFlag.bit.LLCFault = LLCFaultState;

    ...

    if(0 != SystemFaultFlag.all)
    {
    PWMOutputsDisable();
    STOPSTATE;
    FAULTSTATE;
    }

    ...

    }

    照理说检测到故障就会立即保护,而且后面的“STOPSTATE;  FAULTSTATE; ”两句话也没有执行所以我有点奇怪。

  • 可以看一下SystemFaultFlag.all的值具体是多少?
    程序没啥问题
  • 问题找到了,写程序犯了个低级错误,当时图省事,就这么简单的一句话写了一下,实际这个信号有干扰,第一次干扰检测到高电平,第二个周期立马被正常的低电平覆盖掉,所以会出现这个问题,查问题的时候,没注意FaultState=1;这句话被别人注释掉了,观测不到这个信号,一直以为没有执行到下面关驱动这段代码,所以找错了方向。

    void Protection()

    {

    ...

    SystemFaultFlag.bit.LLCFault = LLCFaultState;

    ...

    if(0 != SystemFaultFlag.all)
    {

    PWMOutputsDisable();
    STOPSTATE;
    //FAULTSTATE;
    }

    ...

    }