Датчик AS5047P / SPI

Для работы с SPI на ардуино предусмотрена библиотека SPI.h. На драйвере VBCore BLDC выведено два SPI интерфейса - SPI1 и SPI3. Для SPI1 подключение идет к следующим пинам:

//SPI1 :
MISO PA6
MOSI PA7
SCK PA5
NSS PA4

Для SPI3:

//SPI3:
MISO PC11
MOSI PC12
SCK PC10
NSS PA_15_ALT1 //1 chip select
NSS2 PB4       //2 chip select

Ознакомиться с функциями 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 приведен ниже