AS5045 и Ардуино

Доброго времени суток. Появилась у меня необходимость сделать считывание угла поворота без какого-либо физического контакта. После некоторых поисков был выбран абсолютный магнитный энкодер AS5045. Он имеет 4096 позиций на один оборот, что соответствует точности примерно 0,088 градуса на позицию. Меня такая точность вполне устраивала и решил брать. Вот тут-то и появилась первая проблема. Заключалась она в том, что на него очень мало толковой информации на русском языке. Забегая вперед, скажу что запустить мне его удалось, именно по этому и захотелось сделать более менее полезную выжимку из того что нашел.

Полазив в даташите и посмотрев фотографии дем-плат от производителя  нарисовал такую схему подключения:

AS5045 и Ардуино Arduino, Электроника, Длиннопост, Энкодер

Вторая проблема  это корпус датчика. Датчик поставляется в достаточно маленьком корпусе - SSOP-16, по этому плату делал фоторезистом. Требование по размерам были достаточно жестким  соответственно и элементы взял не большие в корпусе 1206.

AS5045 и Ардуино Arduino, Электроника, Длиннопост, Энкодер

Третья проблема это, как ни странно китай. AS5045, как и подобные ему энкодеры требуют  диаметрально намагниченный магнит. Проблема появилась тогда, когда я понял,что китайцы положили не диаметральный магнит а обычный. В принципе это решается установкой магнита на бок, но повторюсь требования по размерам достаточно жесткие. Так что пришлось искать пути обхода. А ларчик просто открывался. Вытащил из мебельной магнитной держалки для дверцы, там и магнит тонкий и если правильно расположить, то все прекрасно работает.

AS5045 и Ардуино Arduino, Электроника, Длиннопост, Энкодер

Как сказано в заголовке, подключаться он  будет к плате Ардуино. Для этих целей есть хорошая библиотека (https://github.com/DashZhang/AS5045).  Пример из библиотеки сразу выполняет то что мне и нужно:

[code]

#include <AS5045.h>
// CHANGE THESE AS APPROPRIATE

#define CSpin 2

#define CLKpin 3

#define DOpin 4
AS5045 enc (CSpin, CLKpin, DOpin) ;
// didn't program the OTP

void setup (){

Serial.begin (115200) ;

// NOTE BAUD RATE

if (!enc.begin ()) Serial.println ("Error setting up AS5045") ;}
void loop ()

{/* Serial.print ("value:") ;

Serial.print (enc.read (), DEC) ; 

Serial.print (" ") ; 

Serial.print ("status:") ;

Serial.print (enc.status (), BIN) ; Serial.print (" ") ; 

Serial.print (enc.valid () ? "OK" : "Fault") ; 

Serial.print (" ") ; 

Serial.print ("Z:") ; 

Serial.println (enc.Zaxis ()) ;

*/Serial.print (enc.read () , BIN);Serial.print ("\t");Serial.print (enc.status (), BIN) ;

Serial.print ("\t");

Serial.print ("Angle : ");

Serial.println (enc.read () * 0.08789, DEC);

delay(10);

}

[/code]

В заключении скажу что данная статья не претендует на какое-либо всеобъемлющее учебное пособие и никого не заставляет делать так же как у меня. Написал просто что бы поделиться опытом и помочь тем, у кого возникнут такие же проблемы