Перейти к содержанию
    

Кто может разгадать кодировку линейного абсолютного энкодера?

5 минут назад, Vladivolt сказал:

Это так, но сенсор не видит ни бита соседнего кода, но должен декодировать.

В большинстве случаев энкодер не попадает на один 16 битный участок, а перекрывает 2 соседних. При этом он должен четко определить положение или не определить, если предположение о кодировании неверное.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно придумать кодирование с более, чем 7 целыми битами (младшие назову дробными), если не использовать коды с длинными последовательностями нулей (если считать дыру единицей). То есть, добавив 8-й бит, получаем дыру отстоящую одинаково на 8 позиций от ближайших синхродыр. 7 нулей. Такой код не используем. За 127 сразу идёт 129, и дальше ещё столько же. Получаем длину ленты почти в 2 раза больше. Добавляя ещё бит и выбрасывая числа с 6 нулями получим почти в 4 раза более длинную ленту. Так, возможно, и на все 392 м наскребется. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, Plain said:

Ещё немного подумал — 5 старших бит не могут быть все со сдвигом на полбита. Наиболее вероятно, что до 7 значащих бит (12 м) лента кодируется одним типом синхронизации (стробом и 8-ю нулями после него), а 392-метровая другим (двумя стробами с шагом 1,5 бита):

Не, не нужен там никакой дополнительный сдвиг на 0.5 бита.

Есть только 16ти разрядные числа закодированные 16ю отверстиями. 32 оптопары там только для того, чтобы нормально получать 16ти разрядное число когда линейка ровно на полбита сдвинута.

Каждый код вместе с соседним при побитовом сдвиге выдаст 16 различных комбинаций, пока следующий код не встанет в целиком в энкодер. Это минус 4 бита, для кодирования сдвинутых кодов, остаётся как раз 12 значащих бит.

 

для 8ми бит, имеем -3 бита на кодирование 8ми "сдвинутых" комбинаций для каждого кода и остаётся 5 бит для кодирования позиции.

осталось только найти такую последовательность соседей у которой и побитовом сдвиге не повторяются комбинации.

тупо перебором для 8ми бит получается последовательность из 32 кодов

1, 3, 5, 7, 9, 11, 13, 15, 17, 49, 81, 113, 145, 177, 209, 242, 82, 114, 178, 210, 243, 53, 55, 59, 61, 63, 85, 214, 215, 219, 221, 254,

при её побитовом сдвиге через 8ми битное "окно" из оптопар, на них будет последовательность из 255 неповторяющихся значений:

1, 2, 4, 8, 16, 32, 64, 129, 3, 6, 12, 24, 48, 96, 193, 130, 5, 10, 20, 40, 80, 160, 65, 131, 7, 14, 28, 56, 112, 225, 194, 132, 9, 18, 36, 72, 144, 33, 66, 133, 11, 22, 44, 88, 176, 97, 195, 134, 13, 26, 52, 104, 208, 161, 67, 135, 15, 30, 60, 120, 241, 226, 196, 136, 17, 34, 68, 137, 19, 38, 76, 152, 49, 98, 197, 138, 21, 42, 84, 168, 81, 162, 69, 139, 23, 46, 92, 184, 113, 227, 198, 140, 25, 50, 100, 200, 145, 35, 70, 141, 27, 54, 108, 216, 177, 99, 199, 142, 29, 58, 116, 232, 209, 163, 71, 143, 31, 62, 124, 249, 242, 228, 201, 146, 37, 74, 148, 41, 82, 164, 73, 147, 39, 78, 156, 57, 114, 229, 202, 149, 43, 86, 172, 89, 178, 101, 203, 150, 45, 90, 180, 105, 210, 165, 75, 151, 47, 94, 188, 121, 243, 230, 204, 153, 51, 102, 205, 154, 53, 106, 212, 169, 83, 166, 77, 155, 55, 110, 220, 185, 115, 231, 206, 157, 59, 118, 236, 217, 179, 103, 207, 158, 61, 122, 244, 233, 211, 167, 79, 159, 63, 126, 253, 250, 245, 234, 213, 170, 85, 171, 87, 174, 93, 186, 117, 235, 214, 173, 91, 182, 109, 218, 181, 107, 215, 175, 95, 190, 125, 251, 246, 237, 219, 183, 111, 222, 189, 123, 247, 238, 221, 187, 119, 239, 223, 191, 127, 255, 254, 252, 248, 240, 224, 192, 128

 

то есть 16ти отверстий действительно достаточно для кодирования 6mm * 65536 = 96mm * 4096 = 392m

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, gte сказал:

Тип ленты и производитель секрет?

https://www.kuebler.com/en/products/measurement/linear-measuring-systems/shaft-copying-systems

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, _pv said:

то есть 16ти отверстий действительно достаточно для кодирования 6mm * 65536 = 96mm * 4096 = 392m

Точняк.

Задачка была для студента информатики первого курса.
Я правда не уверен что ваши коды правильные поскольку не совпадают с моими, а правильная кодовая последовательность вроде единственная. 
Codes.PNG 

Это так называемые shift sequence коды.
В интернетах источники в качестве изобретателя упоминают некоего исследователя с китайским именем.
И да, формулы нет. Коды находятся рекурентным https://en.wikipedia.org/wiki/Backtracking методом     

.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 minutes ago, AlexandrY said:

Я правда не уверен что ваши коды правильные поскольку не совпадают с моими, а правильная кодовая последовательность вроде единственная.

Если она единственная, у меня для вас плохие новости, потому что тогда у энкодера который вы скопировать пытаетесь она тогда тоже неправильная, хотя и с моей последовательностью совпадает получше :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 минут назад, _pv сказал:

Если она единственная, у меня для вас плохие новости, потому что тогда у энкодера который вы скопировать пытаетесь она тогда тоже неправильная, хотя и с моей последовательностью совпадает получше :)

:biggrin::lol::dance3::clapping:

Это походу спорт такой - с максимальным апломбом себя лицом бросить во всякое неприятное.

В этом ТС однозначно чемпион))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, _pv сказал:

Если она единственная, у меня для вас плохие новости, потому что тогда у энкодера который вы скопировать пытаетесь она тогда тоже неправильная, хотя и с моей последовательностью совпадает получше :)

А с моей совпадает до бита. Фото середины и другого конца ленты все прояснит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, _pv said:

Если она единственная, у меня для вас плохие новости, потому что тогда у энкодера который вы скопировать пытаетесь она тогда тоже неправильная, хотя и с моей последовательностью совпадает получше :)

 

Я привел коды для 8-и битного окна. 
Думал вы тоже для 8-ми битного окна представили.
Для 16-и битного и любого другого будет завтра в виде открытого проекта. :ok:
 

11 minutes ago, gte said:

А с моей совпадает до бита. Фото середины и другого конца ленты все прояснит.

У меня есть только 10 м ленты. Завтра смогу сделать фотографии другого ее конца.
 

Этими дивайсами сейчас модно апгрэйдить лифты, поскольку они заменяют кучу конечников.
Так что теперь все будут знать как на ардуине сделать, то что предлагают за полтыщи евро.  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, AlexandrY сказал:

У меня есть только 10 м ленты. Завтра смогу сделать фотографии другого ее конца.
 

И, если возможно, фото середины.

2 часа назад, AlexandrY сказал:

Этими дивайсами сейчас модно апгрэйдить лифты, поскольку они заменяют кучу конечников.
Так что теперь все будут знать как на ардуине сделать, то что предлагают за полтыщи евро.  

Сколько стоит считыватель и сколько лента и как "ардуина" заменит ленту.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 часов назад, _pv сказал:

тупо перебором для 8ми бит получается

Кажется я прозрел! Перебора никакого не надо!

Комбинация дырок в ленте это банальный LFSR-counter.

Для 8 бит, можете проверить, есть еще и такой вариант

1 , 2 , 4 , 8 , 17 , 35 , 71 , 142 , 28 , 56 , 113 , 226 , 196 , 137 , 18 , 37 , 75 , 151 , 46 , 92 , 184 , 112 , 224 , 192 , 129 , 3 , 6 , 12 , 25 , 50 , 100 , 201 , 146 , 36 , 73 , 147 , 38 , 77 , 155 , 55 , 110 , 220 , 185 , 114 , 228 , 200 , 144 , 32 , 65 , 130 , 5 , 10 , 21 , 43 , 86 , 173 , 91 , 182 , 109 , 218 , 181 , 107 , 214 , 172 , 89 , 178 , 101 , 203 , 150 , 44 , 88 , 176 , 97 , 195 , 135 , 15 , 31 , 62 , 125 , 251 , 246 , 237 , 219 , 183 , 111 , 222 , 189 , 122 , 245 , 235 , 215 , 174 , 93 , 186 , 116 , 232 , 209 , 162 , 68 , 136 , 16 , 33 , 67 , 134 , 13 , 27 , 54 , 108 , 216 , 177 , 99 , 199 , 143 , 30 , 60 , 121 , 243 , 231 , 206 , 156 , 57 , 115 , 230 , 204 , 152 , 49 , 98 , 197 , 139 , 22 , 45 , 90 , 180 , 105 , 210 , 164 , 72 , 145 , 34 , 69 , 138 , 20 , 41 , 82 , 165 , 74 , 149 , 42 , 84 , 169 , 83 , 167 , 78 , 157 , 59 , 119 , 238 , 221 , 187 , 118 , 236 , 217 , 179 , 103 , 207 , 158 , 61 , 123 , 247 , 239 , 223 , 191 , 126 , 253 , 250 , 244 , 233 , 211 , 166 , 76 , 153 , 51 , 102 , 205 , 154 , 53 , 106 , 212 , 168 , 81 , 163 , 70 , 140 , 24 , 48 , 96 , 193 , 131 , 7 , 14 , 29 , 58 , 117 , 234 , 213 , 170 , 85 , 171 , 87 , 175 , 95 , 190 , 124 , 249 , 242 , 229 , 202 , 148 , 40 , 80 , 161 , 66 , 132 , 9 , 19 , 39 , 79 , 159 , 63 , 127 , 255 , 254 , 252 , 248 , 240 , 225 , 194 , 133 , 11 , 23 , 47 , 94 , 188 , 120 , 241 , 227 , 198 , 141 , 26 , 52 , 104 , 208 , 160 , 64 , 128

и еще около 15 вариантов кодирования https://users.ece.cmu.edu/~koopman/lfsr/ , даже больше, т.к. вашего варианта там нет. AlexandrY, вероятно, нашел еще одну комбинацию.

Вот код на VHDL для 8 битного случая, но для 16 бит доработать элементарно. Порождающие полиномы максимальной длины брать из источника выше.

library IEEE;
use IEEE.std_logic_1164.all;

entity lfsr_counter is
    generic (
        N   : integer := 8
    );
    port (
        clk_i   : in  std_logic;
        o_o     : out std_logic_vector(N-1 downto 0)
    );
end entity;

architecture ku of lfsr_counter is
    -- shift register --
    signal r : std_logic_vector(N-1 downto 0) := b"00000001";
    -- polinome --
    type t_pa is array(0 to 15) of std_logic_vector(N-1 downto 0);
    signal p8 : t_pa := (
        "10001110", -- 8E
        "10010101", -- 95
        "10010110", -- 96
        "10100110", -- A6
        "10101111", -- AF
        "10110001", -- B1
        "10110010", -- B2
        "10110100", -- B4
        "10111000", -- B8
        "11000011", -- C3
        "11000110", -- C6
        "11010100", -- D4
        "11100001", -- E1
        "11100111", -- E7
        "11110011", -- F3
        "11111010" -- FA
    );

begin

    process(clk_i)
        variable pn : integer := -1;
        variable feedback : std_logic;
    begin
        if rising_edge(clk_i) then

            if r = "00000001" and pn < 15 then
                pn := pn + 1;
            end if;

            feedback := '0';
            for i in 0 to 7 loop
                if p8(pn)(i) = '1' then
                    feedback := feedback xor r(i);
                else
                    feedback := feedback;
                end if;
            end loop;

            r <= r(r'left-1 downto 0) & feedback;

        end if;
    end process;

    o_o <= r;

end architecture;

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

28 минут назад, Dimidrol сказал:

 

всем казалось, что там простая бинарная последовательность, а на самом деле весьма хаотичная

Я бы предпочёл прямое кодирование — для визуального контроля кем угодно без спецсредств.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Dimidrol said:

Кажется я прозрел! Перебора никакого не надо!

а полиномы максимальной длины каким-то другим образом находятся?

при переборе же значений, следующий подходящий код берется минимальным из возможных, что и даёт для первой четверти последовательности просто нечетные коды 1,3,5,7,9,...

при этом по-вашему получается что для любой разрядности полином с двумя старшими единицами (для последовательности из нечетных чисел в начале) должен быть "максимальным", что выглядит как-то сомнительно.

 

1 hour ago, Dimidrol said:

 AlexandrY, вероятно, нашел еще одну комбинацию.

у него ещё последовательность с 0, а не с 1 как у оригинала начинается.

 

22 minutes ago, Plain said:

Я бы предпочёл прямое кодирование — для визуального контроля кем угодно без спецсредств.

тогда ещё столько же "разрядов" придётся потратить на "синхронизацию".

а так только 4 из 16.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

UPDATE!

Сейчас перепроверил предыдущие варианты _pv и AlexandrY и не могу сопоставить полином для их чисел. (Всего нашел 16 полиномов, путем перебора) Значит ли это, что мой взгляд на эту проблему слишком узок ? Вероятно LFSR это лишь частный способ решения данной задачи.

35 минут назад, _pv сказал:

а полиномы максимальной длины каким-то другим образом находятся?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...