Arduino и RS422 энкодер

Контроллеры, драйверы, датчики, управляющие устройства.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Arduino и RS422 энкодер

Сообщение Serg »

Попробуй увеличивать количество импульсов - там в конце блока данных будет нулевой бит, а если продолжать дальше увеличивать, то пойдёт повтор этого блока.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Кулибин1437
Новичок
Сообщения: 35
Зарегистрирован: 11 янв 2019, 07:51
Репутация: 0
Настоящее имя: Эдуард
Откуда: г.Уфа
Контактная информация:

Re: Arduino и RS422 энкодер

Сообщение Кулибин1437 »

Спасибо. Увеличил количество импульсов. Пока стабильно переходит в 1.
Даже время записи анализатора увеличил до 5 секунд. Нолика не заметил.
Надеюсь нормально будет. Прилагаю скрины.
Записывал 100секунд(максимальное время в анализаторе) -полёт нормальный.
25 имп-1.png (1410 просмотров) <a class='original' href='./download/file.php?id=155734&mode=view' target=_blank>Загрузить оригинал (124.7 КБ)</a>
на втором вложил скрин монитора порта, результат преобразования даты в десятичную цифру-смотрим на длинную. Короткая-попытка превратить её в милиметры.
25 имп-2 и монитор порта.png (1410 просмотров) <a class='original' href='./download/file.php?id=155735&mode=view' target=_blank>Загрузить оригинал (167.88 КБ)</a>
прикладываю весь скетч. Правильно ли происходит считывание бит? (убрал гору коментов, что то тут совсем не смотриться)))

const int CLOCK_PIN = 11; // к пину 11 подключаем CLK
const int DATA_PIN = 10; // к пину 10 подключаем DO data

unsigned long sample1; //создали пременую с именем sample1 которая может содержать отчень большое число
unsigned long mm; //создали переменную mm-попытка получить градусное значение в милиметры

void setup() {
pinMode(DATA_PIN, INPUT); //назначили 10 пин как пин для выхода данных
pinMode(CLOCK_PIN, OUTPUT); //назначили 11 пин как пин для выхода данных
//give some default values- задайте значения по умолчанию
digitalWrite(CLOCK_PIN, HIGH); // при старте ардуины 11 пин установлен на высокий уровень (1)
Serial.begin(19200); //запусаем монитор порта на скорости 19200
}


void loop() {

unsigned long reading = readPosition(); //создаем переменную reading и тут-же считыываем ее значение из функции readPosition();
Serial.println(reading, DEC); //печатаем значение переменной reading в формате DEC .
delay(40); //задержка на 20 микросекунд
}

//прочитать текущее угловое положение
int readPosition() { // это функция, набор команд, в которой вычесляется значение переменной reading
unsigned long sample1 = shiftIn(DATA_PIN, CLOCK_PIN, 24); //24считывем значение и записываем его в переменную sample1
delayMicroseconds(1); // часов высок на 20 микросекунд прежде чем новый образец можно принять
unsigned long mm = sample1/223; //попытка перевести в миллиметры
Serial.println(mm, DEC); //распечатал
return sample1; //а если равны возвращаем значение sample1
}

// чтение байта данных из цифрового входа платы.
unsigned long shiftIn(const int DATA_PIN, const int CLOCK_PIN, const int bit_count) { // опять создали
unsigned long data = 0; //создали переменную data и приравняли ее к 0

for (int i=0; i<26; i++) { //24 раз записываем в 11 пин то 0 то 1 через 1 микросекунду со здвигом переменной data в лево на еденицу24
data <<= 1; //сдвигает переменную data влево на 1
digitalWrite(CLOCK_PIN, LOW); // записываем ноль
delayMicroseconds(2); //задержка на 1 микросекунду
digitalWrite(CLOCK_PIN, HIGH); // записываем ноль
delayMicroseconds(1); //задержка на 1 микросекунду
data |= digitalRead(DATA_PIN); //считываем значение с 9 пина и записывае его в переменную data со сдвигом
}
return data; //возвращает значение переменной data
}


Пы.Сы. Я сейчас смотрю цифры с монитора порта. Отключаю питание энкодера(24в), питание Arduino не отключаю. Цифры во время выключения превращаються в нули, а потом в какую то другую. Чё за хрень, энкодер как и положенно не выдаёт ничего(анализатор подтверждает), а циферки не в нолях :wtf: .
Гдето в скетче засада есть.
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

Re: Arduino и RS422 энкодер

Сообщение Сергей Саныч »

Кулибин1437 писал(а): Отключаю питание энкодера(24в), питание Arduino не отключаю. Цифры во время выключения превращаються в нули, а потом в какую то другую.
Случайно не в 16777215 ?
Последний раз редактировалось Сергей Саныч 30 янв 2019, 14:02, всего редактировалось 1 раз.
Чудес не бывает. Бывают фокусы.
Кулибин1437
Новичок
Сообщения: 35
Зарегистрирован: 11 янв 2019, 07:51
Репутация: 0
Настоящее имя: Эдуард
Откуда: г.Уфа
Контактная информация:

Re: Arduino и RS422 энкодер

Сообщение Кулибин1437 »

неа, печатает в данный момент 67108863. а с питанием 39015906 при вращении энкодера-меняется.
И также 67108863-когда пин дата вытащен из ардуинки
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

Re: Arduino и RS422 энкодер

Сообщение Сергей Саныч »

Кулибин1437 писал(а):неа, печатает в данный момент 67108863
То есть 2^26-1. А должно быть 16777215 = 2^24-1.
Подозреваю, что первый и последний биты данных последовательности надо проигнорировать.
У вас, когда включен энкодер, при вращении получаются только четные значения?
Чудес не бывает. Бывают фокусы.
Кулибин1437
Новичок
Сообщения: 35
Зарегистрирован: 11 янв 2019, 07:51
Репутация: 0
Настоящее имя: Эдуард
Откуда: г.Уфа
Контактная информация:

Re: Arduino и RS422 энкодер

Сообщение Кулибин1437 »

в виду того что дата при 24 нестабильно себя вёл то в 1 то 0,между пачками импульсов, вынужден был добавить до 26. Теперь это как раз и мешает правильно считать. Каким то образом куда то игнор надо вставить последних 2 бит или первых, незнаю.

int readPosition() { // это функция, набор команд, в которой вычесляется значение переменной reading
unsigned long sample1 = shiftIn(DATA_PIN, CLOCK_PIN, 24); //24считывем значение и записываем его в переменную sample1
delayMicroseconds(1); // часов высок на 20 микросекунд прежде чем новый образец можно принять
unsigned long mm = sample1/223; //попытка перевести в миллиметры
Serial.println(mm, DEC); //распечатал
return sample1; //а если равны возвращаем значение sample1
}

// чтение байта данных из цифрового входа платы.
unsigned long shiftIn(const int DATA_PIN, const int CLOCK_PIN, const int bit_count) { // опять создали
unsigned long data = 0; //создали переменную data и приравняли ее к 0

for (int i=0; i<26; i++) { //24 раз записываем в 11 пин то 0 то 1 через 1 микросекунду со здвигом переменной data в лево на еденицу24
data <<= 1; //сдвигает переменную data влево на 1
digitalWrite(CLOCK_PIN, LOW); // записываем ноль
delayMicroseconds(2); //задержка на 1 микросекунду
digitalWrite(CLOCK_PIN, HIGH); // записываем ноль
delayMicroseconds(1); //задержка на 1 микросекунду
data |= digitalRead(DATA_PIN); //считываем значение с 9 пина и записывае его в переменную data со сдвигом
}
return data; //возвращает значение переменной data
}
нет всякие и чётные и не чётные
Кулибин1437
Новичок
Сообщения: 35
Зарегистрирован: 11 янв 2019, 07:51
Репутация: 0
Настоящее имя: Эдуард
Откуда: г.Уфа
Контактная информация:

Re: Arduino и RS422 энкодер

Сообщение Кулибин1437 »

Сергей Саныч писал(а):То есть 2^26-1. А должно быть 16777215 = 2^24-1.
Это с отключенной датой или равносильно с отключенным энкодером.
16777215.png (1350 просмотров) <a class='original' href='./download/file.php?id=155761&mode=view' target=_blank>Загрузить оригинал (163.49 КБ)</a>
а это с подключенным, то есть считает.
считает.png (1350 просмотров) <a class='original' href='./download/file.php?id=155763&mode=view' target=_blank>Загрузить оригинал (162.48 КБ)</a>
:D

Правда до завершения ещё пыхтеть и пыхтеть :thinking: .
Надо подключить индикатор со своей програмкой и туда передавать инфу, придумать как менять коефициент для пересчёта в миллиметры, причём чтоб клиент мог сам его менять. И чтобы тайминг не перескочил за требуемые параметры :lolh:
Кулибин1437
Новичок
Сообщения: 35
Зарегистрирован: 11 янв 2019, 07:51
Репутация: 0
Настоящее имя: Эдуард
Откуда: г.Уфа
Контактная информация:

Re: Arduino и RS422 энкодер

Сообщение Кулибин1437 »

С этой DATA пока не всё решено, ну или с преобразованием в десятичное значение. Дело в том что, насколько я помню энкодер за оборот должен выдавать 4096 импульсов, по крайней мере заказывал такой.
UT86RSJXkNbXXagOFbXC--1.jpg (1330 просмотров) <a class='original' href='./download/file.php?id=155821&mode=view' target=_blank>Загрузить оригинал (97.83 КБ)</a>
А по факту разница в цифрах между оборотами таковы:
6156
6126
260098
2060
10137
6048
чегото я ещё не понимаю :problem:
Скидку наверное можно давать на неточность вращения в пределах пусть 200 единиц, а тут гораздо выше.
Почему обратил внимание. Хотел пытаться отмотать до нуля энкодер и увидел это дело...

К стати я у энкодера не применял выход DIR и MIDP(почему то так написано на нём). Что с ними делать. Может и их подключить. Это вроде как направление или ни так???
Придётся читать мануал, учи матчасть :lolh: , чтото про них написано на непонятном аглицком :wtf:
По сути мне кажется что эти сигналы не должны влиять на отчёт?
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

Re: Arduino и RS422 энкодер

Сообщение Сергей Саныч »

Кулибин1437 писал(а):data |= digitalRead(DATA_PIN);
А эта функция точно возвращает только 0 или 1? Не может ли быть мусора в старших разрядах?
я бы для надежности попробовал

Код: Выделить всё

data |= digitalRead(DATA_PIN) & 1;
Попробуйте повернуть энкодер на "чуть-чуть" и сравните показания.
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

Re: Arduino и RS422 энкодер

Сообщение Сергей Саныч »

Кулибин1437 писал(а):по крайней мере заказывал такой
Пометки красным соответствуют вашему энкодеру?
Чудес не бывает. Бывают фокусы.
Кулибин1437
Новичок
Сообщения: 35
Зарегистрирован: 11 янв 2019, 07:51
Репутация: 0
Настоящее имя: Эдуард
Откуда: г.Уфа
Контактная информация:

Re: Arduino и RS422 энкодер

Сообщение Кулибин1437 »

Спасибо. Попробовал. без разницы
Кулибин1437
Новичок
Сообщения: 35
Зарегистрирован: 11 янв 2019, 07:51
Репутация: 0
Настоящее имя: Эдуард
Откуда: г.Уфа
Контактная информация:

Re: Arduino и RS422 энкодер

Сообщение Кулибин1437 »

Сергей Саныч писал(а):Пометки красным соответствуют вашему энкодеру?
ага, опа кроме выхода не RS485 а SG=SSI
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

Re: Arduino и RS422 энкодер

Сообщение Сергей Саныч »

При малых (доли градуса) поворотах как меняются показания? Приведите примеры (скриншоты).
На неподвижном энкодере показания стабильны?
Чудес не бывает. Бывают фокусы.
Кулибин1437
Новичок
Сообщения: 35
Зарегистрирован: 11 янв 2019, 07:51
Репутация: 0
Настоящее имя: Эдуард
Откуда: г.Уфа
Контактная информация:

Re: Arduino и RS422 энкодер

Сообщение Кулибин1437 »

иногда последний знак скачет, а так в основном цифра не меняется.
от нуля.
0.png (1296 просмотров) <a class='original' href='./download/file.php?id=155833&mode=view' target=_blank>Загрузить оригинал (213.58 КБ)</a>
минус 0,25 оборота
минус четверть оборота.png (1296 просмотров) <a class='original' href='./download/file.php?id=155834&mode=view' target=_blank>Загрузить оригинал (233.07 КБ)</a>
плюс 0,25 оборота
плюс четверть оборота.png (1296 просмотров) <a class='original' href='./download/file.php?id=155837&mode=view' target=_blank>Загрузить оригинал (259.51 КБ)</a>
ща пробую видео закинуть и ссылку скину
у меня через флешку, интернет прям -пуля. :tongue: :pssdoff:
https://yadi.sk/i/XwXDirQyXEVfRw

DIR и MIDP- про них читал чита, так и не понял, это входы или выходы. Если правильно понял то MIDP какfя то обнулялка, то есть вход?
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

Re: Arduino и RS422 энкодер

Сообщение Сергей Саныч »

Попробуй задействовать контакт MidP. Высокий уровень сбрасывает энкодер в "среднюю" позицию, низкий - позволяет считать. Если сейчас он никуда не подключен, могут быть "нюансы", особенно если этот вход внутри никуда не подтянут.
Чудес не бывает. Бывают фокусы.
Кулибин1437
Новичок
Сообщения: 35
Зарегистрирован: 11 янв 2019, 07:51
Репутация: 0
Настоящее имя: Эдуард
Откуда: г.Уфа
Контактная информация:

Re: Arduino и RS422 энкодер

Сообщение Кулибин1437 »

к плюсу-ничего не считает, показания не меняються.
К минусу-показания изменились(похоже действительно сбросился в какуто цифру.
зато фокус появился.
обнулил.
обнулил.png (1279 просмотров) <a class='original' href='./download/file.php?id=155839&mode=view' target=_blank>Загрузить оригинал (168.07 КБ)</a>
повернул четверть оборота против часовой
после обнул против часов.png (1279 просмотров) <a class='original' href='./download/file.php?id=155843&mode=view' target=_blank>Загрузить оригинал (396.89 КБ)</a>
апосля обнул.png (1260 просмотров) <a class='original' href='./download/file.php?id=155847&mode=view' target=_blank>Загрузить оригинал (223.35 КБ)</a>
И по часовой полоборота


Цифры после перскакивания нуля резко меняют показания.
А вот когда смотришь на нолики и единички, их переполнение, перескакивание происходит вроде как в книжках, всё замечательн(смотрел ещё до этого)
Последний раз редактировалось Кулибин1437 31 янв 2019, 15:05, всего редактировалось 3 раза.
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

Re: Arduino и RS422 энкодер

Сообщение Сергей Саныч »

Что-то попутано, картинки 1 и 3 идентичны, у них даже время совпадает.
И еще - в документации заявлен контроль четности, но где этот бит - не сказано.
Чудес не бывает. Бывают фокусы.
Кулибин1437
Новичок
Сообщения: 35
Зарегистрирован: 11 янв 2019, 07:51
Репутация: 0
Настоящее имя: Эдуард
Откуда: г.Уфа
Контактная информация:

Re: Arduino и RS422 энкодер

Сообщение Кулибин1437 »

Сергей Саныч писал(а):И еще - в документации заявлен контроль четности, но где этот бит - не сказано.
а это не провод DIR c энкодера-который в воздухе висит пока что.
Или мне к китайцам, пытать их, куда они спрятали его, в смысле бит.

добавлю. Поймал момент перехода через обнулённую точку.
Поймал момент перехода через обнулённую точку.png (1255 просмотров) <a class='original' href='./download/file.php?id=155864&mode=view' target=_blank>Загрузить оригинал (112.83 КБ)</a>
Кстати второй бит слева, возможно он о направлении говорит. Я как раз менял направление, в этот момент цифры резко меняються как раз
Последний раз редактировалось Кулибин1437 31 янв 2019, 15:18, всего редактировалось 2 раза.
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

Re: Arduino и RS422 энкодер

Сообщение Сергей Саныч »

Кулибин1437 писал(а):а это не провод DIR c энкодера
Вряд ли. Он где-то среди битов данных.
DIR - это направление, его, кстати, тоже надо фиксировать.
Вообще, документация достаточно мутная.

Попробуй снять несколько замеров не удаляя "лишних" битов. То есть выведи все 26. Посмотрим.
Последний раз редактировалось Сергей Саныч 31 янв 2019, 15:20, всего редактировалось 1 раз.
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Arduino и RS422 энкодер

Сообщение Serg »

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

Вернуться в «Электроника»