Arduino + абсолютный промышленный SPI энкодер китайского производства
- Войдите на сайт для отправки комментариев
Добрый день, коллеги.
Очень удобно, когда ты берешься подключить неведомую железку к ардуинке, и на все есть уже пример.
Часто пользуюсь этим форумом в этих целях, а потому решил внести свою лепту, авось кому на пользу будет.
Приобрел на али абсолютный 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; }
красный - +5v
Здравствуйте, есть необходимость использовать такой же енкодер. Можно для чайника разъяснить функцию queryencoder. Конкретно зачем брать 2 байта? Отправлять 0? И каким образом происходит пересчет в интовое значение?
Еще ньюансы. Какое разрешение у этого энкодера по оборотам? И можно ли все это реализвать в прерывании?
queryencoder() cчитывает показания энкодера. Зачем брать 2 байта? Даташит я не смотрел, но, похоже, энкодер передает 8 битное значение за 2 раза, сначала старшие 4 бита, потом младшие 4.
Передавать 0 надо для того, что бы инициировать SPI обмен. Он идет одновременно в 2 стороны. Если слейву данные не нужны (как в этом случае) то передавать можно хоть 0, хоть что угодно еще.
Нюансов про разрешение не знаю, а в прерывании реализовать можно. Только что именно имеется ввиду? SPI генерирует прерывание когда обмен завершен. А инициировать eго на мастере надо"вручную" .
1024 на оборот выходит, хотя...пишут 360 или 360*4
1024 на оборот выходит, хотя...пишут 360 или 360*4
Ну и?
В том то и дело, что даташита нет на эту штуковину. А он же 10-битный, почему тогда 8-ми битное значение передает? Ну идею я понял, в любом случае нужно 2 байтовых переменных. А что насчет формулы пересчета в инт? Одну переменную множим на 8 а вторую делим на 32? В чем логика?
Я имел ввиду разрешение по оборотам. Он же не бесконечно может крутиться, там механика ограничена.Например 12 бит. То есть максимум 4096 оборотов. Дальше счетчик сбросится в 0.Или я что то не правильно понимаю?
Я имел ввиду разрешение по оборотам. Он же не бесконечно может крутиться, там механика ограничена.Например 12 бит. То есть максимум 4096 оборотов. Дальше счетчик сбросится в 0.Или я что то не правильно понимаю?
https://www.motioncontroltips.com/faq-what-is-the-difference-between-abs...
Хыыы... Ну а как 10 бит сунуть в один байт ?
Хыыы... Ну а как 10 бит сунуть в один байт ?
Свёрткой. Или Zip-овать