TI E2E 英文论坛海量技术问答的中文版全新上线,可点击相关论坛查看,或在站内搜索 “参考译文” 获取。

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.

TMS320F28388D: 关于adc_ex9_ppb_delay例程的问题

Part Number: TMS320F28388D
Other Parts Discussed in Thread: SYSCONFIG, C2000WARE

问题1.

如注释中所写,SOC1的转换通道应该是A2,但是例程中SOC0和SOC1均为A0,虽然例程不关心转换结果,但是还是请TI工程是确认下是不是例程或者代码注释写错了

问题2.

以上代码块片段中,由于最终设置的上计数模式,所以周期应该是TBPRD+1个Tsysclk。因此我觉得工程本意是ePWM2设置为10000个系统时钟,配置的是9999;同样的,ePWM1是不是希望设置成2048个系统时钟,因此,ePWM1的TPPRD应该是配置成2047吧,虽然这个对例程的结果影响不大,但是还是请TI工程是确认一下

问题3.

我觉得高亮部分的代码时冗余的,在do之前的初始化已经使能触发ADC并配置计数模式了

问题4.

工程没有使用这个函数,可以注释掉;

问题5.

工程没有使用这个函数,因此声明和定义都可以删掉

问题6. ADCCOUNTER是在何时启动的呢?按照下文的描述,收到触发信号后会捕获ADCCOUNTER存储并到ADCPPBxTRIPLO.REQSTAMP,随后counter继续计数,用开始采样时刻的ADCCOUNTER减去ADCPPBxTRIPLO.REQSTAMP得到延迟时间。如果触发信号到来的时刻,ADCCOUNTER(12位计数器)的数值靠近4095,比如4080,那么开始采样时刻时的ADCCOUNTER数值有可能因为计数溢出为10吧,比如从4080溢出到10,本来经历了25个SYSCLK,但是如果用10 - 4080会导致DLYSTAMP的计算结果错误吧。

我在TRM手册中没有找到ADCCOUNTER计数器是何时启动的,不过感觉应该会有个启动条件吧,麻烦TI工程师指点一下

  • 用LaunchPad调试了 一下,只要使能外设时钟,ADCCOUNTER就启动了。那么,如果触发信号到来的时候,ADCCOUNTER的数值接近4095,或者说这个计数器在接下来的开始采样时刻之前发生了溢出,计算延迟会不会有问题

    代码中的这里的判断条件是2,应该怎么理解,为什么无延迟的时候DLYSTAMP等于2

  • 对于问题2

    ePWM1触发SOC0,ePWM2触发SOC1;

    对于SOC1,ePWM2的TB是增计数,周期9999+1 = 10000 x Tsysclk,CPMA = 二分之一PRD触发ADC采样;

    SOC0触发的频率高于SOC1,SOC0出现trigger到开始采样延迟发生在SOC1转换未完成时SOC0来了触发信号,所以配置SOC0的PRD时,不能使ePWM1的(PRD+1)x n = 10000,例程中ePWM1与ePWM的计数及触发采样方式相同。

    因为如果ePWM1的(PRD+1)x n = 10000,SOC0只会出现快于SOC1的触发时刻点和与SOC1同时触发的时刻点。在同时触发时,由于统计和计算SOC0的延迟,而SOC0的转换优先级高于SOC1,所以SOC0一定不会出现延迟,代码也就不会运行到ESTOP0。

    以上是对ePWM1的PRD设置的分析,例程设置成2048没有问题,如果设置成2499,大家就会看到我上面描述的SOC0无延迟现象

    再有就是又发现例程中两个明显的错误

    第一

    高亮语句应该是使能ADCINT2.目前的代码前后两条语句都是使能ADCINT1,我也的应该不对,请TI工程师确认

    第二

    ADCINT2的ISR中,为什么中断标志位的清零、overflow检测、ACK都是正对ADCINT1的呢

    这样和例程的原理说不通吧

    应该改成这样吧

    这个回复里提到的两个问题,会影响例程的测试结果,请TI工程师确认

  • 您好我们已收到您的问题并升级到英文论坛寻求帮助,如有答复将尽快回复您。谢谢!

  • 您好,

    工程师给出的答复如下:

    如注释中所写,SOC1的转换通道应该是A2,但是例程中SOC0和SOC1均为A0,虽然例程不关心转换结果,但是还是请TI工程是确认下是不是例程或者代码注释写错了

    是的,这里是一个错误。已在较新版本的 C2000Ware 中更改。请注意,我们在 C2000Ware 中的示例现在使用 SysConfig 进行类似这样的器件配置,而不是用硬编码 C。

    我觉得高亮部分的代码时冗余的,在do之前的初始化已经使能触发ADC并配置计数模式了

    这一部分并不冗余,因为它是一个 do-while 循环的一部分。转换完成后,ADC 触发器被禁用,并且 ePWM 计数器在断点前停止。 这样编写该代码是要使得在 CCS 调试期间单次执行代码循环-每次按下"Run/Continue"按钮时,它都会执行 ADC 转换并停止,从而可以让用户检查结果。 您不必重置执行即可再次运行。 

    工程没有使用这个函数,可以注释掉;

    该函数应该在 initADCSOC()之后从 main()调用。 它旨在向用户展示如何配置 PPB 跳闸限制。 使用 SysConfig 处理此配置的较新版本 C2000Ware 中修复了该问题已被修复。 

    工程没有使用这个函数,因此声明和定义都可以删掉

    是的,和上面的问题相同,SysConfig 不需要这些代码,您可以在 C2000Ware v4.00.00.00及更高版本中看到这些代码。

    用LaunchPad调试了 一下,只要使能外设时钟,ADCCOUNTER就启动了。那么,如果触发信号到来的时候,ADCCOUNTER的数值接近4095,或者说这个计数器在接下来的开始采样时刻之前发生了溢出,计算延迟会不会有问题

    在这种情况下不会出现问题,因为硬件会在计算延迟时间戳时自动处理溢出。 但是如果两个样本之间有4096个或更多周期,就会出现问题,因为只有第一个溢出会被硬件处理。 

    代码中的这里的判断条件是2,应该怎么理解,为什么无延迟的时候DLYSTAMP等于2

    ADC 触发信号与采样保持周期的开始之间有两个 SYSCLK 周期(请参阅 TRM 第20.12节中的时序图- ADC 时序)。 这是 DLYSTAMP 测量的值-触发和 S+H 周期开始的时间。 对于正常 SOC来说,此值应为2;如果大于2就会发生冲突。 

    高亮语句应该是使能ADCINT2.目前的代码前后两条语句都是使能ADCINT1,我也的应该不对,请TI工程师确认

    是的,这个bug在较新版本的 C2000Ware 中也修复了。

    ADCINT2的ISR中,为什么中断标志位的清零、overflow检测、ACK都是正对ADCINT1的呢

    这样和例程的原理说不通吧

    应该改成这样吧

    是的,这也是一个bug,在最新版本的 C2000Ware 中已修复。

  • 您好 感谢您的帮助,答复对我很有帮助 总结下有两点细节收获

    1.延时捕获硬件电路会自动处理第一次计数器溢出;

    2.从细节上讲,了解了时许图中Tigger到采样保持开始之间会有固定2个SYSCLK,这可以作ADC转换是否被延迟的判断依据。我之前确实没有注意到这2个SYSCLK可能在控制中起到的作用,其实时序图也没有特别仔细的看过。

    这个帖子唯一的一个问题就是问题3,我还是觉得高亮部分代码是冗余的,麻烦您看下我说的对不对

    如上图所示,第一部分代码在初始化中,使能了ePWM触发ADC并开启了ePWM的TB Timer

    随后进入do--while循环,首先将delay_index变量清零,随后的那部分高亮代码就是我认为冗余的,

    接下来执行到语句2,这里一个while循环,用DELAY_BUFFER_SIZE和delay_index之间的关系判断是否结束循环。

    DELAY_BUFFER_SIZE为30,delay_index只有当监测到ADC转换延迟时才会在adcA1ISR中断中加1,所以代码会一直停留在这里,知道监测到了30次中断延迟的发生才会退出循环,而在这个过程中,并没有什么操作停止ADC转换。

    上图高亮的代码应该监测到30次转换延迟退出while(DELAY_BUFFER_SIZE > delay_index){}后才被执行,而这个时候也确实是要结束采集了。

    这个do--while的循环,之间的代码不是一直被执行的,所以这里不用do--while结构应该也是可以的。

    综上所属,我还是觉得问题3中高亮的代码时冗余的

  • 我们来向工程师确认下哈。

  • 您好,

    带 Estop 的 Do-while 是我们在许多示例中使用的一种结构。 基本原则如下:

    • 设置和配置器件
    • Do-while loop
    1. 启动模块运行(ADC、ePWM)
    2. 运行loop/处理中断
    3. ESTOP0

    此结构可以使您在 CCS 中运行代码,并且运行一次后,它会在 while 循环结束时自动停止执行。 然后如果再次单击"Run"按钮,只会再次执行 while 循环,并在循环结束时停止。 每个循环迭代执行一次并停止,以便查看结果。

    这并不是您编写应用代码的方式;它只是我们实现的一个结构,用于更加轻松地评估/调试我们的示例。

  • 好的 感谢您的解答,我明白do while中原来我认为冗余的那部分代码的用以了

    没有注意到这里的注释是软件断点