LinuxCNC + Ethernet контроллеры NVEM/EC300/EC500

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
Аватара пользователя
MX_Master
Мастер
Сообщения: 7465
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3088
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: LinuxCNC + Ethernet контроллеры NVEM/EC300/EC500

Сообщение MX_Master »

wldev писал(а):

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

if(stateA!=encoder[c].stateA
 &&stateB!=encoder[c].stateB) //если оба канала изменились то значит не успели
   {
   //Error
   }
Тут есть хитрый момент. Если импульсов было больше, чем код успел переварить, мы не можем данной проверкой выловить ошибку на 100%. Два входа могут передёрнуться и встать так, что пройдут эту проверку. Например, мы перескочили в обход кода только на 1 импульс (или на 4). При этом только 1 вход изменит своё состояние (или не один, если перескочили на 4).

wldev писал(а):

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

if ( state == encoder[c].state ) continue; //дальше пройдём только если неравно
    encoder[c].pos += encoder_states[encoder[c].state] == state ? 1 : -1;  // и здесь всегда будет только  -1?
    encoder[c].state = state;
wldev писал(а): // и здесь всегда будет только -1?
Тут используется хитрая проверка. Индекс предыдущего AB состояния (от 0 до 3) используется для проверки следующего состояния с помощью массива всех возможных состояний.
Аватара пользователя
wldev
Мастер
Сообщения: 1639
Зарегистрирован: 24 янв 2012, 16:04
Репутация: 510
Настоящее имя: Сергей Бочаров
Откуда: Новосибирск
Контактная информация:

Re: LinuxCNC + Ethernet контроллеры NVEM/EC300/EC500

Сообщение wldev »

MX_Master писал(а): Тут используется хитрая проверка. Индекс предыдущего AB состояния (от 0 до 3) используется для проверки следующего состояния с помощью массива всех возможных состояний.
Это понятно. Но там всегда будет -1
до этой строчки

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

encoder[c].pos += encoder_states[encoder[c].state] == state ? 1 : -1;
мы дойдем только если

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

encoder_states[encoder[c].state] != state
и соотв. всегда будет -1

сорри недопонял
Последний раз редактировалось wldev 04 сен 2022, 18:08, всего редактировалось 1 раз.
Новости: https://t.me/wldevruch
Обсуждения: https://t.me/wldevgr
Аватара пользователя
MX_Master
Мастер
Сообщения: 7465
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3088
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: LinuxCNC + Ethernet контроллеры NVEM/EC300/EC500

Сообщение MX_Master »

Специально перепроверил. Всё работает как и задумано - https://onlinegdb.com/0C9ymAT04

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

#include <stdio.h>
#include <stdint.h>

uint32_t states[4] = {0b01, 0b11, 0b00, 0b10};
uint32_t A = 0, B = 0, AB_old = 0, AB_new = 0;
int32_t pos = 0;

void encoder_main_loop() {
    AB_new = (A ? 0b10 : 0x00) | ( B ? 0b01 : 0x00);
    if ( AB_new == AB_old ) return;
    pos += states[AB_old] == AB_new ? 1 : -1;
    printf("A:%u, B:%u, AB_new:%u, AB_old:%u, pos:%i \n",A,B,AB_new,AB_old,pos);
    AB_old = AB_new;
}

int main() {
    uint32_t i, p, pulses = 100;
    printf("--- making %u pulses forward --------------\n", pulses);
    for ( i = pulses, p = 0; i--; ) {
        // Encoder pulses generator, direction = Clockwise
        // A _____|`````|_____|`````|_____|`````|__
        // B __|`````|_____|`````|_____|`````|_____
        switch (p) {
          case 0: { B = !B; break; }
          case 1: { A = !A; break; }
          case 2: { B = !B; break; }
          case 3: { A = !A; break; }
        }
        p = (++p) & 0b11;
        // encoder counter
        encoder_main_loop();
    }
    printf("--- making %u pulses back --------------\n", pulses);
    for ( i = pulses, p = 0; i--; ) {
        // Encoder pulses generator, direction = Counter-Clockwise
        // A __|`````|_____|`````|_____|`````|_____
        // B _____|`````|_____|`````|_____|`````|__
        switch (p) {
          case 0: { A = !A; break; }
          case 1: { B = !B; break; }
          case 2: { A = !A; break; }
          case 3: { B = !B; break; }
        }
        p = (++p) & 0b11;
        // encoder counter
        encoder_main_loop();
    }
    return 0;
}

Единственная ошибка в предыдущем коде была опечаткой - вместо префикса 0b я кое-где написал 0x. Исправлено.

Остаётся вопрос как сделать данный код ещё быстрее. Чтобы было меньше команд процессора, меньше чтений регистров, меньше чтений с флэша.
Аватара пользователя
wldev
Мастер
Сообщения: 1639
Зарегистрирован: 24 янв 2012, 16:04
Репутация: 510
Настоящее имя: Сергей Бочаров
Откуда: Новосибирск
Контактная информация:

Re: LinuxCNC + Ethernet контроллеры NVEM/EC300/EC500

Сообщение wldev »

Не знал про такое)) спасибо

Неправильно считает при нечётном задании 101 например..
Новости: https://t.me/wldevruch
Обсуждения: https://t.me/wldevgr
Аватара пользователя
MX_Master
Мастер
Сообщения: 7465
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3088
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: LinuxCNC + Ethernet контроллеры NVEM/EC300/EC500

Сообщение MX_Master »

wldev писал(а): Неправильно считает при нечётном задании 101 например..
Генератор неправильно выдаёт состояние пинов, если общее число импульсов не кратно 4. Второй цикл там чисто для быстрой проверки в обратную сторону. В общем, счётчик работает. Заниматься тюнингом генератора задачи нет :) По сути, грамотный генератор будет делать то же, что и счётчик только в обратном порядке.
Аватара пользователя
MX_Master
Мастер
Сообщения: 7465
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3088
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: LinuxCNC + Ethernet контроллеры NVEM/EC300/EC500

Сообщение MX_Master »

Проверил ассемблерный листинг у каждого, из предложенных счётчиков - https://godbolt.org/z/6f3Wv6qbE.

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

#include <stdio.h>
#include <stdint.h>

uint32_t states[4] = {0b01, 0b11, 0b00, 0b10};
uint32_t A = 0, B = 0, AB_old = 0, AB_new = 0, A_old = 0, B_old = 0;
int32_t pos = 0;

#if 0
void encoder_main_loop() {
    AB_new = (A ? 0b10 : 0x00) | ( B ? 0b01 : 0x00);
    if ( AB_new == AB_old ) return;
    pos += states[AB_old] == AB_new ? 1 : -1;
    AB_old = AB_new;
}
#else
void encoder_main_loop() {
    if ( A != A_old ) {
        A_old = A;
        if ( A ) pos += B ? -1 :  1;
        else     pos += B ?  1 : -1;
    } else if ( B != B_old ) {
        B_old = B;
        if ( B ) pos += A ?  1 : -1;
        else     pos += A ? -1 :  1;
    }
}
#endif
Для быстрого сравнения можно переключать варианты (#if 0/1). В моём варианте коду получается меньше, но быстродействие от кол-ва кода не зависит. Эх, пора бы уже подучить ассемблер.. смелости не хватает
Аватара пользователя
MX_Master
Мастер
Сообщения: 7465
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3088
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: LinuxCNC + Ethernet контроллеры NVEM/EC300/EC500

Сообщение MX_Master »

Такс. Китайцы подложили в новые контроллеры NVEM новую китайскую свинью :) Вся разводка платы новая и основной чип теперь другой - iMX RT1052. Этого стоило ожидать. Привязка к определённому железу всегда чревата. В общем, приехали.

IMG_20220908_104733.jpg (2189 просмотров) <a class='original' href='./download/file.php?id=204800&sid=9fb9920f5a60ec9b085bb1812ee47b81&mode=view' target=_blank>Загрузить оригинал (412.51 КБ)</a>
D.L.
Мастер
Сообщения: 471
Зарегистрирован: 25 авг 2018, 10:11
Репутация: 152
Настоящее имя: Дмитрий
Откуда: Киров
Контактная информация:

Re: LinuxCNC + Ethernet контроллеры NVEM/EC300/EC500

Сообщение D.L. »

Видимо нехватка stm32 сказывается, месе вон тоже на другую фпга пришлось перейти.
AndreyFly
Новичок
Сообщения: 3
Зарегистрирован: 09 сен 2022, 19:00
Репутация: 0
Настоящее имя: Андрей Николаевич
Контактная информация:

Re: LinuxCNC + Ethernet контроллеры NVEM/EC300/EC500

Сообщение AndreyFly »

Как получить прошивку для NVEM V2? Чип STM32F207.
Аватара пользователя
MX_Master
Мастер
Сообщения: 7465
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3088
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: LinuxCNC + Ethernet контроллеры NVEM/EC300/EC500

Сообщение MX_Master »

AndreyFly писал(а): 11 сен 2022, 08:47 Как получить прошивку для NVEM V2? Чип STM32F207.
viewtopic.php?f=163&t=33843, и где-то через "недельку" будет версия с энкодерами
Аватара пользователя
MX_Master
Мастер
Сообщения: 7465
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3088
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: LinuxCNC + Ethernet контроллеры NVEM/EC300/EC500

Сообщение MX_Master »

Вместе с другими разработчиками и участниками форума LinuxCNC пытаемся найти подходящее решение для прошивки новых контроллеров NVEM/EC300/EC500 (на основе i.MX RT1052). Почитать можно тут - https://forum.linuxcnc.org/18-computer/ ... ?start=500
Аватара пользователя
MX_Master
Мастер
Сообщения: 7465
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3088
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: LinuxCNC + Ethernet контроллеры NVEM/EC300/EC500

Сообщение MX_Master »

Пока что ощутимых результатов по подключению к чипу IMXRT1052 нет. Так что с 50% вероятностью можно готовиться к сворачиванию проекта wave и подготовке к форсированию проекта собственного контроллера. И это при том, что в прошивке/драйвере старого NVEM'а уже энкодеры робят и мануал на русском есть, только конфиг с ПИДом не доделан. Эх..

ЗЫ как меня заколебали эти готовые устройства.. уже второй проект в мусор уходит
Аватара пользователя
xenon-alien
Почётный участник
Почётный участник
Сообщения: 4506
Зарегистрирован: 01 янв 2013, 13:13
Репутация: 920
Настоящее имя: Daniel
Откуда: Закарпатская обл. Украина
Контактная информация:

Re: LinuxCNC + Ethernet контроллеры NVEM/EC300/EC500

Сообщение xenon-alien »

MX_Master писал(а): ЗЫ как меня заколебали эти готовые устройства.. уже второй проект в мусор уходит
Для плат меса там тоже какие-то нюансы с чипами и приходится им переделывать плату и разводку под новые чипы, так что ты не один...
Мол цена старого чипа равняется на цену готовой плате в продаже...
Аватара пользователя
MX_Master
Мастер
Сообщения: 7465
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3088
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: LinuxCNC + Ethernet контроллеры NVEM/EC300/EC500

Сообщение MX_Master »

Закругляем проект. Времени потрачено много, результаты в мусор. Все желающие могут на старых контроллерах (с STM32) использовать открытый проект Remora - https://github.com/scottalford75/Remora-NVEM
Аватара пользователя
antoxa-kylibin
Мастер
Сообщения: 786
Зарегистрирован: 22 июн 2017, 13:18
Репутация: 107
Настоящее имя: Антон
Откуда: г. Воронеж
Контактная информация:

Re: LinuxCNC + Ethernet контроллеры NVEM/EC300/EC500 (проект отменён)

Сообщение antoxa-kylibin »

Ожидаемо......
AAN
Мастер
Сообщения: 284
Зарегистрирован: 14 апр 2015, 10:28
Репутация: 35
Настоящее имя: Антон
Откуда: Томск
Контактная информация:

Re: LinuxCNC + Ethernet контроллеры NVEM/EC300/EC500 (проект отменён)

Сообщение AAN »

У всех разрабов с STM беда приключилась - были мощные недорогие МК с множеством функций. Были, да сплыли. На поделиях этой фирмы можно поставить крест и солью посыпать...
Аватара пользователя
MX_Master
Мастер
Сообщения: 7465
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3088
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: LinuxCNC + Ethernet контроллеры NVEM/EC300/EC500 (проект отменён)

Сообщение MX_Master »

Интересно, что другие производители, такие как NXP, не сильно пострадали в период дефицита чипов. Непонятно только, почему китайцы на отечественные чипы не перешли в своих новых контроллерах. Это было бы логичнее и перспективнее. Видимо, свои чипы всё ещё недостаточно хороши в плане документации и средств разработки.
sidor094
Мастер
Сообщения: 826
Зарегистрирован: 20 фев 2014, 09:13
Репутация: 81
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: LinuxCNC + Ethernet контроллеры NVEM/EC300/EC500 (проект отменён)

Сообщение sidor094 »

А что,разве stm китайцы уже не продают? У меня тоже проект на плате с stm32f764.Вроде видел на али в продаже.
Аватара пользователя
MX_Master
Мастер
Сообщения: 7465
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3088
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: LinuxCNC + Ethernet контроллеры NVEM/EC300/EC500 (проект отменён)

Сообщение MX_Master »

Макетки и небольшое кол-во с рук продавалось и раньше. Сейчас тоже есть. Но для производства устройств нужно закупать целые партии чипов. А партию так просто не купить. Надо в очереди стоять и брать очень много. Мелкосейрийка не может себе такое позволить.
sidor094
Мастер
Сообщения: 826
Зарегистрирован: 20 фев 2014, 09:13
Репутация: 81
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: LinuxCNC + Ethernet контроллеры NVEM/EC300/EC500 (проект отменён)

Сообщение sidor094 »

https://aliexpress.ru/item/400113165161 ... 4716178984
Использую такие для управления станками чпу .В том числе и на работе.Уходит максимум штук пять в месяц.Для остальных разработок использую более дешевые.А что значит большая партия?Неужели у вас контроллеры уходят сотнями штук?
Ответить

Вернуться в «LinuxCNC»