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、但它们处理 的是来自片上温度传感器的数据。
谢谢你。
首先、请下载 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 工作原理的理解。
谢谢你。
[引用 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
[引述 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 转换间隔。
让我后退一步,尝试解释我们计划尝试实现的目标,因为我意识到我做出了另一个解释错误
希望这能消除误解。
可以针对4096个采样每3us 转换一个通道。 使用我发送给您的 ADCwDMA 示例作为起点。
在阅读了更多 TivaWare 外设的驱动程序库用户指南之后,我对 ADCwDMA 示例有一些疑问:
更多问题:
[引用 user="Muhammad Rezuna">我对函数 ADCSequenceStepConfigure()有一些问题。 第四个参数(文档称为 ui32Config)是多个值的逻辑 OR。
[/报价]
您的理解是正确的。 通道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 硬件。
有关示例的更多问题/说明:
对于我们的项目:
[引用 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 语句。
在研究了语法和代码之后、我尝试逐步浏览您提供的示例。 进入 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 所涉及的功能,我提供了许多注释。 可以忽略这些参数。
[引用 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。
很抱歉、我们不进行代码审核。 但是、如果您有具体问题、我可以尝试回答。
您好!
如果我在供应商到达之前、您"刚刚宣布"的要求是"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。
[引用 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);
[引用用户="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 将指向您机器上的源文件。
更新:事实证明、我能够单步执行 main 中的所有代码行、然后程序退出。 但是、数据数组中仍然没有存储转换。
我认为、我们在数据采集方面的问题在于正在引起的中断。
不、您是第一次正确。 将 UDMA 与 ADC 配合使用时、当采样数(在您的情况下为1024)完成后、您将获得 ADC 中断。 我在您的代码中看到的错误是、您不允许 ADC 和 UDMA 随时执行它的操作。 您的主例程会在您启动计时器后立即退出。 连接调试器后、器件会在您完成 main 后停止。 尝试在 main 末尾添加 while (1);循环。 让您的代码在停止前运行两次代码。 然后、您将在数据[]中看到值。
您好!
我们公司员工的"学生"部分对海报的"数学基础"有着截然不同的解释。
因此、在"输入信号状态变化"之前、不会出现"128"连续的 ADC "读取"(即384/3)? 所有(必须)包含(近)相同的 ADC 读数!
然而、所示的图表显示了"ADC 捕获"、它会定期改变电平。 怀疑这些事件发生在输入信号周期的一半。 (~384µS μ s) 3µS、332800 Hz 采样率(每 μ s)和/或"其他处理"几乎可以确定不正确。 (否则会产生128个几乎相同的 ADC 读数!)
人们相信、通过馈送具有"线性斜坡电压"的 ADC、可以获得更多的了解-它通常涵盖 ADC 0-3V 模拟输入范围。 这种方法将揭示线性的"输入电压的构建"-并且通过了解"此线性斜坡的变化率"-可以(正确)确认 ADC 的(实际/实际)采样率! (我们开发的这种线性斜坡方法已在美国的几家公司获得批准 联邦实验室-提供(真实)、强大且具有启发性的见解!)
您好!
我们的"学生员工"相信他们(两次)对您团队工作的评论将会很有帮助、很高兴听到您的反馈。 (一个巧妙的目标是、"世界各地的学生形成一种纽带-并相互帮助...")
我们的技术公司坚信"亲吻"原则、即将(大)问题减少到小得多(组成部分)、然后对每一个问题进行充分的测量、测试和解决。 只有在每个单独的零件都经过"验证"时、我们才允许这些零件合并。 最常见的方法是-这种方法提供了更清晰的焦点-较小的"游戏场"(问题解决)证明了"更快、更容易和更强"。 我们的学生建议您的小组采用"kiss"方法。
遵循"kiss"指南-让我们回顾一下您当前的写作:
[引用 user="Muhammad Rezuna"]我们计划捕获16个脉冲/周期、对应于大约12.3ms 的数据[/引用]
[引用 user="Muhammad Rezuna">对于12.3ms 的数据、我们需要对采样进行空间调整、以便它适合1024的倍数(例如2048或4096)的数组。 [/报价]
[引用 user="Muhammad Rezuna">在更改状态之前,读数不到128个。 我的问题是、我们是否错误地将 CCS 中的采样率编码为以低于应有的速率进行采样? [/报价]
相信"我们的学生"(长期练习"亲吻")可以完全解决您的问题(甚至帮助解决您的"1mV 激光问题")、但目标是"您的团队学习"-难道这不能证明吗?
您必须从某处开始-您会如何提议"证明您的 ADC 已成功触发-以您选择的3µS 速率/大约速率触发。" (这是一个很好的"亲吻"开始-即使"基本需求"仍然未知-正确地揭示了"亲吻"方法的弱点...) 提示:最初建议您"不要尝试超过8次 ADC 转换"。 而且-在这个早期阶段不要雇用 µDMA! (这样做了-非常成功-您现在可能会意识到这样一种(赦免)无序的限制-未经验证、"对多个目标的束缚!")
相反、您的目标是"取得一系列小胜利"-并在这些基础上-"一次一个经过测量和测试/验证的步骤!" (这被称为"通过细化进行"、这是一个带有"kiss"的子集。) 我们的首选是“指导您朝着这个改进的方向-旨在加强您的问题解决”... 不提供"剪切/粘贴"-这几乎不能证明"持久、见解深刻-也不是正确的教学目标!"
我们有:我们使用半宽定时器(计时器 A)并将其配置为定期工作、采样率为332.8 KHz。
关于 ADC &µDMA“内务”
ADC
µDMA μ A
感谢您-我们正在处理发货订单、您的邮递已到达。
请"重新阅读"我们之前的帖子、尤其是我们的学生代表您提供的"提示"。 (显然、我们对"kiss"的信念未被"完全/充分"接受-您必须"接受这样一个事实、即此类参与的计划通过"小、有条理、测试和验证"更成功地进行管理!) 如您所报告的那样、继续"整体"是"超出我们的建议!" (大大增加了您(和我们)花费的时间和精力-并提供"没有积极的保证"、保证它将永远取得成功!)
我们的学生直接提出了一些问题-您应该检查并回答-实际上他们成功地"限制并引导您朝着更高效、更恰当的方向前进"。
[编辑/添加] 09:50、5月5日: 除了 您的"实验确定" 94个 ADC 样本(预计128个样本)之外、您的书写几乎完全是"您的意图"-并且"不是通过"系统、顺序、测量和验证"实现的! 现在列出的"意图"是好的-但"测量测试和验证"的"缺失"会引起极大的警报和担忧! 您的"错误"是否可能出现在"任何地方"?这就是为什么我们相信"亲吻"方法的原因、这种方法系统地检查您的"有限范围代码函数"证明是如此重要! (作为一名前军官——在“太长的战线”战斗——很少被推荐! [这就是您选择的-通过启用整个程序-每个较小的组成部分都有足够的"测试/验证"!] 被称为"kiss!")
我们将继续提供帮助、但您需要"接受我们建议的"分治"(即小尺寸、逐件、代码测试和验证)。 在您的代码目标中添加了~50个帖子-"非 kiss"方法(即使有卓越的供应商监督{感谢供应商 Bob})-只是"过度挑战"-和改进的(更周到、更系统、更专注)方法-请您采用!
[引用 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需要"不同的处理"这一事实令人遗憾、这进一步突出了真正"用户理解"的必要性。