Arduino + абсолютный промышленный SPI энкодер китайского производства

Peter
Peter аватар
Offline
Зарегистрирован: 25.02.2012

Добрый день, коллеги.

Очень удобно, когда ты берешься подключить неведомую железку к ардуинке, и на все есть уже пример.

Часто пользуюсь этим форумом в этих целях, а потому решил внести свою лепту, авось кому на пользу будет.

Приобрел на али абсолютный SPI энкодер для своих нужд на 1024 шагов. (https://ru.aliexpress.com/item/Free-Shipping-10-bit-absolute-encoder-M6A2-38F10B-5C-2-5M/32752380331.html?spm=2114.13010608.0.0.acB9Sx)

Работает по SPI, но сразу дружить со мной не захотел. Пршлось чутка потыкаться, т.к. никакой сопроводитлеьной документации на него небыло, и в сети информации нет также.

Подключение для 2560:

-черный тонкий - CS  - у меня PIN13

-белый DATA (MISO) - PIN50

-зеленый CLK - PIN52

-черный толстый GND

Рабочий код:

#include <SPI.h>

#define SPI_MODE0 0x00


void setup()
{  
  Serial.begin(115200);

 encoderIni();
}


void loop()
{

Serial.println(queryEncoder());

 delay(100);
}

void encoderIni()
{
  SPI.begin();
  pinMode(13, OUTPUT);
  digitalWrite(13, 1);
   SPI.setClockDivider(SPI_CLOCK_DIV32);
}

int queryEncoder()
{
  digitalWrite(13, 0);
  byte value_1 = SPI.transfer(0);
  byte value_2 = SPI.transfer(0);
  digitalWrite(13, 1);
  int result = value_1*8 + value_2/32;
  return result;
}

 

Peter
Peter аватар
Offline
Зарегистрирован: 25.02.2012

красный - +5v

marchenokoff
Offline
Зарегистрирован: 05.04.2019

Здравствуйте, есть необходимость использовать такой же енкодер. Можно для чайника разъяснить функцию queryencoder. Конкретно зачем брать 2 байта? Отправлять 0? И каким образом происходит пересчет в интовое значение? 

Еще ньюансы. Какое разрешение у этого энкодера по оборотам? И можно ли все это реализвать в прерывании?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

marchenokoff пишет:
Можно для чайника разъяснить функцию queryencoder. Конкретно зачем брать 2 байта? Отправлять 0? И каким образом происходит пересчет в интовое значение?

queryencoder() cчитывает показания энкодера. Зачем брать 2 байта? Даташит я не смотрел, но, похоже, энкодер передает 8 битное значение за 2 раза, сначала старшие 4 бита, потом младшие 4.

Передавать 0 надо для того, что бы инициировать SPI обмен. Он идет одновременно в 2 стороны. Если слейву данные не нужны (как в этом случае) то передавать можно хоть 0, хоть что угодно еще.

 

Цитата:
Еще ньюансы. Какое разрешение у этого энкодера по оборотам? И можно ли все это реализвать в прерывании?

Нюансов про разрешение не знаю, а в прерывании реализовать можно. Только что именно имеется ввиду? SPI генерирует прерывание когда обмен завершен. А  инициировать eго на мастере надо"вручную" . 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

1024 на оборот выходит, хотя...пишут 360 или 360*4

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

ua6em пишет:

1024 на оборот выходит, хотя...пишут 360 или 360*4

Ну и?

marchenokoff
Offline
Зарегистрирован: 05.04.2019

В том то и дело, что даташита нет на эту штуковину. А он же 10-битный, почему тогда 8-ми битное значение передает? Ну идею я понял, в любом случае нужно 2 байтовых переменных. А что насчет формулы пересчета в инт? Одну переменную множим на 8 а вторую делим на 32?  В чем логика?

marchenokoff
Offline
Зарегистрирован: 05.04.2019

Я имел ввиду разрешение по оборотам. Он же не бесконечно может крутиться, там механика ограничена.Например 12 бит. То есть максимум 4096 оборотов. Дальше счетчик сбросится в 0.Или я что то не правильно понимаю?

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

marchenokoff пишет:

Я имел ввиду разрешение по оборотам. Он же не бесконечно может крутиться, там механика ограничена.Например 12 бит. То есть максимум 4096 оборотов. Дальше счетчик сбросится в 0.Или я что то не правильно понимаю?


https://www.motioncontroltips.com/faq-what-is-the-difference-between-abs...

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Хыыы... Ну а как 10 бит сунуть в один байт ?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

brokly пишет:

Хыыы... Ну а как 10 бит сунуть в один байт ?

Свёрткой. Или Zip-овать