我在尝试使用 dsPIC33f 微控制器对 I2C 从设备进行采样时遇到问题。
我正在使用 PIC 内部 timer1 计时器以定义的采样率“滴答”并获取必要的数据。不幸的是,获得结果的速度不够快,我不知道为什么。我的从属设备之一是 ADXL345 加速度计,它的最大输出数据速率为 3600Hz。我几乎不需要这么高,但我似乎没有在 50Hz 以上的任何地方成功采样。
I2C 设置为 400KHz 的“快速模式”。我想要对加速度计进行采样的绝对最大值是 1KHz,虽然这有点矫枉过正,但我真的对 128Hz 更感兴趣。我设置的加速度计的参数是:
- 数据格式 (0x31) - 自检关闭、中断反转关闭、全分辨率开启、对齐位关闭、范围位 +/-16g。
- 数据速率 (0x2C) - 低功耗模式关闭(正常模式),输出数据速率模式 400Hz(我在数据表中读到 400KHz I2C 仅支持高达 800Hz,所以我在使用 400Hz 时比较安全)。
- 电源控制(0x2D)——自动睡眠关闭,测量模式开启,睡眠位关闭,睡眠模式采样率8Hz(虽然没有使用,所以可以忽略)。
- 中断 (0x2E) - 启用数据就绪中断,其他一切都关闭。
我正在使用 timer1 以指定的采样率进行采样,我知道采样率工作得很好,因为我有一个计数器,它会在计数器达到一分钟后输出一条消息;我用秒表来确保它是正确的。例如,在 100Hz 采样率下,我等待计数器计数到 6,000 (100 * 60) 并显示一条消息,如果秒表在 1 分钟时看到该消息,我知道它至少在一定程度上进行了采样。
当我尝试仅从加速度计采样(I2C 多字节读取模式,一次调用读取所有六个字节)时,它的执行速度不够快。使用我的秒表方法,它似乎需要大约一分 15 秒来完成一项应该需要一分钟的工作(以 100Hz 采样),即它处理 I2C 命令的速度不够快。更高的采样率会增加更多的延迟。
我感觉这与 I2C 时钟和 timer1 未同步有关,因此在我对加速度计数据的调用中存在不必要的等待。我无法想象 I2C 的 400KHz 时钟是不够的,但如果我错了,请纠正我。
我应该如何正确地从 I2C 从设备读取数据?我还有一个陀螺仪和磁力计,我想以足够高的采样率读取它们,磁力计的限制为 160Hz,所以正如我所说,128Hz 的采样率对于所有三个设备都很好。尝试同时读取所有三个设备显然会增加比预期慢的采样速度。
我还将同时从 4 个引脚(ADC 10 位)收集模拟数据。这段代码已经实现,我可以读取 1KHz 的模拟数据,采样率按预期工作,只是 I2C 设备运行缓慢!
我希望加速度计在尝试以 100Hz 采样时会很好,那时我可以以 3600Hz(I2C 的最大 800Hz)输出,但它真的很挣扎,我不知道还能尝试什么。
干杯!