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.
工具/软件:Code Composer Studio
对于一个项目、我们的团队必须将模拟测量转换为数字数据。 我们使用的是 Tiva C 系列 TM4C123GH6PM。 我们如何使用 Code Composer Studio 不仅将模拟值数字化、还存储这些值。 我们的计划是将光电二极管的输出连接到微控制器的模拟输入引脚、并使用 Tiva 的 ADC 功能将模拟值数字化。 但是、我们需要一些有关如何在 Code Composer Studio 中执行此操作的指导。 Tiva C 系列 TM4C123G LaunchPad 技术讲座的实验5介绍了 ADC、但它们处理 的是来自片上温度传感器的数据。
谢谢你。
Bob、
谢谢您-欢迎并感谢您的积极评论。
正如我主要是年轻的员工所注意到的-您在引导(这)和其他海报中已经"超越"了。
要正确理解这些基于 ARM 的 MCU"做的事"、需要通过海报集中精力-他们必须认识并接受这一责任... 这证明"风险"(由于用户需求的数量和种类)"总是在救援时由 Bob、Charles 或 Ralph 计算"。 (和-正如这里的工作人员所指出的... crüe CB1 (或 T Ü V!)的救援风险、值得信赖
识别并制定系统"方法和程序"以解决问题的海报通常会"演示"关键/关键"观察、答案和发现!"
自己... 由此产生的"满意度"大大增强了功能 、确保"进一步提升他们的动力、能力和效率"、从而"增强"用户的信心、愉悦和成功...
ADC:
计时器
[引用 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 停止请求转换。
再次感谢您查看我们的代码。 您如何才能查看 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
将该值减少到 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 样本。 运行次数意味着一组样本。
更多上下文:
测试、以查看在单击"运行关联"时是否会收集一组新的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器件的问题、但我不应该为您调试代码。