Страница 6 из 7

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

Добавлено: 03 сен 2022, 21:05
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) используется для проверки следующего состояния с помощью массива всех возможных состояний.

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

Добавлено: 04 сен 2022, 09:12
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

сорри недопонял

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

Добавлено: 04 сен 2022, 17:11
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. Исправлено.

Остаётся вопрос как сделать данный код ещё быстрее. Чтобы было меньше команд процессора, меньше чтений регистров, меньше чтений с флэша.

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

Добавлено: 04 сен 2022, 18:06
wldev
Не знал про такое)) спасибо

Неправильно считает при нечётном задании 101 например..

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

Добавлено: 04 сен 2022, 22:09
MX_Master
wldev писал(а): Неправильно считает при нечётном задании 101 например..
Генератор неправильно выдаёт состояние пинов, если общее число импульсов не кратно 4. Второй цикл там чисто для быстрой проверки в обратную сторону. В общем, счётчик работает. Заниматься тюнингом генератора задачи нет :) По сути, грамотный генератор будет делать то же, что и счётчик только в обратном порядке.

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

Добавлено: 06 сен 2022, 13:58
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). В моём варианте коду получается меньше, но быстродействие от кол-ва кода не зависит. Эх, пора бы уже подучить ассемблер.. смелости не хватает

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

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

IMG_20220908_104733.jpg (2377 просмотров) <a class='original' href='./download/file.php?id=204800&mode=view' target=_blank>Загрузить оригинал (412.51 КБ)</a>

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

Добавлено: 08 сен 2022, 15:30
D.L.
Видимо нехватка stm32 сказывается, месе вон тоже на другую фпга пришлось перейти.

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

Добавлено: 11 сен 2022, 08:47
AndreyFly
Как получить прошивку для NVEM V2? Чип STM32F207.

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

Добавлено: 11 сен 2022, 10:55
MX_Master
AndreyFly писал(а): 11 сен 2022, 08:47 Как получить прошивку для NVEM V2? Чип STM32F207.
viewtopic.php?f=163&t=33843, и где-то через "недельку" будет версия с энкодерами

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

Добавлено: 01 окт 2022, 12:29
MX_Master
Вместе с другими разработчиками и участниками форума LinuxCNC пытаемся найти подходящее решение для прошивки новых контроллеров NVEM/EC300/EC500 (на основе i.MX RT1052). Почитать можно тут - https://forum.linuxcnc.org/18-computer/ ... ?start=500

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

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

ЗЫ как меня заколебали эти готовые устройства.. уже второй проект в мусор уходит

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

Добавлено: 02 окт 2022, 15:17
xenon-alien
MX_Master писал(а): ЗЫ как меня заколебали эти готовые устройства.. уже второй проект в мусор уходит
Для плат меса там тоже какие-то нюансы с чипами и приходится им переделывать плату и разводку под новые чипы, так что ты не один...
Мол цена старого чипа равняется на цену готовой плате в продаже...

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

Добавлено: 06 окт 2022, 11:30
MX_Master
Закругляем проект. Времени потрачено много, результаты в мусор. Все желающие могут на старых контроллерах (с STM32) использовать открытый проект Remora - https://github.com/scottalford75/Remora-NVEM

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

Добавлено: 07 окт 2022, 19:28
antoxa-kylibin
Ожидаемо......

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

Добавлено: 08 окт 2022, 06:44
AAN
У всех разрабов с STM беда приключилась - были мощные недорогие МК с множеством функций. Были, да сплыли. На поделиях этой фирмы можно поставить крест и солью посыпать...

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

Добавлено: 08 окт 2022, 12:20
MX_Master
Интересно, что другие производители, такие как NXP, не сильно пострадали в период дефицита чипов. Непонятно только, почему китайцы на отечественные чипы не перешли в своих новых контроллерах. Это было бы логичнее и перспективнее. Видимо, свои чипы всё ещё недостаточно хороши в плане документации и средств разработки.

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

Добавлено: 08 окт 2022, 19:34
sidor094
А что,разве stm китайцы уже не продают? У меня тоже проект на плате с stm32f764.Вроде видел на али в продаже.

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

Добавлено: 08 окт 2022, 20:10
MX_Master
Макетки и небольшое кол-во с рук продавалось и раньше. Сейчас тоже есть. Но для производства устройств нужно закупать целые партии чипов. А партию так просто не купить. Надо в очереди стоять и брать очень много. Мелкосейрийка не может себе такое позволить.

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

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