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

Обработка инкрементального энкодера

ИМХО, это также относится и к предыдущему посту: поллить энкодеры "высокочастотные" энкодеры не есть лучшее занятие, хотя, может быть я и ошибаюсь. Интересно, как в этом случае поведет себя связка ПЛИС + МК? Просто в некотором будущем, возможно, предстоит работать с такими энкодерами. Управлять придется 6 двигателями, на каждом энкодер, ориентировочно 1000 им / об.
Посмотрите в сторону tms320f280x серии. Младшие чипы стоят меньше 200 рублей. На борту имеет 2 четырехквандрантных декодера с 32 разрядными реверсивными счетчиками специально для энкодеров. Если применяются аналоговые синусно-косинусные энкодеры , и нужно получить высокую точность и большую скорость , то можно использовать такую схему: отцифровывать аналоговые сигналы

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

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


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

Посмотрите в сторону tms320f280x серии. Младшие чипы стоят меньше 200 рублей. На борту имеет 2 четырехквандрантных декодера с 32 разрядными реверсивными счетчиками специально для энкодеров.

Ага, мне уже раз второй советуют именно эту серию МК! Ну чтож, значит будущее будущих приводов, если таковые придется строить, определено! Спасибо!

Данные с ADC можно использовать для точного позиционирования привода в назначенной точке когда скорость близка к нулю.

По поводу позиционирования.

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

Застабилизировать скорость, когда вал должен просто вращаться, оказалось делом не сложным. PI регулятор работает.

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

Привожу код, который сможет пояснить суть алгоритма. Но общий принцип такой: берется рассогласованиее по координатам, которое домножается на некоторой коэффициент posTolPGain (пропорциональная часть), получаем скорость, на которой приказываем приводу двигаться. По мере приближения к заданной точке, рассогласование будет уменьшаться, пока не достигнет того минимума, при котором привод останавливается. Остается некоторая ошибка. Эта ошибка (ее величина определяется переменной posTolerance), компенсируется следующей ступенью пропорционального регулятора, у которого коэффициент posTolPGain1, который много больше, чем posTolPGain, в силу малости ошибки. Перввая ступень регулятора работает великолепно, но всегда остается ошибка. Вторая ступень дает колебания. Будут ли они затухающими, или нет, зависит от posTolPGain1, но они есть всегда... Мне не приходит идея, что делать? Использовать еще и интегральную составляющую для устранения ошибки позиционирования? Но это уже будет целых два ПИ-регулятора со своими коэффициентами... многовато их получается... Есть ли какие-нибудь идей у уважаемых профессионалов? Спасибо!

Да, датчик обратной связи - энкодер. Больше ничего нет..., и добалять нельзя. Привода аппаратно готов и какой бы ущербный он не был, придется придумывать, как реализовать позиционирование на энкодере.

uint8_t TServoControl::positionModeProcess(int16_t pos)
{
    int32_t pos_tolerance = pos - getPosition();
    int32_t dp = pos_tolerance;
    if(dp < 0)
        dp*= -1L;
    if(dp > posTolerance)
        {
            int32_t vel = ((pos - getPosition()) * posTolPGain) / 128L;
            if(vel > 0)
                {
                    if(vel > velocityLimit)
                        vel = velocityLimit;
                }
            else
                if(vel < 0)
                    {
                        if(vel < -velocityLimit)
                            vel = -velocityLimit;
                    }
            velocityModeProcess(vel);
        }
    else
        {
            int16_t s_pwm = pos_tolerance * posTolPGain1 / 128L;
            if(s_pwm > 0)
                setServoMode(SERVO_POS_VELOCITY_MODE);
            else
                if(s_pwm < 0)
                    {
                        setServoMode(SERVO_NEG_VELOCITY_MODE);
                        s_pwm*= -1;
                    }
            if(s_pwm > 250L)
                s_pwm = 250;
            if(s_pwm)
                setPWM((uint8_t)s_pwm);
            else
                setServoMode(SERVO_FAST_STOP_MODE);
        }
    return SERVO_OK_RESULT;
}

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


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

По началу я не считал эту задачу сложной, но теперь понял, что все не так просто...

Я знаю человека, который на эту тему дисер защитил. :biggrin:

haker_fox для начала расскажите подробно про мат. часть привода, но, возможно, эту тему следует вынести в отдельную ветку.

Возможно эта статейка Вам поможет www.compumotor.com/whitepages/ServoFundamentals.pdf

Всем хороша 28 серия техасовских дспешек, но вот от 7805 их уже не запитать и 5 проводами на коленке не прошить. А вообще, я гонял ezDSP 2812 и остался очень доволен.

 

p.s. Работающий код обработки энкодера (2х точность) atmega8:

/* Внешнее прерывание INT1 (счетчик импульсов энкодера) */

// На вход INT1 приходят импульсы от выхода A энкодера

// На вход PC1 приходят импульсы от выхода B энкодера

ISR(INT1_vect)

{

if (MCUCR & 0x04)

if (PINC & 0x02) pulses++; else pulses--;

else

if (PINC & 0x02) pulses--; else pulses++;

MCUCR ^= 0x04;

}

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


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

Я знаю человека, который на эту тему дисер защитил. :biggrin:

А я вот с ним не знаком :crying:

Возможно эта статейка Вам поможет www.compumotor.com/whitepages/ServoFundamentals.pdf

Спасибо! Почитаю!

эту тему следует вынести в отдельную ветку.

Я тоже так считаю. Новая тема.

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


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

При изготовлении своего варианта сервоконтроллера я использовал следующую схему (рис.1).

Опрос состояния энкодера (по входам PD4 и PD5) осуществляется по прерываниям от внутреннего компаратора (по любому изменения состояния). На элементах VD2,VD3, R23-R25, R29 и внутреннем компараторе собран эквивалент логического элемента «исключающие ИЛИ». По этой схеме у меня нормально работают 2 сервоконтроллера.

 

 

Скоро буду собирать ещё несколько сервоконтроллеров. Хочу упростить схему (рис.2). Таких раньше нигде не видел, но думаю, что всё будет работать. На DD1.1 и DD1.2 собранны входные формирователи с триггером Шмита, сигнал с DD1.3 идёт на вход прерывания в МК (по любому изменения состояния).

 

Работа обоих схем основа на том, что с энкодера не может быть сигналов перехода с 00 на 11 и с 11 на 00. И совместно с элементом «исключающие ИЛИ» это обеспечивает дополнительную фильтрацию ложных импульсов.

 

А В INT1 PD4

0 0 0 0

0 1 1 1

1 1 0 1

1 0 1 0

 

После этого правда меняется кодировка и программе надо это учитывать в программе.

 

Вопросов, у меня нет, это просто так – для общего обозрения. Хотя если есть какие то замечания, с удовольствием «выслушаю».

post-25455-1234011599_thumb.png

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


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

Может, уже была ссылка на обсуждение, но все же: ...итоги по энкодеру.

 

..И ещё продолжение.

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


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

При изготовлении своего варианта сервоконтроллера я использовал следующую схему (рис.1).

Ваша схема мне показалась все таки несколько сложной. Но может быть у нее есть преимущества перед схемами, которые приводились выше? Как Вы считаете? Поверьте, это действительно профессиональный интерес! :laughing:

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


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

Вопрос с подвохом : а всегда ли сигналы с энкодера имеют амплитуду 5 вольт ;) Может, надо еще обратить внимание на стандартные входы IEC61131-2 или немножечко их сдвинуть в область 5-вольт ?

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


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

Ваша схема мне показалась все таки несколько сложной. Но может быть у нее есть преимущества перед схемами, которые приводились выше? …

Схема (рис.1) получила такой вид в процессе наладки. Сначала обработка сигналов производилась по опросам таймера (12мкс). И в схеме отсутствовали входные резисторы по 1кОм и элементы для «исключающего ИЛИ». Сигналы брал с самодельного энкодера (120имп/об) состоящего только из щелевых оптопар, фототранзистры были «подтянуты» к +5В через резистор = 4,7кОм. С двигателем на 24В всё прекрасно работало. Но как только подключил двигатель на 110В, то вся «красота» нарушилась. Не то, что пропуски, вообще движок не останавливался. По осциллографу были хорошо заметны наводки, провода были не экранированные. Пробовал с экранированными – помех становилось меньше. С уменьшением нагрузочного резисторов до 1кОм, также амплитуда наводок уменьшалось. С экранированным кабелем и резисторами 1кОм уже более-менее стало работать, но временами всё равно были пропуски (то «недоход», то «переход» позиции). На вход «вешал» кондёры – мало, что менялось. Кардинально помогло только расположение буфера с низким выходным сопротивлением (сначала на «запараллеленых» К561ЛА7, затем на CD4093) непосредственно около оптопар. И резисторы на входе на 1кОм поставил для уменьшения входного сопротивления.

Затем «пришла» мысль о «исключающем ИЛИ», а так как новую печ.плату неохота было делать, то решил обойтись «малой кровью» - использовать по возможности имеющиеся детали (внутренний компаратор) + навесной монтаж. Вот поэтому схема на рис.1 получилась немного «избыточной».

Теоретически с таким вариантом быстродействие выше, что потом косвенно подтвердилось во время одного трудно уловимого программного «глюка» (кратко опишу его проявления – во время «сбоя», перехода в ServoError с прошивкой с опросом по таймеру – ошибка рассогласования была около 20-30 тыс. шагов, а с прерываниями по компаратору – несколько миллионов).

Схема на рис.2 должна её полностью заменить с дополнительными преимуществами – меньше деталей, меньше используемых входов МК.

По сравнению с другими (выше) – я только нашёл «кусок» из микрочиповского AN696. На мой взгляд вариант из AN696 менее помехоустойчив, требует два входа прерывания или надо подавать на входа счётчиков-таймеров. У меня только один таймер свободен и я его «берегу» на будущее. Более лучшую помехоустойчивость схемы по рис.2, должны обеспечить триггеры Шмитта с регулируемыми порогами (за счёт их подстройки) по входам и «защита» от ложных переходов на «искл.ИЛИ».

Если Вы имеете ввиду ещё какие то схемы, то дайте пожалуйста непосредственные ссылки.

 

Вопрос с подвохом : а всегда ли сигналы с энкодера имеют амплитуду 5 вольт ;) Может, надо еще обратить внимание на стандартные входы IEC61131-2 или немножечко их сдвинуть в область 5-вольт ?

Всё делается и делалось для конкретного применения (для энкодера с Uпит.=5V) поэтому и такая схема, но для других напряжений ничто не мешает поставить защитный стабилитрон или BAV99 с токоограничивающим резистором.

При описанной выше настройке (еб…) мне так и хотелось «задрать» напряжение сигнальных линий до 24В и поставить оптроны для развязки, тем более входа управления (Step/Dir) уже были так подключены. Но потом получилось с буфером – и я не стал дальше «извращаться».

Изменено пользователем arisov

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


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

Если Вы имеете ввиду ещё какие то схемы, то дайте пожалуйста непосредственные ссылки.
Оптимистический пример из тупого принтера Epson Stylus Photo R270. Энкодер от 3.3 вольт. RC-цепь 1к+100пФ, подтяжка 6к8 на 3.3вольта. Все! напряжение ШИМ 42 вольта. Помехоустойчивость еще хуже! Но при этом на кабель надет феррит. Попробуйте и Вы ферритовые прибамбасы и/или витые пары проводов. 

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


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

Спасибо, про ферриты как то подзабыл, хотя своё время с помощью них "гасил" помехи от телефона с АОН на радиоприёмник. Но там и частоты были УКВ-FM диапазона. При возможности попробую. И в принтере расстояния маленько не те, что в станках с ЧПУ. Про витую пару вспомнил уже когда всё собрал.

Надо "добавить" всё это в "копилку" рекомендаций по изготовлению сервоконтроллера.

Изменено пользователем arisov

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


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

Надо "добавить" всё это в "копилку" рекомендаций по изготовлению сервоконтроллера.

Тогда еще кое-что. Можно применять дифференциальные пары приемник/передатчик, такие, как для организации RS-485(422), для передачи сигналов от энкодера к серваку в условиях помех. Даже где-то на форуме обсуждали - не помню ключевых слов для поиска :(

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


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

Да я видел такие схемы на SN75115N, например.

Только сейчас нашёл инфу в ж. Радио №9/98, стр.54, что положительную обратную связь на К561ЛП2 можно подавать только на 2, 5, 9, 12 входа. Так что по схеме на рис.2 это надо учитывать.

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


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

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

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

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

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

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

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

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

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

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