У меня возникли проблемы с попыткой пробовать подчиненные устройства I2C с помощью микроконтроллера dsPIC33f.
Я использую внутренний таймер timer1 PIC, чтобы «поставить галочку» на определенной частоте дискретизации и получить необходимые данные. К сожалению, результаты получаются недостаточно быстро, и я не уверен, почему. Одно из моих подчиненных устройств - акселерометр ADXL345, максимальная скорость передачи данных которого составляет 3600 Гц. Мне не нужен почти такой высокий уровень, но, похоже, я не могу успешно сэмплировать где-либо выше 50 Гц.
I2C настроен на «быстрый режим» 400 кГц. Абсолютный максимум, на котором я хотел бы выбрать акселерометр, составляет 1 кГц, хотя это было бы излишним, меня действительно больше интересует около 128 Гц. Я установил следующие параметры акселерометра:
- Формат данных (0x31) - самотестирование выключено, прерывание инвертировано выключено, полное разрешение включено, бит выравнивания выключен, бит диапазона +/- 16g.
- Скорость передачи данных (0x2C) - режим низкого энергопотребления выключен (нормальный режим), режим выходной скорости передачи данных 400 Гц (я читал в таблице данных, что 400 кГц I2C поддерживает только 800 Гц, поэтому я не рискую с 400 Гц).
- Управление питанием (0x2D) - автоматическое отключение, режим измерения включен, бит сна отключен, частота дискретизации режима сна 8 Гц (хотя и не используется, поэтому может игнорироваться).
- Прерывания (0x2E) - прерывание по готовности данных разрешено, все остальное отключено.
Я использую timer1 для выборки с указанной частотой дискретизации, я знаю, что частота дискретизации работает достаточно, поскольку у меня есть счетчик, который выводит сообщение после того, как счетчик достигает одной минуты; Я использую секундомер, чтобы убедиться, что это правильно. Например, при частоте дискретизации 100 Гц я жду, пока счетчик посчитает до 6000 (100 * 60) и отобразит сообщение, если секундомер показывает 1 минуту, когда я вижу это сообщение, я знаю, что это выборка, по крайней мере, с некоторой точностью.
Когда я пытаюсь выполнить выборку только с акселерометра (режим чтения нескольких байтов I2C, считайте все шесть байтов за один вызов), он работает недостаточно быстро. Используя мой метод секундомера, кажется, что на выполнение задания, которое должно занять одну минуту (выборка при 100 Гц), уходит около минуты и 15 секунд, то есть он не обрабатывает команду I2C достаточно быстро. Более высокая частота дискретизации увеличивает задержку.
У меня есть ощущение, что это как-то связано с тем, что часы I2C и таймер 1 не синхронизируются, и поэтому в моем запросе данных акселерометра есть ненужное ожидание. Я не могу представить, что тактовая частота 400 кГц для I2C недостаточна, но, пожалуйста, поправьте меня, если я ошибаюсь.
Как мне правильно читать данные с ведомых устройств I2C? У меня также есть гироскоп и магнитометр, которые я хочу читать с достаточно высокой частотой дискретизации, магнитометр имеет ограничение в 160 Гц, поэтому, как я уже сказал, частота дискретизации 128 Гц будет подходящей для всех трех устройств. Попытка прочитать данные со всех трех устройств одновременно, очевидно, увеличивает более медленную, чем ожидалось, выборку.
Я также буду собирать аналоговые данные с 4 контактов одновременно (АЦП 10 бит). Этот код уже реализован, и я могу читать аналоговые данные на частоте 1 кГц с ожидаемой частотой дискретизации, просто устройства I2C работают медленно!
Я ожидал, что акселерометр будет в порядке при попытке сэмплирования на 100 Гц, когда я могу выводить на 3600 Гц (макс. 800 Гц для I2C), но он действительно борется, и я не знаю, что еще попробовать.
Ваше здоровье!