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.

[参考译文] TMS570LC4357:连续转换模式下的 ADC 采样率比单次转换慢

Guru**** 2481465 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/985887/tms570lc4357-adc-sampling-rate-in-continuous-conversions-mode-is-slower-then-single-conversion

器件型号:TMS570LC4357
主题中讨论的其他器件:HALCOGEN

你(们)好

我想尽快配置我的 ADC。 在数据表中、最短转换时间为600ns。 我的 ADC 配置为:

VCLK = 110MHz
ADCPrescaler = 3
Halcogen 计算出的实际周期时间= 36.36ns
ADC 通道选择仅为1个引脚。
计算得出的 Halcogen 总采样时间= 800ns

当程序进入 ADC 组存储器阈值中断时、我切换一个引脚、并通过示波器测量该引脚。

当我在连续模式下配置 ADC 时、测得的频率为1.119kHz、总中断次数/秒为2238。 我的组内存为64字、FIFO 大小为64。 因此、我的采样频率为1119 x 2 x 64 = 143232、采样周期 为6981ns。

当我将 ADC 配置为单次转换模式时、我在  ADC  组存储器阈值中断中重新启动转换。  

引脚频率为8870Hz。 最后、采样周期 为880ns。

为什么这两个频率不同?  

我不想在  实际应用中使用 ADC 组存储器阈值中断、也不想在 连续转换模式中使用 ADC。
我出了什么问题?

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

    您好!

    在连续模式下、 每次代码 从结果存储器中读取转换结果时计数器都会递增。 如果您在 ISR 中读取转换结果、测量值可能不准确。

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

    我使用 DMA 读取转换结果。 当我将 ADG1DMACR 配置为 G1_DMA_EN 或 DMA_G1_END 时、没有 DMA 传输。 但我配置 DMA G1_BLK_Xfer DMA 传输开始。 即使我更改 了 G1_blocks 计数、DMA 帧传输计数也始终相同。 并且必须将  ADG1MODECR 中的 OVR_G1_RAM_IGN 位置位、以开始 DMA 传输。
     
    在我的情况下、哪些因素会延长这段时间? DMA 读取 ADC 结果的存储器速度不能足够快、或者 ADC 不能生成 DMA 请求正确的时间?

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

    OVR_G1_RAM_IGN 默认被清除、ADC 不会覆盖 G1结果存储器的内容。 我认为新的 ADC 转换数据出现时 DMA 传输尚未完成。  

    请尝试更长的采样时间、以检查您的测量结果是否正确。

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

    gioTogleBit (..) 函数调用将花费50个 CPU 时钟周期。 如果 GCLK 为300MHz、此函数需要1667ns、这是 ADC 采样时间的两倍(800ns)。

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

    如前所述、递减计数器从 G1_blocks (设置中为64)开始递减计数、每次 代码从 FIFO 读取转换结果时递增。 每当计数器从+1转换为0时、就会生成 DMA 请求。  

    当 ADC 完成64次转换后、将产生 DMA 请求、同时还将产生阈值中断。 ADC 处于连续转换模式、因此转换继续进行

    如果 ADC 在 DMA 必须从 FIFO 读取第一个转换结果之前再转换一个通道、 计数器将递减到-1。

    3. DMA 开始逐个读取转换结果, 每次 DMA 读取的计数器都会递增

    4、如果 ADC 在计数器为1时写入另一个转换结果、计数器从+1转换为0、这将触发另一个 DMA 请求和阈值中断、尽管自上次生成 DMA 请求和阈值中断以来尚未进行64次转换。

    这就是为什么我要求您在测量中使用更长的采样时间。  

    我建议您使用单个转换序列、该序列会使用支持的多个触发选项之一定期触发。

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

    感谢您的回复 

    我发现了 ADC 变慢的原因。 我使用 DMA FTC 中断测量频率。 但实际上 ADC 转换周期不会改变。 ADC DMA G1_blocks 计数器是问题所在。 置位时、该计数器的第一个 DMA 请求为 true。 但是、在 DMA 请求之后、计数器不会处理到所选的值、它从512递减。 因此、DMA FTC 中断在512次转换后发生。 我必须在每个 FTC 中断处为 G1_blocks 提供服务。

    在该解决方案之后、我可以获得 ADC 结果的几乎所需频率。 我的转换速度太快、如果我在 FTC 中断中为 G1_Blocks 提供服务、我将丢失2个转换结果。 如果我将转换速度设置为较慢的值、则不会出现此问题、但我必须使用最快的转换速度、并且我认为2次转换损耗不会影响我的应用。

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

    我认为您的计算具有额外的零。 如果该函数需要50个 CPU 周期、则需要166.7ns。 我确信这个函数不会影响我的测量方法、即使我在800ns 周期发生的 ADC 转换结束中断中调用它也是如此。

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

    感谢 Enes 分享您的发现。  

     gioTogleBit (..)  花费大约50个 CPU 时钟周期、但我的计算错误、它是166.7ns 而不是1667ns。