您好!
首先、感谢上周在该论坛中提供的帮助、以正确设置 ADC、使其正常工作、并使用三角波形对其进行测试、以确保其按预期工作。
但是... 我现在有一个问题。 转换后的 ADC 信号似乎延迟了几十 μ s。 这将破坏我们程序中的控制环路。 我每10秒执行一次一系列转换。 转换在大约2us 内立即完成、我在剩余8us 内处理它们。 没关系。 但是、我在程序中得到的值似乎被延迟了大约40us (10 us 定时器中断的4次调用)。
我缺少什么? 提前感谢。
谢谢。 Bhaktha
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.
您好!
首先、感谢上周在该论坛中提供的帮助、以正确设置 ADC、使其正常工作、并使用三角波形对其进行测试、以确保其按预期工作。
但是... 我现在有一个问题。 转换后的 ADC 信号似乎延迟了几十 μ s。 这将破坏我们程序中的控制环路。 我每10秒执行一次一系列转换。 转换在大约2us 内立即完成、我在剩余8us 内处理它们。 没关系。 但是、我在程序中得到的值似乎被延迟了大约40us (10 us 定时器中断的4次调用)。
我缺少什么? 提前感谢。
谢谢。 Bhaktha
Tommy、
1.我已经用三角波进行了独立的单元测试、以确保 ADC 转换正常。 在处理实际信号时、 当我查看缓冲器中的转换值和示波器上的模拟信号时、会有延迟。
2、这是我的程序流程。
计时器中断每20us 唤醒一次。 定时器中断还启动转换序列、总计9。 最后一个第14个 ADC 通道触发 ADC ISR。 计时器例程还会清除表示 ADC 转换结束的标志、
在计时器中断中、我执行初始预处理、然后等待标志(全局变量)设置为信号 ADC 转换完成。
在 ADC ISR 中、我将所有值从结果寄存器复制到全局变量、然后设置标志全局变量以发出 ADC 转换结束信号。
在定时器中断中、在标志被 ADC ISR 设置为信号完成后、完成转换值的处理并采取适当的操作。
好的。 这听起来有点复杂、也许有一种更简单的方法来实现这一点。 请告诉我您的想法。
我们检查了模拟信号的信号调节、AFAIK 应该是好的、但这是我们要看的。
对我来说,可能是错的,似乎有一个很大的延迟,这可能是由于方案逻辑缺陷而不是其他可能性造成的。
谢谢。 Bhaktha
Bhaktha、
典型配置是仅启用 ADC ISR 以进行中断服务和数据处理。 计时器中断似乎增加了不必要的复杂性。
在第一次转换时触发 ADC ISR、您可以获得与当前方案几乎相同的行为。 此外、还可以根据启用的任何 SOC 灵活地提前(转换前)或延迟(转换后)触发 ADC ISR。
最简单的方法是管理 ADC ISR 在最后一次转换时延迟触发的系统、因为它可以确保在到达 ISR 时完成所有结果。 如果您不需要提前触发所需的额外处理时间、建议这样做。
是否在 INTSEL 寄存器中清除了连续模式? 这将有助于在 INTCONT=0时检测 ADC 中断溢出。
确保确认您的 ACQPS 窗口能够处理您的任何信号调节。
Tommy
Tommy、
感谢您的回复。
我们的产品要求是、我们需要定期唤醒、监控物理信号、处理值、采取措施并返回空闲状态。 我想这不是很不寻常的要求。 为了实现这一点、我们有计时器中断、计时器启动 ADC 转换、我们处理数字值、采取适当的操作并返回空闲状态。 这有道理吗? 或者我是否使它比它更复杂。 要求部分是正确的、实施当然会发生更改/重新设计。
我已经在 INTSEL 寄存器中设置了连续模式、这一点很好、我将清除它、进行更改并重新检查。
对 ACQPS 设置有疑问、也会检查该设置。
谢谢。 Bhaktha
Bhaktha、
您正在正确使用计时器来唤醒器件并触发 ADC 转换。 在计时器 ISR 中等待 ADC 结果也是可以接受的。 只要方案有效、就无需更改方案。
我的意见与其说是绝对的对或错,不如说是主观的看法。 作为最佳实践、我们尝试尽可能减少 ISR 中花费的周期数、以便在实时期限内最大限度地提高系统中断的周期可用性。 如果您仅在计时器 ISR 中等待 ADCINT 标志的几个周期、则当前的实现将是最佳的。 如果等待循环为数百个周期、则处理周期将丢失。 另一方面、如果此周期性唤醒过程是您对器件具有的唯一功能、那么它就非常好了。
Tommy