Для большинства систем с вращательным движением с использованием двигателей и сервомеханизмов критична обратная связь. Эта обратная связь чаще всего имеет форму энкодера. Для многих энкодеров выходной сигнал является «абсолютным», что означает, что точную степень положения можно измерить в любое время, но этот подход имеет недостаток: для этого требуется много датчиков. Эти датчики часто выводят последовательности кода Грея, которые требуют правильного использования некоторых сложных методов преобразования.
Наиболее распространенной формой обратной связи для двигателей и других устройств вращательного движения является энкодер, в котором используются световые (оптические) датчики относительно вращающегося диска с определенными прорезными узорами для предоставления данных об угловом положении. Существуют две основные разновидности энкодеров: инкрементальные и абсолютные. Инкрементальные энкодеры подсчитывают переходы светлой / темной метки, чтобы отслеживать, сколько градусов поворота прошло за данный момент времени.
Другой тип энкодера – это абсолютный тип, и этот тип довольно часто используется, потому что он может измерять те же величины, что и инкрементный тип, но он выполнен с диском, который имеет сложный узор из меток, исходящих из центра. Узор полностью уникален в зависимости от положения вала. Чаще всего они имеют от 256 до 1024 различных уникальных шаблонов, равномерно распределенных по кругу, что указывает на 8-битный или 10-битный выход соответственно.
Количество битов равно количеству датчиков, отслеживающих шаблон, и это количество датчиков может создать трудоемкую задачу для чтения одним процессором. Чтобы свести к минимуму ошибки чтения, обычно диск имеет шаблон, который позволяет изменять показания только одного датчика в любой момент во время вращения диска.
Поскольку сектора шаблона только темные или светлые, это дает двухпозиционный или «двоичный» выход для каждого датчика. В типичных двоичных шаблонах битовая последовательность напрямую соответствует эквивалентному десятичному числу, которое будет увеличиваться на диске от 0 до 256 (или до 1024). Единственная проблема со стандартной двоичной последовательностью состоит в том, что несколько битов изменяются одновременно для многих отсчетов. Каждый раз, когда это происходит, вполне возможно может возникнуть ошибка чтения.
В следующей таблице показано, как часто это происходит.
Как показано в таблице, эта возможная ошибка возникает при каждом втором подсчете, что совершенно неприемлемо.
В качестве примера серьезности этой ошибки представьте себе переход от девятого к десятому шаблону. Четыре датчика сначала покажут 1001, а затем через мгновение выдадут 1010, когда двигатель начнет вращаться. Контроллер будет считывать датчики через регулярные быстрые интервалы, поэтому он, вероятно, может начать считывание, пока шаблон все еще находится на девяти, поэтому первые три датчика могут выдать 1 0 и 0. Затем, непосредственно перед тем, как он считает последний датчик, этапы шаблона до 10 и последний датчик выдаст 0.
Контроллер объединит всю последовательность в 1000. Но похоже, что она просто пошла в обратном направлении, обратно к восьми! На самом деле это не так. С другой стороны, если от одного счета к другому переходит только один бит, контроллер либо увидит изменение и распознает движение, либо не увидит изменения и не распознает, что никакого движения еще не произошло. Код Грея – это систематическая последовательность только одного изменения за раз, но для профессионала, знакомого со стандартным двоичным кодом, этот шаблон кажется чуждым.
Хотя он не соответствует стандартной двоичной форме, вычисление преобразования кода Грея в двоичное можно выполнить довольно просто, и вот несколько примеров в стандартной релейной логике и в структурированном тексте с использованием C++.
Итак, сначала рассмотрим решение с релейной логикой. Чтобы преобразовать биты кода Грея в правильные двоичные биты, каждый датчик кода Грея должен соответствовать логическому значению либо непосредственно от датчика, либо как часть целого числа. Приведенный далее пример написан в программе программирования релейной логики от Automation Direct и предполагает, что «Sensor_1» является младшим значащим битом (LSB), датчиком вдоль внешнего края диска энкодера. Всего имеется восемь датчиков (8-битных).
«Binary_Number: 1» – соответствующий бит целого числа, используемый для хранения стандартного двоичного эквивалента. Для другого программного обеспечения, такого как RSLogix Rockwell, этот целочисленный бит может выглядеть как Binary_Number.0, где Binary_Number – это тег типа INT, начиная с бита 0.
- Линия 1 – для правильного преобразования старшего бита (MSB), которым является Sensor_8, остается прежним
- Линия 2 – для следующего значащего бита используется логическое сравнение «Исключающее ИЛИ» между Sensor_8 и Sensor_7. Оно вернет 0, если значения Sensor_7 и _8 одинаковы, и вернет 1, если значения Sensor_7 и _8 разные
- Линии с 3 по 8 – для каждого оставшегося бита мы продолжаем использовать «Исключающее ИЛИ» между предыдущим битом и следующим значением датчика
Если энкодер 10-битный, будет 10 линий, и в первых двух линиях будут использоваться Sensor_10 и _9, и последовательность будет опускаться до тех пор, пока не будет наконец использован последний датчик.
Все предыдущие логические линии могут быть объединены в один настраиваемый блок инструкций или подпрограмму для упрощения процесса.
Теперь рассмотрим пример кода на C++. Этот пример будет только частичным, поскольку существует большое разнообразие языков, синтаксисов и приложений. Основной задачей остается преобразование показаний восьми датчиков в эквивалентные двоичные числа. Для языков на основе C исключающее ИЛИ (XOR) для создания одного бита будет ! =. MSB совпадает со значением датчика, второй бит – это исключающее ИЛИ двух датчиков, а каждый оставшийся бит – это исключающее ИЛИ предыдущего бита и следующего датчика.
void conversion(){
Binary_Number_8 = Sensor_8;
Binary_Number_7 = Sensor_8 != Sensor_7;
Binary_Number_6 = Binary_Number_7 != Sensor_6;
Binary_Number_5 = Binary_Number_6 != Sensor_5;
Binary_Number_4 = Binary_Number_5 != Sensor_4;
Binary_Number_3 = Binary_Number_4 != Sensor_3;
Binary_Number_2 = Binary_Number_3 != Sensor_2;
Binary_Number_1 = Binary_Number_2 != Sensor_1;
}
Остающийся шаг – преобразовать биты Binary_Number в целое число, соответствующее приложению. Обратите внимание, что для разных языков могут применяться разные процедуры. Этот пример служит только для того, чтобы дать общее представление о том, как может выглядеть процесс преобразования кода Грея.
© digitrode.ru