大家好、
通过驱动器中的 I2C 同时读取两个通道时会存在延迟、并且可能会显示通过读取第二个通道的值来获得第一个通道的值。
SW 代码如下所示:
在两次读取之间增加延迟的程序可能会导致其他问题。
您能帮助评论一下如何解决它吗? 非常感谢。
William
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.
大家好、
通过驱动器中的 I2C 同时读取两个通道时会存在延迟、并且可能会显示通过读取第二个通道的值来获得第一个通道的值。
SW 代码如下所示:
在两次读取之间增加延迟的程序可能会导致其他问题。
您能帮助评论一下如何解决它吗? 非常感谢。
William
您好、William、
从代码来看、不清楚何时确定读取转换结果。 最可能发生的情况是、即使配置已更改、连续转换的工作模式也不会更改通道、直到正在进行的转换结束。 这将导致从先前选定的输入通道读取转换数据。
在循环多路复用器时、我建议使用单次转换模式而不是连续模式。 这样做的结果是、在写入新配置时、新配置将立即应用。 使用连续转换模式时、您不确定所需的通道数据何时会显示为转换结果。 使用连续转换模式时、您应始终忽略信道更改后的第一次转换。
此致、
Bob B
尊敬的 Bob:
我是 William 的同事。正如您所说、我们将模式更改为单次转换、但问题仍然存在。 读取转换结果的代码如下。
上述代码大约每40ms 调用一次。 我们发现即使是单模式也需要被读取两次以获得正确的值、并且需要添加 msleep。 如果不添加 SLEEP,或读取一次、 两者都会得到错误的值。 我必须读两次并增加循环复用的延迟吗?期待您的回复。
此致、
Qun Wu
尊敬的 Qun Wu:
我不清楚函数 MOTOR_ADC_UPDATE 中发生了什么。 无论您是对器件进行读取还是写入、功能似乎都是相同的。 您可以添加另一个参数、使"0"仅写入器件、而"1"读取转换结果。
有两种使用该器件的方法。 一种方法是使用计时器在转换开始后延迟读取转换结果。 第二种方法是监控配置寄存器状态位上的位7是否为低电平。
让我们保持简单、并将延迟与单次转换模式结合使用。
我认为正在发生的情况是您的 MOTOR_ADC_UPDATE 函数在同一 环路中启动转换和读取。 验证通信和时序的最佳方法是使用逻辑分析仪。 这将显示进出 ADC 的实际通信流。
此致、
Bob B