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.

[参考译文] CCS/TM4C123GH6PM:有关 Code Composer Studio 的 ADC 帮助

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/894502/ccs-tm4c123gh6pm-adc-help-on-code-composer-studio

器件型号:TM4C123GH6PM
主题中讨论的其他器件: TM4C123

工具/软件:Code Composer Studio

对于一个项目、我们的团队必须将模拟测量转换为数字数据。 我们使用的是 Tiva C 系列 TM4C123GH6PM。 我们如何使用 Code Composer Studio 不仅将模拟值数字化、还存储这些值。 我们的计划是将光电二极管的输出连接到微控制器的模拟输入引脚、并使用 Tiva 的 ADC 功能将模拟值数字化。 但是、我们需要一些有关如何在 Code Composer Studio 中执行此操作的指导。  Tiva C 系列 TM4C123G LaunchPad 技术讲座的实验5介绍了 ADC、但它们处理 的是来自片上温度传感器的数据。  

谢谢你。

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

    CB1、

    您完全正确。 我应该已经说过"如果调用此函数时没有 ADC_CLOCK RATE 参数或其他 ADC_CLOCK RATE _xxxx 参数之一、则该函数将默认将速率设置为每秒125K 个样本。  

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

    Bob、

    谢谢您-欢迎并感谢您的积极评论。

    正如我主要是年轻的员工所注意到的-您在引导(这)和其他海报中已经"超越"了。   

    要正确理解这些基于 ARM 的 MCU"做的事"、需要通过海报集中精力-他们必须认识并接受这一责任... 这证明"风险"(由于用户需求的数量和种类)"总是在救援时由 Bob、Charles 或 Ralph 计算"。   (和-正如这里的工作人员所指出的... crüe CB1 (或 T Ü V!)的救援风险、值得信赖

    识别并制定系统"方法和程序"以解决问题的海报通常会"演示"关键/关键"观察、答案和发现!"   

    自己... 由此产生的"满意度"大大增强了功能 、确保"进一步提升他们的动力、能力和效率"、从而"增强"用户的信心、愉悦和成功...

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

    ADC:

    • 关于您5月7日的帖子、我想澄清您所说的内容。 当您说“…1us 采样率正确使用此函数是:Δ Σ”时,您会说您发布的代码行 ADCClockConfigSet (ADC0_BASE、ADC_CClock_SRC_PIOSC |ADC_CClock_RATE_FULL,1)是使用该函数将 ADC 时钟设置为在默认16MHz 下运行的方法。 也就是说、它与注释掉该行代码相同。 另外、感谢您澄清说时钟分频参数仅供 TMC129器件使用、如果没有 ADC_CLOCK_RATE_FULL 参数、ADC 默认为125K 采样/秒的速率。
    • ADC 时钟为什么独立于系统时钟、这是否有原因? 这是硬件限制吗?

    计时器

    • 您之前已经验证过,我们每隔3us 就会检查计时器是否会触发一次,以332.8K 样本/秒的采样率进行正确采样。 这通过函数 MAP_TimerLoadSet (TIMER0_BASE、TIMER_A、MAP_SysCtlClockGet ()/ 332800 -1)来完成。 关于我们加载计时器的第三个参数,我不清楚该第三个参数是如何以332.8K 样本/秒的采样率或我们选择的以替代332800的任何采样率进行采样的。 由于我们已将系统时钟设置为80MHz,MAP_SysCtlClockGet()将返回80*10^6,我们将其除以332800并减去1,结果为~ 239。

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

    [引用 user="Muhammad Rezuna">当您说“在1uS 采样率下正确使用此函数是: …、"您说您发布的代码行 ADCClockConfigSet (ADC0_BASE、ADC_CClock_SRC_PIOSC |ADC_CClock_RATE_FULL、1)是使用该函数将 ADC 时钟设置为在默认16MHz 下运行的方法。 也就是说、它与注释掉该行代码相同。

    是的。

    [引用 user="Muhammad Rezuna">您之前已通过检查计时器每3us 触发一次来验证我们是否能够以332.8K 样本/秒的采样率进行正确采样。 这通过函数 MAP_TimerLoadSet (TIMER0_BASE、TIMER_A、MAP_SysCtlClockGet ()/ 332800 -1)来完成。 关于我们加载计时器的第三个参数,我不清楚该第三个参数是如何以332.8K 样本/秒的采样率或我们选择的以替代332800的任何采样率进行采样的。 由于我们已将系统时钟设置为80MHz,MAP_SysCtlClockGet ()将返回80*10^6,我们将其除以332800并减去1,结果为~ 239。[/引号]

    定时器加载值239并递减至0。 它在 ADC 到达零时触发、然后在下一个系统时钟时再次从239开始。 这意味着 ADC 每240个系统时钟周期启动一次。 当系统时钟为80MHz 时、时间为240 x 12.5nS = 3.00uS、或每秒333.333、333个样本。 采样率略高于请求的采样率。 然而、下一个较低的采样率将是每241个系统时钟周期、这将提供331,950个样本/秒的采样率。

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

    目前、我们在从 ADC 收集数据方面没有任何问题。 但是、当我们将 ADC 算法与交叉相关算法集成时、我们会经历很长的执行时间。 交叉相关算法对该过程进行了简要说明、包括对两个数组的元素乘积进行乘法和求和。 我们使用两个软件生成的波形测试了交叉相关算法、发现执行时间大约为3秒。 但是、当我们采用 ADC 算法时、即交叉相关、其中一个数组是软件生成的、另一个数组是 ADC 转换数组、执行时间大约为45秒。 我们怀疑、在 ADC 收集数据的时间到交叉相关开始之前、背景中正在发生一些事情、这些事情正在减慢或占用 MCU。 我们发现、在捕获所有数据后禁用 ADC 中断 IntDisable (INT_ADC0SS0)会缩短执行时间。 我们还尝试禁用其他外设、例如 UDMA 和计时器、但这些外设并未缩短45秒以上的执行时间。 后台运行的内容可能会减慢执行时间?

     

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

    在代码中设置一个断点、用于传输数量递减到1的时间。 检查 ADC 序列0中断请求标志是否被置位。 如果是,请通过对 ADCIntClear ()的调用将其清除。

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

    我想澄清一点、当您说"在代码中设置一个断点、当传输数量递减到1时"、这意味着在 ADC 中断例程中、最后1024个采样刚刚完成、即将正确传输? 换言之、此时已采集所有样本、我们要检查采样序列发生器0是否仍在请求转换。 我已经在 ADCSequenceStepConfigure()中配置了 ADC,这样当步骤通过设置 IE 位完成时就会产生中断,您在提到检查 ADC 序列0中断请求标志是否被设置时,是否会引用这种情况? 然后、我应该在采集完所有样本后调用 ADCIntClear ()、以便 ADC 停止请求转换。

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

    是的、这就是我所要求的。

    我运行了您之前发送的用于收集的示例代码。 我看到、当它达到条件"numTransfer == 1"时、有一个 ADC 序列0请求等待处理、但 ADC 中断被禁用、因此它只命中该代码一次。 不确定您当前代码中的不同之处。

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

    再次感谢您查看我们的代码。 您如何才能查看 ADC 序列0请求是否暂挂? 我们使用了一个变量来检查它是否确实达到了条件"numTransfer == 1"、正如您所说的、但不一定是一个请求正暂挂。 自从我先前发送的代码以来、我们的电流已经被修改、我们已经将交叉相关算法组合到同一个 CCS 项目中、并且禁用了外设中断。  

    正如我之前提到的、执行时间大约为45秒。 我们使用 LED 测试了我们的逻辑、以查看代码的哪一部分在45秒内耗时了大部分时间。 我们将从一个代码点点亮 LED、并在另一个代码点将其关闭、以测试该代码段的执行时间。 我们发现大部分执行时间发生在计时器启用后、直到结束(包括交叉相关)。 我们推测、一旦计时器开始、因此转换、即使我们禁用了外设和中断、仍会在后台运行。 我们检查了传入信号的振幅是否影响了我们的执行时间、但情况并非如此、在不同的振幅下、我们仍将获得45秒的时间。   

    我还想澄清在数据收集过程中发生的所有事件。 计时器会定期触发 ADC、从而让 ADC 知道何时进行采样。 由于我们将仲裁大小设置为1、因此每次 ADC 进行转换/采样时、数字值都会被复制到缓冲区中、然后将其传输到目的(数据数组)。 将 ADC 与 UDMA 配合使用时、 UDMA 会在传输任意数量的数据(最大1024 -这是我们选择的)后引起 ADC 中断、然后切换正在填充的缓冲区。  在整个过程中还会发生什么其他中断? 即使在外设被禁用后、它们是否仍然会发生、而这些外设负责延长执行时间?e2e.ti.com/.../4606.ADC_5F00_Capstone.zip

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

    main.c 的第154行是37秒的延迟。 这可能是您45秒的一大部分时间。

    SysCtlDelay (1000000000u);//任意延迟。 在关闭 ADC 和计时器之前、为 UDMA 提供足够的时间来传输最后1024个样本
    

    3个周期 x 1、000、000、000 / 80、000、000个周期/秒 = 37秒

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

    将该值减少到 66500u 只会导致大约2.5ms、而37秒则仍然为 UDMA 提供足够的时间在计时器停止前传输最后的1024。 话虽如此、我们希望能够针对我们想要的尽可能多的样本收集多个样本(即、让 ADC 收集4096个样本、禁用计时器并重复)、但我们遇到了错误。

    我们一直在使用 GUI Composer 测试我们的代码、首先选择分析方波的频率、与 ADC 转换交叉相关的波形、 然后选择样本数量(即我们要处理的数据收集集的数量-基本上是我们要运行/停止 ADC 的次数),然后我们在其中对最大相关值求平均值,但选择了许多数据集。 当我们运行该程序一次时、一切正常-收集4096个样本、禁用计时器、并计算最大相关性值。 当我们第二次运行它时、在重新启用计时器后、ADC 转换关闭、从而使最大相关性结果偏离。 有趣的是、当我们第三次运行时、新收集的4096个样本再次正确、最大相关性准确;我们发现每个奇数运行的结果对于偶数运行都是准确和不准确的。  

    注意:除了 ADCseq0Handler()内部的延迟时间之外,我们对我发送的早期代码所做的一个更改 在启用 while 循环内的计时器之前已经设置了 DMA(),这是必要的,因为我们需要重新初始化主缓冲区和备用缓冲区在 ADC 的多个运行/停止情况下,在前4096个样本完成后传输数据的位置。 换句话说、我们运行一次程序来收集4096个样本并禁用计时器、当我们再次运行它时、我们需要重新初始化主结构和备用结构、以便分别在索引0和1024处传输、从而覆盖之前的4096值。 我们不确定在集合的偶数次数期间会影响 ADC 转换的因素。  

    第一幅图像显示了 ADC 以奇数次运行的次数收集的样本、而第二幅图像显示了以偶数次运行的次数收集的 ADC 样本。 运行次数意味着一组样本。  

    e2e.ti.com/.../ADC_5F00_CAP.zip

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

    更多上下文:

    测试、以查看在单击"运行关联"时是否会收集一组新的4096个样本。 对于该测试、我将以10mV 偏移(因此模拟值大约为0至20mV)的10mV 方波传入 ADC。 当我单击"Run Corr相关性"一次时、将收集4096个样本、如图1中的 ADC 数据图所示。 然后、我阻止函数发生器传入方波信号、并希望看到新的4096个样本集大约为0 (噪声会使 ADC 值非零)。  一旦信号关闭、再次单击"Run Corr相关性"、似乎索引1024-3072中的值没有被覆盖、因为它们仍然保存了之前的值、如图2所示。 直到我再次单击"Run Corr相关性"、我们才会看到准确的 ADC 捕获-图3显示、由于输入关闭、数据数组具有大约0V 的模拟值。  

    我们不确定每次点击"Run Corr相关性"按钮后为什么不更新中间指数。 每次点击后、一旦定时器被启用、定时器被禁用、一组新的4096个样本被收集、并且 UDMA 的缓冲器复位其目标地址、这样它就从数据数组的开头开始。 图4显示了在每个"运行关联"期间发生的情况;单击按钮时、buttonCount 会大于0、这会打开 GUI 上的 LED 小工具、让用户知道它正在输入 if 语句并进行计算。  

     

    图1:

    图2:

    图3:  

    图4:

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

    每次 "button >0"时、我看不到您将变量"numTimesInt"重置为1的位置。 (我可能没有您的最新代码。) 如果您在主线程和中断例程中引用了静态变量、则需要添加限定符"volatile"。

    您确实需要使用断点、单步执行代码 并自行调试。 我很高兴回答有关如何使用 TM4C123器件的问题、但我不应该为您调试代码。

1 2