我在尝试使用dsPIC33f微控制器对I2C从器件进行采样时遇到了麻烦。
我正在使用PIC内部定时器1定时器以定义的采样率“勾选”并获取必要的数据。不幸的是,结果得不到足够快,我不知道为什么。我的一个从设备是ADXL345加速度计,其最大输出数据速率为3600Hz。我不需要这么高,但我似乎没有成功地在50Hz左右的任何地方采样。
I2C设置为400KHz的“快速模式”。绝对最大值我想要加速度计的样本是1KHz,虽然这样会有点过分,但我真的对128Hz感兴趣。我设置的加速度计的参数是:
我正在使用timer1以指定的采样率进行采样,我知道采样率正常,因为我有一个计数器,在计数器达到一分钟后输出一条消息;我用秒表确保它是正确的。例如,在100Hz采样率下,我等待计数器计数到6,000(100 * 60)并显示一条消息,如果秒表是1分钟,当我看到该消息时,我知道它的采样至少达到了一定程度。
当我尝试仅从加速度计采样时(I2C多字节读取模式,在一次调用中读取所有六个字节),它的执行速度不够快。使用我的秒表方法似乎需要大约一分15秒才能完成一项应该花费一分钟(以100Hz采样)的工作,即它不能足够快地处理I2C命令。采样率越高,延迟越多。
我感觉这与I2C时钟和timer1未被同步有关,因此我对加速计数据的调用不必要等待。我无法想象I2C的400KHz时钟是不够的,但如果我错了请纠正我。
我应该如何正确地从I2C从设备读取数据?我还有一个陀螺仪和磁力计,我想以足够高的采样率读取,磁力计的极限是160Hz,所以我说,128Hz的采样率对于allk三个设备来说是好的。试图同时从所有三个设备读取显然增加了比预期更慢的采样。
我还将同时从4个引脚收集模拟数据(ADC 10bit)。这段代码已经实现,我可以读取1KHz的模拟数据,采样率正如预期的那样工作,只是I2C设备运行缓慢!
我希望加速度计在100Hz采样时能够很好,当我能以3600Hz(I2C最大800Hz)输出时,它真的很难挣扎,我不知道还有什么可以尝试。
干杯!
答案 0 :(得分:2)
好的,这可能有很多:
在您的情况下,最简单的解释是使用您用来触发轮询的计时器的错误配置。我需要知道你是如何使用它的,它是否触发了一个中断,你设置一个标志来触发加速度计轮询?你手动轮询定时器以触发加速度计轮询。在任何情况下,当发生这种情况时,将输出引脚切换为高电平和低电平,并通过示波器观察它将为您提供有价值的信息。是否所有的投票期都更长,或者只是其中一些投票时间比预期的多?
我经常看到的是慢速I2C处理例程。您的I2C可能设置为400KHz,这确实是读取和写入一个字节位的速度,但字节之间有一些处理时间在很大程度上取决于您的代码复杂性。在您的情况下,由于您使用多字节读取模式,此时间实际上不在字节之间,而是在轮询周期之间。但奇怪的是,这将是你的问题,不是这种频繁的轮询,也不是大数据读取。
在您的情况下我会做什么(拥有某种测量设备,你似乎有),就是要检查所有的时间是否符合您的预期。不要假设任何东西,测量它并验证它正在做你期望的事情。在这方面,我会从最简单的事情开始。时钟是否以400kHz运行?是否读取了六个字节而没有延迟?轮询之间是否存在预期的空闲间隙?在轮询之间,I2C总线是否卡住(SDA和/或SCL长时间保持低电平)?除了加速度计之外,总线上是否有任何意外通信或活动?这些是我要检查以获得可能出错的线索的一些事情。这里的黄金法则是不要推测,衡量它!
如果上述所有内容都是完美的并且符合预期,那么轮询之间的时间间隔会更长。我会开始检查软件的时间,以了解每个例程的时间,我看到许多软件开发人员对一些显然简单的操作可以花多少时间感到惊讶。为此,请使用第一个项目符号点中描述的输出引脚位切换。使用几个IO端口,因此在示波器的每个通道上都有两个标记,并在代码中更改位置以切换这些位,只需使用它来检查代码的任何慢速部分。如果你想要另一个黄金法则,分而治之。将标记设置在最高的抽象例程中,然后深入挖掘代码的慢速部分直到找到错误的部分。
试试这个,如果有帮助请告诉我。
干杯,祝你好运!