Датчик AS5047P / SPI
Last updated
Last updated
Для работы с SPI на ардуино предусмотрена библиотека SPI.h. На драйвере VBCore BLDC выведено два SPI интерфейса - SPI1 и SPI3. Для SPI1 подключение идет к следующим пинам:
Для SPI3:
Ознакомиться с функциями SPI, I2C и других интерфейсов мы предлагаем самостоятельно в документации.
Если вы хотите работать с датчиком AS5047, то советуем вам установить библиотеку в Arduino IDE не через менеджер библиотек, а с нашего репозитория. Это немного измененная стандартная библиотека AS5047P. А изменена она была потому, что в стандартной используется SPI1, а к нашему драйверу датчик подключается по SPI 3.
Вот рабочий пример для чтения угла по датчику AS5047:
Ниже будет подробно расписано что именно было изменено в стандартной библиотеке. В целом, если вы просто хотите читать датчик, то дальнейшее описание можно пропустить.
Если вам все же интересно что было изменено в стандартной библиотеке, то хотим обратить ваше внимание на SPIClass и его конструктор. Он имеет следующий вид:
В качестве альтернативы можно использовать конструктор, принимающий три параметра, а параметр cheap select передать при запуске SPI.
При чтении датчиков по SPI в некоторых библиотеках (Adafruit_BMP280 например) есть возможность напрямую указать к каким пинам подключены MISO, MOSI, SCLK. В некоторых (SimpleFOC) требуется в качестве параметра функции передать SPIClass*
Однако встречаются библиотеки, в которых нет функции для переопределения SPI интерфейса. В таком случае мы всегда можем залезть в исходные файлы, они имеют расширение .h и .cpp и обычно лежат в папке src и переписать функции инициализации SPI.
Давайте рассмотрим в качестве примера библиотеку AS5047P, которую можно установить через менеджер библиотек. Возьмем из этой библиотеки пример - BasicReadAngle.
Будьте предельно внимательны с определением пинов. Например, если вы сразу загрузите эту программу на плату, у вас выйдет вот такая ошибка:
И исправить ее можно будет только через STM32CubeProgrammer. А возникнет ошибка из-за использования 13 пина в примере не по назначению:
Сделаем все правильно. Во-первых подключим библиотеку VBCoreG4 и укажем корректный пин для cheap select:
В VBCoreG4 пины, к которым подключены светодиоды уже определены как LED1 и LED2, выберем любой и установим его в setup на вывод:
Дальше загрузим программу, ничего больше не меняя, на плату, подключим датчик к SPI3 и попробуем почитать с него углы. В Serial Port вы увидите строчку "Can't connect to the AS5047P sensor! Please check the connection...".
Все потому, что библиотека использует SPI интерфейс, в котором пины для ардуино установлены по умолчанию. Давайте их переопределять. Идем вглубь библиотеки (она лежит либо в C:\Program Files (x86)\Arduino\libraries, либо в C:\Users\username\Documents\Arduino\libraries ), заходим в папку src и открываем файлы AS5047P.h и AS5047P.cpp Находим функцию
Меняем ее на
В теле этой функции в файле AS5047P.cpp меняем одну строчку:
Сохраняем все и закрываем. Дальше заходим в папку spi, открываем файл AS5047P_SPI_Arduino.h
В class AS5047P_SPI в private добавим член класса
И отредактируем немного public метод:
Сохраняем, закрываем файл. Осталось отредактировать AS5047P_SPI_Arduino.cpp
Меняем метод init
И обращение к методам SPI во всех оставшихся функциях. Замените
На
Сохраните и закройте файл. Все, библиотека подправлена - в ней добавлена возможность изменения интерфейса SPI. В будущем схожим образом можно аккуратно менять исходный код и в других библиотеках.
Исправленную под наши цели библиотеку с примерами можно найти на github. Скачайте ее себе на компьютер, распакуйте в libraries и используйте при работе с датчиками AS5047P.
Полный код программы для чтения датчика AS5047P приведен ниже