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**** 2039090 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、但它们处理 的是来自片上温度传感器的数据。  

谢谢你。

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

    首先、请下载 TivaWare 库和示例 :http://www.ti.com/tool/SW-TM4C

    下面是一个可导入工作区的简单 ADC 示例。 使用 Code Composer "File""Import"功能直接从以下.zip 文件导入工程 :/cfs-file/__key/communityserver-discussions-components-files/908/5554.ADC.zip

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

    我已下载 TivaWare 库 TivaWare_C_Series-2.1.4.178。 但是、我很难在 CCS 中导入 ADC 示例。 我从 zip 文件夹中下载并解压缩了文件、但不允许我将其导入 CCS。 有什么想法吗? 谢谢你。

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

    出现此问题的原因是我有另一个名为"adC"的项目。 我将查看该示例。  

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

    关于上面链接的 ADC 示例、我有一些问题要澄清我对 Tiva 的 ADC 工作原理的理解。

    • 根据我对 Tiva 数据表的理解、ADC 为每个 ADC 模块(ADC0和 ADC1)提供4个序列发生器(SS0、SS1、SS2和 SS3)。 将“main”开头的 int 数组定义为长度为4,以匹配序列1的 FIFO 深度,该示例任意选择了该值,这就是原因吗?
    • 我不确定为什么在本示例中使用两个引脚(AIN0和 AIN1)。
    • 以下代码行更多地设置了 ADC。 TivaWare 库中的函数是吗? 注释有助于简要解释代码。
    • 进入 while 循环
      • 转换是如何定义的? 它是否在预编译函数“ADCProcessorTrigger()”中?
      • int 数组的所有四个指标最终都要填充吗?
      • while 循环的终止条件(如果有)是什么?
      • 关于我们的项目、我们需要转换有限数量的模拟值;这可能是需要数字化的大量数据。 是否可以先创建具有所需索引数量的数组、然后用转换后的值填充每个索引? FIFO 的深度如何影响这一点?

    谢谢你。

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

    [引用 user="Muhammad Rezuna"]“main”开头的 int 数组被定义为长度为4,以匹配序列1的 FIFO 深度,该示例任意选择了该值,这就是原因吗?

    是的、没错。

    [引用用户="Muhammad Rezuna"]我不确定为什么在本示例中使用两个引脚(AIN0和 Ain1)。[/引用]

    这是一项武断的决定。 它显示可以在一个序列中选择多个通道、而不是需要使用所有可用的步骤。

    [引用 user="Muhammad Rezuna">以下代码行是 ADC 的更多设置。 是否来自 TivaWare 库的函数?

    是的、所有以 ADC 开头的函数都来自 TivaWare 库、并记录在 C :\ti\TivaWare_C_Series-2.1.4.178\docs\SW-TM4C-DRL-UG-2.1.4.178.pdf 的第4节中

    [引用 user="Muhammad Rezuna">如何定义转换? 它是否在预构建函数“ADCProcessorTrigger()”中?

    是的

    [引用 user="Muhammad Rezuna"]是否最终要填充 int 数组的所有四个索引?

    在本例中、不是 如果我们在调用 ADCSequenceDataGet ()之前调用 ADCProcessTrigger()两次,那么 FIFO 中的所有四个条目将被填充,数组中的所有4个值将从 FIFO 中填充[]。

    [引用 user="Muhammad Rezuna"] while 循环的终止条件(如果有)是什么?

    没有。

    [引用 USER="Muhammad Rezuna)]关于我们的项目,我们需要转换有限数量的模拟值;这可能是需要数字化的大量数据。 是否可以先创建具有所需索引数量的数组、然后用转换后的值填充每个索引? FIFO 深度如何影响这一点?[/quot]

    这是将 DMA 与 ADC 结合使用的好情况。 如果采样频率精确、则应使用计时器来触发 ADC、而不是处理器触发器。 下面是另一个示例项目、它使用计时器触发 ADC 并使用 DMA 填充64个采样缓冲器、然后在第一个缓冲器正在处理时使用"乒 乓"填充第二个缓冲器。

    /cfs-file/__key/communityserver-discussions-components-files/908/2821.ADCwDMA.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    • 您能否详细介绍序列发生器的 FIFO? 当序列发生器的 FIFO 深度为4时、这意味着它一次只能跟踪4个值吗?
    • 您能否详细说明使用计时器触发 ADC 与处理器触发之间的区别? 根据我的理解、触发器用于让 Tiva 知道何时开始转换/收集数据、这是正确的吗?
    • 关于新示例(ADCwDMA)
      • 该示例尝试实现什么目标? 是否有项目/实验室规范的文档?
      • 我不熟悉示例中使用的许多函数、TivaWare 文档中是否记录了这些函数?
      • 当您说项目“使用计时器触发 ADC 并使用 DMA 填充64个采样缓冲器”时,这是否意味着项目正在尝试数字化64个模拟值?

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

    [引述 USER="Muhammad Rezuna">您能否详细说明序列发生器的 FIFO? 当序列发生器的 FIFO 深度为4时、这意味着它一次只能跟踪4个值吗?

    没错。 FIFO 的目的是在 CPU 需要读取 ADC 控制器的结果之前、让 CPU 有更多的时间来覆盖或丢失这些结果。 使用由 CPU 触发的转换时、您可能看不到该值、但会考虑由计时器启动的周期性转换。 ADC 转换完成后、CPU 可能忙于执行其他一些时间关键型任务。 FIFO 允许 ADC 存储该转换(序列1最多为4)、并在 CPU 必须读取结果之前为 CPU 提供更多时间。

    [引用 USER="Muhammad Rezuna">您能否详细说明使用计时器触发 ADC 与处理器触发之间的区别? 根据我的理解、触发器用于让 Tiva 知道何时开始转换/收集数据、这是正确的吗?

    在对交流模拟信号进行数字分析时、了解信号采样的频率非常重要。 如果您正在执行连续转换、则可以使用 CPU 触发器启动该转换并知道采样频率。 但是、如果您需要较低的采样率、则应使用计时器。 如果您有中断或任何有条件的执行代码、软件循环的采样率将不一致、也不容易预测。

    [引用 user="Muhammad Rezuna">示例尝试实现的目标是什么? 是否有项目/实验室规范的文档?

    它只是以16KHz 对模拟信号进行采样的一个示例。 演示了如何配置计时器和 DMA 以与 ADC 配合使用。

    [引用 user="Muhammad Rezuna"]我不熟悉示例中使用的许多函数,TivaWare 文档中是否记录了这些函数?

    很抱歉、我必须在这里给您一点帮助。 您是否查看过我在上一篇文章中提到的 TivaWare 文档? 我知道您是一名学生、因此我让您感到有些松弛、但您需要了解、此论坛不能代替阅读所需的文档。 试图这样做会浪费您的时间和我的时间。

    [引用 user="Muhammad Rezuna"]当您说项目“使用计时器触发 ADC 并使用 DMA 填充64个样本缓冲器”时,这是否意味着项目正在尝试数字化64个模拟值?

    该示例持续以16KHz 的速率对模拟信号进行数字化。 它将结果存储在一个64样本缓冲器中、然后切换到第二个缓冲器。 当第二个缓冲区已满时、它切换回第一个缓冲区、覆盖原始数据。 该方案无限期地继续下去。 想法是 CPU 可以处理一个数据缓冲区、而另一个缓冲区正在被填充。  

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

    在本例中、我们正在分析的交流模拟信号的频率为1.3KHz、我们希望将信号存储在长度为4096的数组中。 我们还希望将采样率更改为332.8kS/s、而不是默认的1ms/s  频率为1.3KHz 时、周期约为317ms。 正确的方法是否是使用计时器触发 ADC、因为我们正在降低采样率、并使用中断通知 ADC 何时停止转换? 然后、我是否需要配置 UDMA 控制器来存储存储4096个数字化值所需的数据? 如果信号周期约为317ms (1/频率)、这是否意味着每个元件都必须是77.4微秒(317ms/4096)间隔的平均值?

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

    您好!

    在寻求(进一步)供应商帮助之前、您可能需要"重新查看您的计算结果"。

    [引用 USER="Muhammad Rezuna"]频率为1.3KHz 时,周期约为317ms。[/引用]

    不是。   和-这会使您的"后继"平均 ADC 转换间距77.4µS μ m 无效。

    此外-采样率是如何选择332.8KS/S 的?   奈奎斯特接受(明显)较低的频率-它不是吗?

    [引用用户="Muhammad Rezuna"]... 中断、让 ADC 知道何时停止转换? [/报价]

    您是否应该开发一些方法来"停止转换"-您是否没有意识到"一个 ADC 快照(由4096个元素组成)及时?"   这是你想要的吗?   如果是、您如何确定何时 启动转换、即使是何时启动?

    此帖子旨在通过早期识别和解决(可疑)问题来代表您实现最佳供应商响应...

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

    我还被数学运算所迷惑、但如果您想以332.8K 采样/秒采样、请使用我提供的 ADCwDMA 示例并将 init_Timer 中的 TimerLoadSet()函数从"MAP_SysCtlClockGet ()/16000 -1 "更改为"MAP_SysCtlClockGet ()/332800 -1 "。 由于 UDMA 传输的最大大小为1024个数据单元、因此请使用乒乓模式填充四个顺序缓冲器、以获取4096个采样。

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

    我在计算中 µs 了一个错误、周期(1/频率)将为0.769 ms、然后转换为0.189 μ s (0.769mS/4096)的平均 ADC 间距。

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

    TM4C ADC 无法在低于1uS 的时间内进行转换。 为什么要在 单个周期内进行4096次转换? 您正在尝试实现什么目标?

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

    我已经意识到我进行了计算误差,周期(1/frequency)将为0.769mS,因此转换为0.189µS μ s 的平均 ADC 转换间隔。

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

    让我后退一步,尝试解释我们计划尝试实现的目标,因为我意识到我做出了另一个解释错误

    • 首先、这就是我们要做的:我们要执行交流模拟信号(激光)与方波的交叉相关。 通过在 MATLAB 上进行仿真、我们发现交叉关联4096个数据点是理想的。 该项目需要使用来自激光的数据、我们必须先将其数字化、然后才能进行交叉关联
    • 采样时间应为激光的周期(0.768mS)乘以我们希望交叉相关的脉冲数(16)、大约为12.3mS。 因此、将采样时间(12.3mS)除以点数(4096)可得到大约3µS μ s 的 ADC 间距。

    希望这能消除误解。

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

    可以针对4096个采样每3us 转换一个通道。 使用我发送给您的 ADCwDMA 示例作为起点。

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

    在阅读了更多 TivaWare 外设的驱动程序库用户指南之后,我对 ADCwDMA 示例有一些疑问:

    • 关于 ADC:
      • 我对函数 ADCSequenceStepConfigure()有一些问题。 第四个参数(文档称为 ui32Config)是多个值的逻辑 OR。
        • 该示例具有以下参数:ADC_CTL_CH0|ADC_CTL_END_ADC_CTL_IE。 使用这些参数、我得到选择通道0、该步骤是序列中的最后一步、并且在步骤完成时将发生中断。 我的问题是、如何选择通道0? 如果指定这是 ADC 的最后一步、则产生的中断会产生什么作用?

    • 关于 μ µDMA 控制器:
      • 第583页显示:“为了支持所有通道和传输模式,控制表数组应为1024字节,但根据使用的传输模式和实际使用的通道数,它可能更少。” 这是否意味着、假设我们按照您的建议使用 Ping Pong 传输模式、那么主数据结构和备用数据结构可以一次保存1024个数据值?

      • 在 ADCwDMA 示例的函数 intit_dma()中,调用“uDMAControlBaseSet (ucControlTable)”行。 “ucControlTable”定义为长度为1024。 您能否解释#pragma DATA_ALIGN (ucControlTable、1024) uint8_t ucControlTable[1024]行的重要性? 根据我的研究,第一行将 ucControlTable 定位在可被1024平均除的地址,并且当符号位于特殊地址边界时,有时会使用函数 DATA_ALIGN。 后一行创建长度为1024的未分配 int 数组。

    更多问题:

    • 如何利用函数 ADCseq0Handler()? 它不在 main 中调用
    • 我们如何确定在哪个位置运行时钟? 在本示例中、是否刚刚选择了80MHz?

     

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

    [引用 user="Muhammad Rezuna">我对函数 ADCSequenceStepConfigure()有一些问题。 第四个参数(文档称为 ui32Config)是多个值的逻辑 OR。

    • 该示例具有以下参数:ADC_CTL_CH0|ADC_CTL_END_ADC_CTL_IE。 使用这些参数、我得到选择通道0、该步骤是序列中的最后一步、并且在步骤完成时将发生中断。 我的问题是、如何选择通道0? 如果指定这是 ADC 的最后一步、则产生的中断会产生什么作用?

    [/报价]

    您的理解是正确的。 通道0是任意选择的、但您必须为每个步骤选择一个通道。 同一通道可用于多个步骤。

    我不知道从哪里开始第二个问题。 您是否不熟悉中断的概念? 启用中断的步骤完成后、中断(如果在 NVIC 嵌套矢量中断控制器中也启用并全局启用)将暂时停止执行当前指令线程并跳转到中断服务例程。 在本例中,它是函数 ADCseq0Handler()。 它使用该例程、因为该例程的地址放置在 tm4c123gh6m_startup_ccs.c 文件中定义的矢量表的 ADC0中断例程点 当该函数完成时、CPU 返回到原始线程。

    [引用 user="Muhammad Rezuna]]第583页中说:“为了支持所有通道和传输模式,控制表数组应为1024字节,但根据使用的传输模式和实际使用的通道数,它可能更少。” 这是否意味着、假设我们按照您的建议使用 Ping Pong 传输模式、主数据结构和备用数据结构一次可以容纳1024个数据值?

    是和否 不要将控制表与目的缓冲区相混淆。 应将控制表分配并对齐为1024字节。 最大 uDMA 传输计数也是1024。 这意味着最大目标缓冲区大小为1024字节、半字或字。 在我的示例中、它只有64个半字。

    [引用 user="Muhammad Rezuna]ADCwDMA 示例的函数 intit_dma()中,调用一行“uDMAControlBaseSet(ucControlTable)"。 “ucControlTable”定义为长度为1024。 您能否解释#pragma DATA_ALIGN (ucControlTable、1024) uint8_t ucControlTable[1024]行的重要性? 根据我的研究,第一行将 ucControlTable 定位在可被1024平均除的地址,并且当符号位于特殊地址边界时,有时会使用函数 DATA_ALIGN。 后一行创建长度为1024的未分配 int 数组。

    您基本上是正确的。 第二行创建1024个无符号字节的数组。 需要在1024字节边界地址上对齐、这是因为 UDMA 硬件。  

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

    有关示例的更多问题/说明:

    • 我熟悉中断的概念,但是我不知道 ADC_CTL_IE 行  发出了一个中断,导致 CPU 跳转到例程 ADCseq0Handler()。 我不知道文件 tm4c123gh6m_startup_ccs.c  
    • 定时器启用后、CPU 如何自动知道先填充主缓冲器、或者先填充主缓冲器?

    对于我们的项目:

    • 关于 uDMA 控制器、仲裁数目是指在 uDMA 控制器重新仲裁通道优先级之前以猝发方式传输的数据单元数。 在示例中、64是仲裁数目、因为这是所选的缓冲区数目。 我计划使用最大传输值1024、使用最大传输值是否会产生任何后果?
    • 如前所述、我们需要 ADC 收集4096个采样/数据点。 我们使用 uDMA 控制器将数据从 ADC 传输到两个缓冲区。 我的项目方法是:
      • 我们可以有两个缓冲器、每个缓冲器将容纳1024个样本、并有一个长度为4096的数组。 将第一组1024个样本存储在一个缓冲区中、然后将数据传输到长度为4096的数组。 缓冲区填满后、我们可以开始将数据从 ADC 传输到第二个缓冲区、以存储第二组1024个样本、然后将其发送到长度为4096的数组。 此过程将再次重复、以完全填充4096长度的数组。 这是正确的方法吗?
    • 启用计时器后、就会进行数据转换和保存、如 ADCwDMA 示例、但如何阻止 ADC 转换更多数据?

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

    [引用 user="Muhammad Rezuna"]启用计时器后,CPU 如何自动知道先填充主缓冲区,或者先填充主缓冲区?

    CPU 不会填充缓冲器、UDMA 会填充缓冲器。 CPU 启动计时器、计时器启动 ADC。 当 ADC 进行转换时、它会触发 UDMA 将数字值复制到缓冲区。 UDMA 始终使用 主控制结构体启动。 在乒乓模式下、当 UDMA 完成了请求的传输次数后、会产生 ADC 中断并切换到使用副控制结构体。  

    [引用 user="Muhammad Rezuna">关于 uDMA 控制器、仲裁数目是指在 uDMA 控制器重新仲裁通道优先级之前以猝发方式传输的数据单元数。 在示例中、64是仲裁数目、因为这是所选的缓冲区数目。 我计划使用最大传输值1024、使用最大传输值是否会产生任何后果?

    否! 如果每3uS 只转换一个通道、则无需设置仲裁大小而不是1。

    您无需使用单独的缓冲区、然后将数据从一个缓冲区复制到另一个缓冲区。 创建一个包含4096个半字的大数组。 将主 uDMA 通道目标地址设置为&ui16Array[0]。 将备用 uDMA 通道目标地址设置为&ui16Array[1024]。 在 ADC 中断例程中、有一个静态变量、可记录中断次数。 将该变量初始化为0。 在中断例程中、如果该值为:

    0:这意味着采用前1024个样本、现在 UDMA 使用副控制数据包填充1025-2048个样本。 使用目标地址\ui16Array[2048]设置主数据包并重新启用它。 然后使静态变量递增

    1:表示 uDMA 已完成对阵列的1025-2048填充、并切换回主控制结构、并开始填充样本2049-3072。  使用目的地址\ui16Array[3072]设置备用数据包并重新启用它。 然后使静态变量递增。

    3:表示 uDMA 已经完成了对数组填充3072个值的操作、而副控制数据包现在得到的是最后1024个值。 只需增加静态变量。

    4:已捕获所有4096个值。 禁用 ADC 和计时器。 设置一个标志(或使用静态变量等于4的事实)来通知主代码它可以处理数据。

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

    在研究了语法和代码之后、我尝试逐步浏览您提供的示例(ADCwDMA)。 进入 while 循环、 BufferStatus[0]=填充、BufferStatus[1]=空。  要输入其中一个 if 语句、其中一个 BufferStatus 必须= FULL。 只有 BufferStatus 发生变化时,函数"ADCseq0Handler()"中才会发生变化。 为了使用该函数、我了解必须发生中断。  我对何时调用中断感到困惑、这样编译器将进入中断处理程序(ADCseq0Handler)以更改缓冲器状态。 因为如果不更改 bufferstatus、while 循环将永远不会输入 if 语句。

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

    在研究了语法和代码之后、我尝试逐步浏览您提供的示例。 进入 while 循环 缓冲区 Status[0]=填充且 BufferStatus[1]=空。 要输入其中一个 if 语句、其中一个 BufferStatus 必须= FULL。

    只有 BufferStatus 发生变化时,函数"ADCseq0Handler()"中才会发生变化。 为了使用该函数、我了解必须发生中断。 我对何时调用中断感到困惑、这样编译器将进入中断处理程序(ADCseq0Handler)以更改缓冲器状态。 因为如果没有"Change in bufferstatus"、while 循环将永远不会输入 if 语句。

    谢谢你

    Muhammad Rezuna

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

    当 UDMA 已经完成传输由函数 uDMAChannelTransferSet()编程的请求的转换数时、ADC 中断发生。 在我的示例中、它是在64次转换之后。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    • µDMA、当 μ 完成我们设置的传输次数后、程序将跳转到 ADCseq0Handler()中断例程。 代码中没有对中断的显式调用。

    • 在 ADCwDMA 示例中,在函数 ADCClockConfigSet()中,时钟速率设置为 ADC_CLOCK_RATE_HALT_Half,TivaWare 用户指南指出,它每隔一个其他样本就会提供该时钟速率。 这是否意味着没有记录其他所有样本? 话虽如此、如果我们希望为项目记录每个样本、我们应该将其更改为 ADC_CLOCK_RATE _FULL?

    • Tiva ADC 是否可以在8位而不是12位进行转换? 我提出这个问题的原因是因为相关算法的性能目的。 如果有可能,我们需要在 uDMAChannelControlSet()中相应地配置 μ µDMA 数据传输大小。

    • 我还有关于系统节拍(SysTick)的问题。 在该示例中、每10微秒(周期)调用一次中断。 根据我的理解、SysTick 的中断处理程序只会更新/递增计数器 g_ui32SysTickCount。 SysTick 是否有其他重要意义?

    关于我们的项目、我们希望能够收集不同大小的样本(即2048、8192等)、因此我们对 ADC 中断处理程序进行了一些更改。 您是否可以快速浏览我们的代码? 由于新冠疫情,我们无法对 ADC 算法进行物理测试,以确定其运行是否正常,因为我们目前没有生成交流信号的设备(激光和光电二极管)。 作为一个替代选项、我想知道您是否可以查看我们是否正确配置了 ADC。  

    为了帮助我了解配置 ADC 所涉及的功能,我提供了许多注释。 可以忽略这些参数。

    e2e.ti.com/.../ADC_5F00_Capstone.zip

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

    [引用 USER="Muhammad Rezuna">澄清一下,一旦 n ü µDMA 完成我们设置的传输次数,程序就会跳转到 ADCseq0Handler()中断例程。 代码中没有对中断的显式调用。[/quot]

    是的、它是一个硬件中断。

    [引用 user="Muhammad Rezuna]]在 ADCwDMA 示例中,在函数 ADCClockConfigSet()中,时钟速率设置为 ADC_CLOCK_RATE_HALT_Half,TivaWare 用户指南指出,该函数将每隔一个样本提供一次。 这是否意味着没有记录其他所有样本? 话虽如此、如果我们希望为项目记录每个样本、我们应将其更改为 ADC_CLOCK_RATE _FULL?

    这种说法是误导性的。 该值的作用是对相位延迟进行编程。 该示例中可能应该省略了它。 使用 ADC_CLOCK_RATE 一半会导致 ADC 从触发器延迟5个 ADC 时钟以启动转换。 只有在为两个 ADC 中的每个 ADC 设置不同的延迟并使用相同的触发器时、此功能才非常有用。 对于此示例、最佳代码为:

    ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PIOSC、1);
    

    [引用 user="Muhammad Rezuna"] Tiva ADC 是否可以以8位转换而不是12位转换?

    [引用 user="Muhammad Rezuna">我还有关于 System Tick (SysTick)的问题。 在该示例中、每10微秒(周期)调用一次中断。 根据我的理解、SysTick 的中断处理程序只会更新/递增计数器 g_ui32SysTickCount。 SysTick 是否具有任何其他意义?

    不、在本例中、它是不相关的。 它在其他一些示例中使用。

    [引用 user="Muhammad Rezuna"]我想知道您是否可以查看我们是否正确配置了 ADC。

    很抱歉、我们不进行代码审核。 但是、如果您有具体问题、我可以尝试回答。

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

    • 更确切地说、在配置 ADC 时钟时、我们应该省略 ADC_CLOCK RATE_RATE 一半、因为我们不希望 ADC 有任何延迟来执行触发转换;并按照您建议的 ADCClockConfigSet (ADC0_BASE、ADC_CLOCK SRC_PIOSC、1)配置 ADC。
    • 是否可以将 ADC 配置为在1.5mV 至2.5mV 的电压范围内运行? 这是我们将使用的激光的范围。 对于我们的项目、ADC 必须具有0.244µV μ V 的分辨率(电压范围/2^12位或1mV/4096位)。
    • 对于 ADCwDMA 示例、我不确定模拟信号如何链接到 ADC。 在函数 init_adc()中,它提到 GPIO_PIN_2,它在 launchpad 中对应于哪个引脚?

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

    您好!

    如果我在供应商到达之前、您"刚刚宣布"的要求是"1mV 满量程范围"、那么肯定是"交易断路器!"

    任何"混合信号"器件(即 MCU)-尝试达到此范围-几乎肯定是"过度挑战!"

    如果您的激光器"真正"产生如此"受限输出范围感兴趣"、那么您的项目几乎肯定会受益于"高度专业化(顶部车厢)外部 ADC!"   此外-此类设计必须仔细考虑温度、基准电压纯度和出色的信号路由的影响-甚至是屏蔽!   "获得"您的激光信号也将带来巨大的挑战!   您将如何考虑:阻抗匹配、输入偏移、随温度/老化变化的信号漂移和器件工艺变化?   不知为何、"寻求更广泛的激光信号输出范围"需要(部分)考虑-这不是吗?   (和... 为什么选择特定激光器?)

    我们的小型技术公司为美国当地生产了"不太详尽的设计"(70mV 满量程范围) 美国联邦实验室-我们(仅限于)通过选择一个高度先进(当然是外部)的 ADC、然后在一个小型(温度控制)金属封装(屏蔽)烤箱中选择"封装所有电路"来满足规格要求!

    添加如此"严格"(和意外)的要求-在线程中如此晚-是不幸和令人担忧的...

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

    [引用 USER="Muhammad Rezuna"]为了说明,在配置 ADC 时钟时,我们应该省略 ADC_CLOCK_RATE_HALF_Half,因为我们不希望 ADC 从触发器执行转换时出现任何延迟;并且按照您建议的 ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PIOSC、1)配置 ADC;[/QUERPIOSC]

    是的

    [引用 USER="Muhammad Rezuna">是否可以将 ADC 配置为在1.5mV 至2.5mV 的电压范围内运行? 这是我们将使用的激光的范围。 对于我们的项目、ADC 必须具有0.244µV μ V 的分辨率(电压范围/2^12位或1mV/4096位)。[/引用]

    否  

    [引用 user="Muhammad Rezuna">对于 ADCwDMA 示例、我不确定模拟信号如何链接到 ADC。 在函数 init_adc ()中,它提到 GPIO_PIN_2,它在 launchpad 中对应于哪个引脚?[/quot]

    GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_2);
    

    这行代码将 GPIO 端口 E 引脚2配置为 ADC 引脚。 通过查看数据表、您将看到这是模拟输入通道0。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    • 查看数据表上的表13-1、如果我们使用 GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_2)配置了 GPIO 端口 E 引脚2、那么这对应于 launchpad 上的模拟输入通道1或 PE2是正确的? 话虽如此、我们选择的模拟输入通道和 μ µDMA 通道是否必须对应于相同的数字? (即、由于我们配置了模拟输入通道1、因此我们还需要配置 µDMA 通道1)。
      • 如何测试以查看设置是否正确:
        • 让函数发生器在1.3kHz 时持续输出幅值为1.5V 的方波(失调电压为1.5V、因此该值为0V 或1.5V)。
        • 将函数发生器的输出端连接到引脚 PE2和接地端。
        • 使用 GUI Composer、该图显示数据数组中仅存储零。 这对于我们必须将 µDMA 通道1用于模拟输入通道1的情况来说是合理的、因为选择了 µDMA 通道0。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 USER="Muhammad Rezuna"]我们选择的模拟输入通道和 μ µDMA 通道是否必须与同一个数字相对应?

    UDMA 通道对应于您使用的 ADC 转换器、而不是您要转换的通道。 您的代码使用 ADC0_BASE、因此应使用 UDMA_CHANGE_ADC0。

    看起来您已将引脚配置更改为使用 PE2 (模拟输入1)、但您使用模拟输入0 (ADC_CTL_CH0)离开了 ADCSequenceStepConfiguration ()。 第278-279行应为:

    ADCSequenceStepConfigure (ADC0_BASE、0U、0U、
    ADC_CTL_CH1 | ADC_CTL_END | ADC_CTL_IE);
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    • 现在、我了解到 uDMA 通道对应于我们选择的 ADC 模块、而不是我们使用的 ADC 转换器。 但是我仍然对函数 ADCSequenceStepConfigure()感到困惑。 我对 ADC 的配置与 ADCwDMA 示例类似、我在其中选择端口 E 引脚2 (PE2)。 在函数 ADCSequenceStepConfiguration()中更改为模拟输入1 (ADC_CTL_CH1)是有道理的,因为我们选择了模拟输入通道1 (PE2)但为什么在示例中选择了同一引脚(PE2)时使用模拟输入通道0 (ADC_CTL_CH0)?
    • 在应用相同的测试时、我们在将代码上传到 launchpad 时遇到错误。 我们不确定是什么导致程序退出、因此不会在数据数组中存储任何值。

    e2e.ti.com/.../4540.ADC_5F00_Capstone.zip

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

    有关上一帖子的更多信息:

    当尝试调试程序时、通过一次单步执行一行、程序会运行到以下错误中。 它无法执行行  SysCtlClockSet()。

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

    [引用用户="Muhammad Rezuna"]在示例中、选择同一引脚(PE2)时为什么使用模拟输入通道0 (ADC_CTL_CH0)?[/quot]

    很抱歉、出现错误。 可能是当我将示例从使用 AIN0和 AIN1更改为使用时。 它应该是用于 AIN0的 PE3。 我将更新原始帖子中的示例。

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

    这不是一个错误、表示它不能执行函数 SysCtlClockSet()。 相反、它是一个警告、指出它未找到此函数的 C 源文件。 原因是您从 TivaWare 库 driverlib.lib 链接。 通常、在调试时、您会 C 单步执行库调用。 应用程序代码中几乎总是出现错误、因此无需单步进入库。 但是、如果您确实需要在 TivaWare 库函数中进行 C 调试、最简单的方法是将文件从 TivaWare driverlib 目录复制到工程中并重新编译。 另一个选项是单击警告窗口中的"Locate File"按钮并浏览到文件:"c:\ti\TivaWare_C_Series-2.1.4.178\driverlib\sysctl.c"。 对于更高级的用户、第三个选项是 导入 driverlib 项目并在您自己的计算机上重建 driverlib。 该版本的 driverlib.lib 将指向您机器上的源文件。

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

    我看到、我不应该单步进入库。 但是、一旦我将程序上传到 Tiva 并单击"resume"、程序会意外退出。 我不确定是什么导致它中止和关闭。 下面的屏幕截图显示了我单击"继续"后发生的情况。 我不确定是在程序进入  main 后点击"Resume"、还是在其他某个点发生了这种情况。 似乎没有收集任何数据。

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

    更新:事实证明、我能够单步执行  main 中的所有代码行、然后程序退出。 但是、数据数组中仍然没有存储转换。

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

    我认为、我们在数据采集方面的问题在于正在引起的中断。

    • 我想澄清一下 ADC 何时发送中断。 我们已经设置好,就像 ADCwDMA 示例一样,ADCSequenceStepConfigure()在每次转换/采样后发送一个中断–这是通过在参数 ADC_CTL_IE 中声明来指定的。 因此、程序在每次采样后跳转到中断例程 ADCseq0Handler()。
    • 我错误地认为、当缓冲区已达到最大传输数时、我以为程序会跳转到中断例程 ADCseq0Handler()。
    • 考虑到在 UDMA 完成传输1024个样本后执行 ADCseq0Handler、我们使用您在4月16日提供的说明制作了一种算法来停止 ADCseq0Handler 内的 ADC 和计时器。
      • 如果 ADCseq0Handler()在每次转换后执行,我们必须跟踪完成的转换数(即它进入函数的次数),并且每隔1024次调用函数,我们就会执行代码 (通道传输和可变增量/DECREMENTION)。

     

     

     

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

    不、您是第一次正确。 将 UDMA 与 ADC 配合使用时、当采样数(在您的情况下为1024)完成后、您将获得 ADC 中断。 我在您的代码中看到的错误是、您不允许 ADC 和 UDMA 随时执行它的操作。 您的主例程会在您启动计时器后立即退出。 连接调试器后、器件会在您完成 main 后停止。 尝试在 main 末尾添加 while (1);循环。 让您的代码在停止前运行两次代码。 然后、您将在数据[]中看到值。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    • 我明白了。 在 main 末尾添加 while (1)循环后、我能够捕获数据。 但是、在绘制结果的图形时、捕获了超过16个周期的数据。 模拟信号、即方波、我已连接、其频率为1.3kHz、振幅为1V、偏移为1V、因此该值在0V 和2V 之间波动。数字化值准确地表示、 唯一的问题是与采样率相关的捕获周期数。 使用方程式 Sampling Rate = array size/(# of Pulses * period of data)、阵列大小为4096并希望捕获16个脉冲或周期、我们得到大约332.8kHz。 正如您之前所建议的那样、我将代码的采样率部分更改为 MAP_TimerLoadSet (TIMER0_BASE、TIMER_A、MAP_SysCtlClockGet ()/ 332800 -1);但最后得到的脉冲几乎是脉冲的三倍。 对于如何只收集16个脉冲、有什么建议? 下图是收集的值的图:

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

    您好!

    我们公司员工的"学生"部分对海报的"数学基础"有着截然不同的解释。

    • 769µS 信号为1.3KHz、因此其周期为1/1300=μ s。   (1.3KHz 方波作为 ADC 输入驱动器的未解释选择证明了"好奇心"。)
    • 假设占空比为50%、该方波信号将以~384µS μ s 的间隔交替变化其电平
    • 海报的(声称) 332,800 Hz 采样率得出的周期为1/332,800 =~3µS μ s

    因此、在"输入信号状态变化"之前、不会出现"128"连续的 ADC "读取"(即384/3)?   所有(必须)包含(近)相同的 ADC 读数!

    然而、所示的图表显示了"ADC 捕获"、它会定期改变电平。   怀疑这些事件发生在输入信号周期的一半。   (~384µS μ s)  3µS、332800 Hz 采样率(每 μ s)和/或"其他处理"几乎可以确定不正确。   (否则会产生128个几乎相同的 ADC 读数!)

    人们相信、通过馈送具有"线性斜坡电压"的 ADC、可以获得更多的了解-它通常涵盖 ADC 0-3V 模拟输入范围。  这种方法将揭示线性的"输入电压的构建"-并且通过了解"此线性斜坡的变化率"-可以(正确)确认 ADC 的(实际/实际)采样率!    (我们开发的这种线性斜坡方法已在美国的几家公司获得批准 联邦实验室-提供(真实)、强大且具有启发性的见解!)

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

    • 选择1.3KHz 方波的原因是、我们计划使用频率为1.3KHz 的激光信号作为我们项目的 ADC 输入。  但是、激光信号的振幅会有所不同、出于测试目的、我们选择了适合且在 ADC 范围内使用的简单值。
    • 关于占空比、50%占空比是正确的。
    我 µs、当频率为1.3KHz 时、方波的周期为769 μ s、并且占空比为50%、这意味着信号在周期的50%为高电平、在周期的50%为低电平、 方波信号将以大约384µs μ s 的间隔交替其电平。
    • 对于我们的项目、我们计划捕获16个脉冲/周期、这些脉冲/周期对应于大约12.3ms 的数据。 对于12.3ms 的数据、我们需要能够对采样进行空间调整、以便它适合1024的倍数(例如2048或4096)的阵列。 例如,假设数据数组大小为4096,将总采样时间除以数组大小即可得出每个样本之间的~3µs。
    • 正如您在回复中提到的、在状态变化(从高电平变为低电平或从低电平变为高电平)之前、128个连续读数应该具有大致相同的值。 根据我们获得的数据、在状态变化之前、读数远小于128。
      • 我的问题是、我们是否错误地将 CCS 中的采样率编码为以低于应有的速率进行采样(因为连续的类似读数比应有的低)? 或者、采样率的计算是否是问题所在?
      • 目前、这就是我们在 CCS 中表示采样率的方式:MAP_TimerLoadSet (TIMER0BASE-BASE、TIMER_A、MAP_SysCtlClockGet ()/ 332800-1);
        • 如果问题出在代码中,那么它将是根据 TivaWare 用户指南确定加载值的最后一个参数。

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

    您好!

    我们的"学生员工"相信他们(两次)对您团队工作的评论将会很有帮助、很高兴听到您的反馈。   (一个巧妙的目标是、"世界各地的学生形成一种纽带-并相互帮助...")

    我们的技术公司坚信"亲吻"原则、即将(大)问题减少到小得多(组成部分)、然后对每一个问题进行充分的测量、测试和解决。   只有在每个单独的零件都经过"验证"时、我们才允许这些零件合并。   最常见的方法是-这种方法提供了更清晰的焦点-较小的"游戏场"(问题解决)证明了"更快、更容易和更强"。   我们的学生建议您的小组采用"kiss"方法。

    遵循"kiss"指南-让我们回顾一下您当前的写作:

    [引用 user="Muhammad Rezuna"]我们计划捕获16个脉冲/周期、对应于大约12.3ms 的数据[/引用]

    • 我们同意- 16、769µS 周期得出~12.3mS

    [引用 user="Muhammad Rezuna">对于12.3ms 的数据、我们需要对采样进行空间调整、以便它适合1024的倍数(例如2048或4096)的数组。 [/报价]

    • 虽然这可能是一个"公平的目标"、但它违反了"kiss"(持续太多-难以唯一地进行测试/验证)、并导致您错误的数据采集
    • 我们同意您的数学证明是正确的(4096 ADC "读取"强制采样率为~3µS μ s -正如您所说的那样。)   µDMA -您是否已正确"识别"任何/所有限制和"时间加法器"- ADC 和 Δ Σ 之间的复杂交互要求是什么?   这些可能会导致故障吗?

    [引用 user="Muhammad Rezuna">在更改状态之前,读数不到128个。   我的问题是、我们是否错误地将 CCS 中的采样率编码为以低于应有的速率进行采样?  [/报价]

    • 再说一次-"kiss"极大地帮助您解决此问题-通过您的"一体机"方法使(几乎)变得不复杂!
    • 很高兴您接受了我们的学生员工在1300Hz 输入信号"状态变化"之前推导出的"128读数(可能)"。
    • 您对"无法解释的图形图表"的使用极其"亲吻"!   许多后续工作"取决于"其准确性-这是(完全)未知的!   您是否不依赖该图(一次)迫使我们的团队和其他人"盲目"接受:
      • 您的每个 ADC 转换成功
      • 每个/每个 ADC 转换都在正确的"时间点"发生
      • 正确实现(未描述)图形方法  
      • 所有"馈入"到图形的值都是正确的、并且顺序正确!   "kiss"的价值及其对每个设计元素的强制、系统的验证现在应该是显而易见的!   (盲目相信----在一个多要素程序中----证明关键/关键. 不是很好!)

    • 您对问题的回答是:“我们是否错误地对采样率进行了编码... 速度较慢"很聪明。   (实际上是"几种可能性之一!")
      • 同样、分析此类(潜在)"多种原因"是"亲吻"的关键所在!   
        • "采样率"的"其他"缓降来源是什么?   
          • 回想一下-您在流程中添加 µDMA、确实违反了"亲吻"!   在这个(非常)早期阶段!
          • 您的"单个"ADC 转换是由计时器触发的-该计时器设置了~3µS μ s 周期-这是吗?
          • µDMA ADC、尤其是 Δ Σ"内务"正在进行中?   这对您的3µS 目标有何影响?

    相信"我们的学生"(长期练习"亲吻")可以完全解决您的问题(甚至帮助解决您的"1mV 激光问题")、但目标是"您的团队学习"-难道这不能证明吗?

    您必须从某处开始-您会如何提议"证明您的 ADC 已成功触发-以您选择的3µS 速率/大约速率触发。"   (这是一个很好的"亲吻"开始-即使"基本需求"仍然未知-正确地揭示了"亲吻"方法的弱点...)   提示:最初建议您"不要尝试超过8次 ADC 转换"。   而且-在这个早期阶段不要雇用 µDMA!   (这样做了-非常成功-您现在可能会意识到这样一种(赦免)无序的限制-未经验证、"对多个目标的束缚!")   

    相反、您的目标是"取得一系列小胜利"-并在这些基础上-"一次一个经过测量和测试/验证的步骤!"   (这被称为"通过细化进行"、这是一个带有"kiss"的子集。)   我们的首选是“指导您朝着这个改进的方向-旨在加强您的问题解决”... 不提供"剪切/粘贴"-这几乎不能证明"持久、见解深刻-也不是正确的教学目标!"

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

    • 我们的代码是根据 Bob 与我们共享的 ADCwDMA 示例构建的。 我们知道、我们正在尝试实现不同于他打算对其代码执行的操作、但我们将其用作构建块、并尝试根据我们的需求实施基础。 µDMA 这一点,我们并不能完全确定我们是否已“正确识别任何/所有限制和时间加法器–这正是 ADC 和 Δ Σ 之间的复杂交互所要求的。”
    • 正确的做法是、我们希望 ADC 转换被计时器触发、而对于一个4096尺寸的阵列、计时器应该被设定为大约3µs μ s 的周期。 3µs、我们不确定在哪里配置计时器以每 μ s 触发一次 ADC。 我们假设采样率为332.8kS/s、这意味着每个3µs μ s 采集一个样本。 我们错了吗?

    我们有:我们使用半宽定时器(计时器 A)并将其配置为定期工作、采样率为332.8 KHz。

    • 目前、我们发现数据每47个样本从高电平变为低电平或从低电平变为高电平、这意味着在94个样本内捕获一个周期的数据或0.769ms。 此分析的结束是在 CCS 中“观察”数据数组–运行程序后,我们分析了在发生交替值时/发生位置收集和记录的值。 3µs、当捕获的数据每128个采样从高电平变为低电平或从低电平变为高电平时、它会在每 μ s 成功触发一次。 这意味着采样率低于332.8KHz。

    关于 ADC &µDMA“内务”

    ADC

    • 我们已将 Launchpad 配置为使用端口 E 引脚2 (PE2)进行模数转换。
    • 我们将 ADC 的时钟配置为利用 PIOSC、并选择了1的时钟分频器
    • 然后、我们禁用了 ADC 可能引起的中断以及我们希望使用的采样序列发生器。
    • 然后、我们配置了将由计时器触发的 ADC 模块和采样序列发生器、并选择使用 ADC 输入通道1、因为它对应于我们将信号连接到的 launchpad 上的(PE2)引脚。
    • 最后、我们清除中断并启用序列发生器和中断。

    µDMA μ A

    • 首先、我们设置通道控制表的基地址。 该表在1024字节边界上对齐。
    • 然后、我们禁用了所选 μ µDMA 通道(UDMA_CHANNEL ADC0)的 ALTSELECT、HIGH_PRIORY_和 REQMASK 属性。 后跟启用突发传输属性。
    • 在乒乓传输模式下、我们必须设置通道、使其能够同时利用主缓冲区和备用缓冲区–数据大小为16位、不会增加源地址增量、而是将目标地址增加16位、 并将仲裁数目设置为1。
    • 然后、我们执行了第一组 uDMA 通道传输集、其中我们告诉 μ µDMA 存储转换。 我们让主结构体开始填充数组、该数组保存从第一个位置开始的所有转换、并且一旦主缓冲区达到最大传输数1024、副结构体将执行下一组。
    • 配置 μ µDMA 后、到目前为止、我们启用 uDMA 通道。
    • 我们必须跟踪的另一个内部维护是 μ µDMA 传输完1024个数据值时的情况。 这是程序将跳转到中断例程的位置、在该例程中、我们已进行设置、以便在程序每次进入中断例程时达到中断例程的特定次数后禁用 ADC 和计时器、 我们知道已经传输了一组1024个值、我们需要重新配置刚刚完成数据传输的缓冲器结构–简而言之、此例程跟踪填充所有数据数组所需的传输数量。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您-我们正在处理发货订单、您的邮递已到达。

    请"重新阅读"我们之前的帖子、尤其是我们的学生代表您提供的"提示"。   (显然、我们对"kiss"的信念未被"完全/充分"接受-您必须"接受这样一个事实、即此类参与的计划通过"小、有条理、测试和验证"更成功地进行管理!)   如您所报告的那样、继续"整体"是"超出我们的建议!"   (大大增加了您(和我们)花费的时间和精力-并提供"没有积极的保证"、保证它将永远取得成功!)

    我们的学生直接提出了一些问题-您应该检查并回答-实际上他们成功地"限制并引导您朝着更高效、更恰当的方向前进"。   

    [编辑/添加] 09:50、5月5日: 除了 您的"实验确定" 94个 ADC 样本(预计128个样本)之外、您的书写几乎完全是"您的意图"-并且"不是通过"系统、顺序、测量和验证"实现的!   现在列出的"意图"是好的-但"测量测试和验证"的"缺失"会引起极大的警报和担忧!   您的"错误"是否可能出现在"任何地方"?这就是为什么我们相信"亲吻"方法的原因、这种方法系统地检查您的"有限范围代码函数"证明是如此重要!   (作为一名前军官——在“太长的战线”战斗——很少被推荐!   [这就是您选择的-通过启用整个程序-每个较小的组成部分都有足够的"测试/验证"!]   被称为"kiss!")

    我们将继续提供帮助、但您需要"接受我们建议的"分治"(即小尺寸、逐件、代码测试和验证)。   在您的代码目标中添加了~50个帖子-"非 kiss"方法(即使有卓越的供应商监督{感谢供应商 Bob})-只是"过度挑战"-和改进的(更周到、更系统、更专注)方法-请您采用!

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

    我通过启用计时器中断并切换引脚来检查计时器。 计时器周期在3uS 时看起来正确。

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

    [引用 user="Bob Crosby"]我通过启用计时器中断并切换引脚来检查计时器。[/quot]

    确实-但这只是一个检查-并且很可能需要(更多)。

    另请注意、已确认计时器的频率(现在)、但这不能确保 ADC 已正确配置和更改(从海报的原始设置) 、改为"接受(仅)该计时器触发"。   

    我们曾希望海报(也是)"测试并验证"他的计时器配置(至少)已成功。   当然、这只是"许多此类检查"中的一项-这些检查有助于使此海报(和其他多项检查)"分解并验证其代码的小元素-理想情况下采用系统方式-从而使他们"真正理解!"     希望这种增加海报能力的程度应该是一个中心目标。   (甚至超过-"清算后")

    正如(令人信服)在本主题中再次证明的那样-"海报的成功能力不能保证(甚至)"高度重复的计划代码"!   我们是否能同意(部分)系统的"代码测试和验证-理想情况下为"低于完整计划规模"-是"错误发现和纠正"(即真实海报学习)的有效方法 -即使-尤其是-熟练的供应商代理"不在现场!"

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

    不、在这种情况下、问题确实是我的。 问题是 ADC 以16MHz 时钟除以8运行。 执行转换需要8uS、因此每3uS 触发一次 ADC 就会错过一组触发器。 由于触发速率低得多、因此在原始示例中从未看到过这种情况。 目前,简单的解决方案是注释掉对 ADCClockConfigSet()的调用。 默认值将为您提供16MHz PIOSC 作为时钟。 我将在明天尝试找出(并更正)示例。

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

    感谢您检查计时器是否定期正确触发。

    我们可以确认转换需要8µs μ s、因为这是我们使用最初收集的数据计算得出的结果。 通过将周期除以每次转换的时间、可以得出1个周期的样本数。 因此、为了确定转换时间、我们可以将信号周期除以采集的样本数。 根据我们的数据、我们发现完成94个采样需要0.769ms、这些采样对应于1个周期、因此转换时间大约为8µs μ s。

    我们省略了用于配置 ADC 时钟 ADCClockConfigSet (ADC0_BASE、ADC_CClock_SRC_PIOSC、1)的代码、并发现它解决了这个问题。 在3µs 程序后、我们现在发现256个样本构成1个周期、这正是我们想要的–支持 ADC 每 μ s 定期触发一次。 但是、我们不确定您为什么建议将16MHz 时钟除以8。 我们知道内部 PIOSC 以16MHz 运行、但第三个参数是时钟分频器、我们已将其选择为1、这意味着我们拥有的代码应与注释掉的代码相同。

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

    我认为我们必须"同意不同意"。   通过正确、系统的代码测试和审查(以及正确的输入信号波形) -此海报"本可以发现他的转换率"不是预期的"。   请注意、我所在小组的建议-使用"已知、线性、斜坡电压"馈送 ADC 输入会使转换速度快得多!

     简单地说、"将各种 API ADC 和 μ µDMA 函数连接在一起-"希望获得最佳结果"-但又没有"以用户精力为中心/强制理解"是否足够了?   这些函数必须是:

    • 调查和选择-最合适
    • 完全正确配置-以充分满足用户(特定)的需求!   在那一刻!   更改是不可避免的-"复制/粘贴解决方案"(减去足够的用户审阅和测试)不太可能承受(正常)更改事件!
    • 有时以特定顺序调用
    • 并且必须允许各种程序"交互"、甚至允许在同一程序中存在竞争问题

    API、质量和功能强大的评估板(LPad)、IDE、MCU 手册和外设驱动程序库用户指南提供了大量且高度详细的资源库存。   "现实世界在"监视、选择、定位和组合"(然后系统调试)最合适的 API 函数方面的经验"、 证明(几乎)一定能够提供"最有价值的用户学习体验!"    到目前为止!

    "选择和连接(甚至在关键 API 函数之间传递"时间关键数据")-真正了解函数的使用和影响-这是一项技能、"用户真的需要!"   拐杖和其他设备可减少(经常甚至去除)用户牺牲、专注和承诺会带来"长期成本"-值得"真正"考虑...

    我们是否通过看似"短路"的用户学习过程来"真正引导并提供适当的帮助"?   (因此、自相矛盾-做得"太多"(即、通过吹气延长吹气时间、"示例代码"(用户思考)-可能会导致 "太少"(用户分析、实验->增长)。

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

    该函数在1uS 采样率下的正确用法为:

    ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PIOSC | ADC_CLOCK_RATE_FULL、1);
    

    如果没有 ADC_CLOCK RAM_FULL 参数、ADC 默认为每秒125K 个样本。 TM4C123系列器件实际上不使用时钟分频器属性。 而 TM4C129器件使用了它。 该功能包含在函数中、用于实现两个系列之间的代码兼容性。

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

    您好!

    我们的团队早已注意到、您和(其他)供应商代理主要关注 TM4C129器件。

    [引用 user="Bob Crosby"]如果没有 ADC_CLOCK RATE 参数,ADC 默认为每秒125K 个样本的速率。[/引用]

    (可能)为 true (但仅当 API 侵扰时)-因为 TM4C123的 ADC 实际上默认为其"最高"1MHz 采样/秒速率!   因此、用户似乎需要" ADC 时钟速率的无变化配置"、因为这是由 MCU 复位设置的。   (假设用户寻求这个1MHz 速率。。。)

    支持内容如下:  (TM4C123手册的"真实副本"、第891页)

    如前所述-海报(和其他)从"全谱"使用大量来源的技术文档中获益匪浅。   TM4C123和 TM4C129需要"不同的处理"这一事实令人遗憾、这进一步突出了真正"用户理解"的必要性。

1 2