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.

[参考译文] 更紧急!TMS320F28335:一个紧急的28335 ADC 问题

Guru**** 2535750 points
Other Parts Discussed in Thread: CONTROLSUITE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/598734/more-urgent-tms320f28335-a-urgent-28335-adc-problem

器件型号:TMS320F28335
Thread 中讨论的其他器件:controlSUITE

我的客户将28335用于他们的电机控制产品。 最近,他们在生产测试中发现一些 DSP 的 ADC 结果是错误的。 例如,正常值为10,但当出现问题时,该值为1000。

 

他们的产品已投入生产多年、没有任何类似的问题。 它们 没有更改硬件和软件。 因此,他们怀疑问题可能是由一批 DSP 引起的,他们进行了一些测试,其中最令人信服的一个是:将“问题” DSP 删除到正常的主板上,可以重现问题。   

我想我们无法仅通过测试来判断 DSP 批量造成的问题,那么您是否可以提供其他测试方法来找出问题?

 

今天我已经和工程师做了一些测试、测试过程和结果如下:

 

  • 修改一些 ADC 初始化代码,它们之前使用的代码如下所示:

 

     AdcRegs.ADCTRL3.ALL = 0xE0;

      DELAY_US (ADC_USDELAY);

 

我们修改了以下代码、

 

      AdcRegs.ADCTRL3.bit.ADCBGRFDN = 0x3;    

      DELAY_US (1000)                         

      AdcRegs.ADCTRL3.bit.ADCPWDN = 1;        

      DELAY_US (1000);                        

 

  我们的理由是延迟时间越长、ADC 问题的时间就越少。

 

我的问题是、这两种不同的初始化方法之间有何差异?  我发现 controlSUITE 中的大多数示例都是以第一种方式使用的。

 

ADC 初始化之前的要求是什么、例如、我们在初始化…之前应该等待多长时间。                                                                                                                                  

 

  • 在编译器选择级别选项中、选择不同的优化级别、我们发现问题的时间会发生变化。

 

 

不同的优化级别与如何选择优化级别之间有何区别?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有什么可以为这个 probem 提供手。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Shuai、

    在第1.6节"加电序列"的 ADC UG 中描述了加电/断电序列

    通常、您可以根据第一种方法一次性设置/清除所有3个位、从而为 ADC 加电和断电。 在第二种方法中、首先为基准和带隙加电、然后为 ADC 加电。 这不应影响您的总加电时间。

    如果您已将所有器件完全通电、则只关闭 ADC (而不是 BG 和基准)、然后您可以在20us 内为 ADC 加电。

    至于延迟/优化、为了实现正确运行、必须在完全上电后等待至少5ms、然后才能使用 ADC。 优化级别可能会减少或消除此时间。 在使用分析器进行调试时(以 CPU 周期为单位)、您可以测量任意两点之间的执行时间:

    processors.wiki.ti.com/.../Profile_clock_in_CCS

    最好验证 ADC 上电和第一个 ADC 触发之间的实际运行时间延迟。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Devin、

    非常感谢 您始终为我提供帮助。

    今天我已经和客户工程师做了一些测试,发现了一个奇怪的现象,

    我们在主函数中添加了一些代码(与 ADC Init 无关),例如:黄色的后接地是我们添加的代码,

    我们发现,在添加代码时(不限于此“if”代码,任何代码都可以),ADC 正常工作,删除代码时,ADC 结果是错误的!

    难以置信! 无法解释! 我唯一能想到的可能性是 :添加代码时,存储在闪存中的 InitAdc()函数的位置可能会改变。

    另外,客户的 V1.02软件工作正常,V1.03软件工作异常。 这两个软件使用相同 的初始化过程和 ADC Init 代码,两个版本软件之间的区别是 V1.03大于 V1.02。

    您能给我一些关于这方面的想法吗? 谢谢!               

    void main (void)

    INT A = 1;

     InitSysCtrl();                     

     Memcopy (&RamfuncsLoadStart、&RamfuncsLoadEnd、&RamfuncsRunStart);

     InitFlash();

     Dint;

     InitPieCtrl();

     IER = 0x0000;

     IFR = 0x0000;

     InitPieVectTable();

     EALLOW;

     PieVectTable.ADCINT1    =&CURRENT_ISR;       

     EDIS;

     PieCtrlRegs.PIECTRL.bit.ENPIE = 1;        //启用 PIE 块

     PieCtrlRegs.PIEIER1.bit.INTx1 = 1;        //启用 PIE 组1,

     InitGpio();    

     InitAdc();               

    如果(A=0)

    …………

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     您好 Devin、

    感谢您的帮助,我们今天做了很多测试,也许我们找到了这个问题的原因:在 InitADC()之后,我们读取了 ADC 寄存器的值,发现 “ADCTRL1 ADCTRL2  ADCTRL3”的值都为零! InitADC()无法配置 ADC 寄存器!以下是它们使用的代码:

     


     

     

    导致寄存器配置失败的可能原因是什么?

     

    另一项测试正如您所提到的:“如果您已完全通电,然后只关闭 ADC (而不是 BG 和基准),那么您可以在20us 内为 ADC 加电。

     


     

    我们使用上述代码为 ADC 供电、发现这种方法可以降低问题的频率。 您是否遇到过类似问题? 您对此建议是否有任何经验或依据?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Shuai、

    对于加电时间、建议直接取自模块文档:

    但根据数据表、在这种情况下、您可能仍应等待至少1ms 而不是20us、因为20us 是最佳情况下的加电时间。

    至于您的寄存器无法正确初始化的原因、具体取决于某些添加/删除不相关的代码、我将要求其他人进行评论。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Shuai、

    您可能还想看看这个 e2e 帖子、其中插入不相关的代码(在本例中为 NOP)会导致 ADC 出现一些问题。 根本原因似乎是闪存设置不正确。

    e2e.ti.com/.../2143701

    因此、最好尝试从 RAM 执行、以查看是否有更好的结果。 如果直接从 RAM 运行更好、您可以更改闪存设置和/或存储复制函数以解决您的问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Devin、
    在周末,我的客户修改了软件,从 RAM 执行 ADCInit()以查看是否有更好的结果,他们仍然在执行测试。 现在,他们还没有考虑到这个问题,这种方式似乎有了有效的结果。

    我已经获得了他们项目的映射文件,对于“问题”项目和“无问题”项目,发现 ADCInit()位于同一闪存地址。 可能是因为对于这两个项目、28335 Init 代码是相同的。

    另一个现象是:对于同一个“问题”项目,并非所有 DSP 都有问题,某些 DSP 始终正常工作。 您是否知道导致差异的原因?(例如、不同批次 DSP 具有不同的灵敏度)

    我已经阅读了 e2e.ti.com/.../2143701,也许我不能理解这一点。 这是否意味着闪存访问等待时间的差异会导致类似的问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当从闪存执行代码时、代码的位置可能会对性能产生影响。 闪存上有一个预取机制。 如果代码被移动并且或者分支被添加到代码中、那么性能可能会有所不同、这是因为分段的运行方式可能不同。 这可能会导致不同构建之间出现一些时序问题。

    请使用 CCS 中的时钟功能对此进行配置。 Run->Clock->Enable。

    SAL

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Sal、
    谢谢,也许我不知道这一点。 这是否意味着闪存访问等待时间的差异会导致类似的问题? 您是否意味着如果代码从闪存中执行,则存在风险? "不同的实体"意味着不同的编译器或不同的编译器配置?