Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Обработка инкрементального энкодера
Форум разработчиков электроники ELECTRONIX.ru > Силовая Электроника - Power Electronics > Электрические машины, Электропривод и Управление
PhX
Мат. часть: Вал шагового двигателя соединен с оптическим инкрементальным энкодером посредством эластичной трубки. Двигатель работает на холостом ходусо скоростью 2 об/мин.
Энкодер обрабатывается atmegoй следующим образом:
Сигнал с канала A вызывает прерывание INT1. В зависимости от сигнала на ножке PC1 инкрементируется или декрементируется переменная pulses
Код
/* Внешнее прерывание INT1 (счетчик импульсов энкодера) */
// На вход INT1 приходят импульсы от выхода A энкодера
// На вход PC1 приходят импульсы от выхода B энкодера
ISR(INT1_vect)
{
  if (PINC & 0x02) pulses++; else pulses--;
}

Точность ужасная. Погрешность видимо связана с высокочастотным дребезгом вала при завершении шага. Кто что может посоветывать по этому поводу?
haker_fox
Цитата(PhX @ Nov 17 2008, 17:15) *
Мат. часть: Вал шагового двигателя соединен с оптическим инкрементальным энкодером посредством эластичной трубки. Двигатель работает на холостом ходусо скоростью 2 об/мин.
Энкодер обрабатывается atmegoй следующим образом:
Сигнал с канала A вызывает прерывание INT1. В зависимости от сигнала на ножке PC1 инкрементируется или декрементируется переменная pulses
Код
/* Внешнее прерывание INT1 (счетчик импульсов энкодера) */
// На вход INT1 приходят импульсы от выхода A энкодера
// На вход PC1 приходят импульсы от выхода B энкодера
ISR(INT1_vect)
{
  if (PINC & 0x02) pulses++; else pulses--;
}

Точность ужасная. Погрешность видимо связана с высокочастотным дребезгом вала при завершении шага. Кто что может посоветывать по этому поводу?

Гм, а коим образом происходит расшифровка импульсов с двух каналов? Что-то программный код очень простой. Сигналы с каналов A и B сдвинуты на 90 градусов друг относительно друга. И нужно реагировать на изменения состояния в любой фазе! Т.е. прерываний только от канала A недостаточно. Могу порекомендовать схематехническое решение в этом посту (№99). Но все равно нужно два прерывания (или два таймера), зато вся обработка сведется к действительно инкременту/декременту переменной pulses.
PhX
Цитата(haker_fox @ Nov 17 2008, 13:43) *
Гм, а коим образом происходит расшифровка импульсов с двух каналов?

Штука вся в том, что прерывание происходит по нарастающему фронту, а так как имульсы энкодеровые сдвинуты на 90 град, то на ножке PC1 будет 1 или 0 в зав. от направления вращения. Пальцами крутишь работает нормально.
Спасибо за схемку попробуем поиграться с триггерами.
haker_fox
Цитата(PhX @ Nov 17 2008, 17:50) *
Штука вся в том, что прерывание происходит по нарастающему фронту, а так как имульсы энкодеровые сдвинуты на 90 град, то на ножке PC1 будет 1 или 0 в зав. от направления вращения. Пальцами крутишь работает нормально.
Спасибо за схемку попробуем поиграться с триггерами.

ну направление отследить да, можно. Но как померить координату, что-то не могу сообразить. При обработке только одной фазы, не выходит( Может быть плохо соображаю? sad.gif
PhX
Цитата(haker_fox @ Nov 17 2008, 14:08) *
ну направление отследить да, можно. Но как померить координату, что-то не могу сообразить. При обработке только одной фазы, не выходит( Может быть плохо соображаю? sad.gif

Да почему одной-то??? прерывания по наростающему фронту с канала А.
На ножку PC1 приходят импульсы с канала B.
Энкодер один выводов у него 4:
1 +5
2 А
3 В
4 GND
Adviser
Цитата(PhX @ Nov 17 2008, 12:50) *
Спасибо за схемку попробуем поиграться с триггерами.

Схема достаточно классическая, так что если лишние корпуса приемлимы, то все должно работать.
Привод
_Pasha
Цитата(PhX @ Nov 17 2008, 13:15) *
Точность ужасная. Погрешность видимо связана с высокочастотным дребезгом вала при завершении шага. Кто что может посоветывать по этому поводу?

Вы точно, плз, скажите, это дребезг или оно проЁ пропускает импульсы ?
Поставьте RC цепи по входам 100 Ом 1нФ
PhX
Цитата(_Pasha @ Nov 17 2008, 15:22) *
Вы точно, плз, скажите, это дребезг или оно проЁ пропускает импульсы ?
Поставьте RC цепи по входам 100 Ом 1нФ

Пальцами вращается нормально. Считает как в плюс так и в минус. Так что видимо не
Цитата
проЁ
. Да, можно и с фильтрами НЧ поиграться.
evgeny_ch
Цитата(PhX @ Nov 17 2008, 13:15) *
Мат. часть: Вал шагового двигателя соединен с оптическим инкрементальным энкодером посредством эластичной трубки.
...

Ужос.
У вас нет жесткой связи между энкодером и двигателем.
Нужна правильная муфта либо сильфон.
PhX
Цитата(evgeny_ch @ Nov 17 2008, 15:40) *
Ужос.
У вас нет жесткой связи между энкодером и двигателем.
Нужна правильная муфта либо сильфон.

Абсолютно согласен.
Ну нету... crying.gif
Vokchap
Обработку на логике ИМХО сделать удобнее всего, если она уже стоит на борту. Не тратятся ресурсы микроконтроллера на такую пустяшную вещь. Я вот так всегда делаю. Даже на механических энкодерах работает безотказно. На выходе готовые сигналы: на прерывание и на знак.
Нажмите для просмотра прикрепленного файла
PhX
Цитата(Vokchap @ Nov 17 2008, 15:59) *
Обработку на логике ИМХО сделать удобнее всего, если она уже стоит на борту. Не тратятся ресурсы микроконтроллера на такую пустяшную вещь. Я вот так всегда делаю. Даже на механических энкодерах работает безотказно. На выходе готовые сигналы: на прерывание и на знак.
Нажмите для просмотра прикрепленного файла

Что-то смысла не улавливаю... С энкодера итак идет сигнал прерывания и знака (см. обработчик в 1м посте). Только вот дребезг устранить нужно. Зачем схему-то городить?
Вот у техасовских дсп на борту обработчик инкрементального энкодера есть - конфетка. Работает как счетчик, причем считает по каждому фронту каждого канала. Получается энкодер 250 имп./об имеет разрешающую способность как 1000 имп./об.
evgeny_ch
Цитата(PhX @ Nov 17 2008, 15:56) *
Абсолютно согласен.
Ну нету... crying.gif

Дело в том, что в пределах шага ротор двигателя колеблется, даже
после снятия управляющего воздействия, что приводит к неправильной
работе ОС по положению. В таких сл. помогает тактирование по фронтам
сигналов син. и кос. более высокой синхрочастотой, а также демпфирование
колебаний самого двигателя.
Vokchap
Цитата(PhX @ Nov 17 2008, 15:51) *
Что-то смысла не улавливаю... С энкодера итак идет сигнал прерывания и знака (см. обработчик в 1м посте). Только вот дребезг устранить нужно. Зачем схему-то городить?

Для того и городить, чтобы дребезг устранить. На выходе логики сигналы чистые, готовые для инк./дек. счетчика без доп. обработки контроллером на устранение дребезга.

Цитата(PhX @ Nov 17 2008, 15:51) *
Вот у техасовских дсп на борту обработчик инкрементального энкодера есть - конфетка. Работает как счетчик, причем считает по каждому фронту каждого канала. Получается энкодер 250 имп./об имеет разрешающую способность как 1000 имп./об.

Так вариант сделать тоже самое на МК не сложно, если ресурсов хватает....
haker_fox
Цитата(PhX @ Nov 17 2008, 18:14) *
Да почему одной-то??? прерывания по наростающему фронту с канала А.
На ножку PC1 приходят импульсы с канала B.
Энкодер один выводов у него 4:
1 +5
2 А
3 В
4 GND

Все понял! Спасибо за объяснение! Просто я хотел сказать, что мы не заметим промежуточных состояний энкодера: например, энкодер с 45 "лепестками" на диске, даст 45 импульсов на один оборот вала, а если отслеживать все изменения (изменение в каждой фазе), то получим 4 * 45 = 180 имп/оборот вала. Вот об этих "дополнительных" импульсах речь и шла.
PhX
Цитата(haker_fox @ Nov 18 2008, 07:27) *
Все понял! Спасибо за объяснение! Просто я хотел сказать, что мы не заметим промежуточных состояний энкодера: например, энкодер с 45 "лепестками" на диске, даст 45 импульсов на один оборот вала, а если отслеживать все изменения (изменение в каждой фазе), то получим 4 * 45 = 180 имп/оборот вала. Вот об этих "дополнительных" импульсах речь и шла.

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

p.s. Да, haker_fox, ваша схема также дает разрешение 1x. А зачем подтяжки 2.7К к шине питания?
evgeny_ch
Цитата(PhX @ Nov 18 2008, 08:05) *
Ну для данной задачи мне импульсов энкодера хватит вполне. А вообще в следующий раз буду выбирать МК с соответствующей переферией на борту.

Если есть АЦП, и энкодер синуснокосинусный, можно обрабатывать сразу, без перехода к лог. уровням.
А энкодеры с импульным выходом содержат, как правило, схему обработки и учетверения.
PhX
Цитата(evgeny_ch @ Nov 18 2008, 08:22) *
Если есть АЦП, и энкодер синуснокосинусный, можно обрабатывать сразу, без перехода к лог. уровням.
А энкодеры с импульным выходом содержат, как правило, схему обработки и учетверения.

Евгений, простите, но я не понял, что Вы подразумеваете под "схемой обработки и учетверения". Вы имеете в виду преобразования синуса в прямоугольники?
evgeny_ch
Цитата(PhX @ Nov 18 2008, 08:31) *
Евгений, простите, но я не понял, что Вы подразумеваете под "схемой обработки и учетверения". Вы имеете в виду преобразования синуса в прямоугольники?

Да, ещё есть довольно экзотические схемы, которые обрабатывают аналог, потом цифровые фронты и "0" метку. Дробят период на 2N. Раньше они назывались интерполяторы или похоже.
Исходный сигнал энкодера (от фотоприёмников) аналоговый.
dxp
Цитата(evgeny_ch @ Nov 18 2008, 10:22) *
Если есть АЦП, и энкодер синуснокосинусный, можно обрабатывать сразу, без перехода к лог. уровням.

Только (на сегодняшний день) лучше это не возлагать на МК (даже если он мощный), поручить более специальным микрухам.
haker_fox
Цитата(PhX @ Nov 18 2008, 12:05) *
p.s. Да, haker_fox, ваша схема также дает разрешение 1x.

Да, это так. Но на МК поступает частота в 4 раза меньшая, чем мы снимаем с любой фазы энкодера. В моем случае это было довольно существенно.
Цитата(PhX @ Nov 18 2008, 12:05) *
А зачем подтяжки 2.7К к шине питания?

Ну, наверно, это уже "классика", чтобы входы логики не болтались в воздухе smile.gif
Alex11
Вот еще вариант программной реализации. Код вызывается по таймеру с частотой такой, чтобы каждое состояние энкодера было хотя бы один раз прочитано. В данном случае каналы A и B считываются с младших разрядов порта E.
if((PINE & 0x3) != position)
{ // перемещение ручки
position = PINE & 0x3;
p = PINE & 0x3;
switch(StL)
{
case 0x0: if(p == 0x1) {StL = 0x1;}
else if(p == 0x2) StL = 0x12;
break;
case 0x1: if(p == 0x3) {pntL++; StL = 0x3;}
else if(p == 0x0) StL = 0x10;
break;
case 0x2: if(p == 0x0) {pntL++; StL = 0x0;}
else if(p == 0x3) StL = 0x13;
break;
case 0x3: if(p == 0x2) {StL = 0x2;}
else if(p == 0x1) StL = 0x11;
break;
case 0x10: if(p == 0x2) {StL = 0x12;}
else if(p == 0x1) StL = 0x1;
break;
case 0x11: if(p == 0x0) {pntL--; StL = 0x10;}
else if(p == 0x3) StL = 0x3;
break;
case 0x12: if(p == 0x3) {pntL--; StL = 0x13;}
else if(p == 0x0) StL = 0x0;
break;
case 0x13: if(p == 0x1) {StL = 0x11;}
else if(p == 0x2) StL = 0x2;
break;
default: StL = p;
}
}
dpss
Цитата(dxp @ Nov 18 2008, 08:11) *
Только (на сегодняшний день) лучше это не возлагать на МК (даже если он мощный), поручить более специальным микрухам.

у таких микрух есть ограничение по максимальной частоте выхода 500 - 1000 килогерц. Для энкодеров с большим разрешением будет заметное ограничение по максимальной скорости вращения. Например для 50000 импульсов на оборот скорость меньше 10 оборотов в секунду.
haker_fox
Цитата(dpss @ Nov 19 2008, 01:04) *
у таких микрух есть ограничение по максимальной частоте выхода 500 - 1000 килогерц. Для энкодеров с большим разрешением будет заметное ограничение по максимальной скорости вращения. Например для 50000 импульсов на оборот скорость меньше 10 оборотов в секунду.

ИМХО, это также относится и к предыдущему посту: поллить энкодеры "высокочастотные" энкодеры не есть лучшее занятие, хотя, может быть я и ошибаюсь. Интересно, как в этом случае поведет себя связка ПЛИС + МК? Просто в некотором будущем, возможно, предстоит работать с такими энкодерами. Управлять придется 6 двигателями, на каждом энкодер, ориентировочно 1000 им / об.
evgeny_ch
Цитата
Any sin/cos-encoder, with analog output signals as shown in Figure 1, can be interfaced
to the TMS320F240 DSP controller as shown in Figure 5. Note that the components and
values used are applicable to an incremental encoder with a line count N = 2048 and a
maximum speed of 12000 rpm, hence the maximum frequency is fA,B,max = 410 kHz. The
main aspects of the circuit are discussed below.
TMS320F240 DSP-Solution for High Resolution Position with Sin/Cos Encoders.
Материал десятилетней давности. biggrin.gif
PhX
Добавление НЧ фильтра не помогло. Хотя прямоугольники бегущие с энкодера сгладились по краям ошибка все равно оказывается такой же большой. 07.gif
Подал на двигатель импульсы высокой частоты (2кГц), при этом двигатель жужал, но не вращался. В одном случае переменная pulses иногда оставалость постоянной, а иногда начинала быстро убывать или нарастать.
Такое ощущение, что МК не успевает считать. Надо бы посмотреть продолжительность обработчика прерывания...
Код:
MaslovVG
Цитата(PhX @ Nov 17 2008, 12:15) *
Мат. часть: Вал шагового двигателя соединен с оптическим инкрементальным энкодером посредством эластичной трубки. Двигатель работает на холостом ходусо скоростью 2 об/мин.
Энкодер обрабатывается atmegoй следующим образом:
Сигнал с канала A вызывает прерывание INT1. В зависимости от сигнала на ножке PC1 инкрементируется или декрементируется переменная pulses
Точность ужасная. Погрешность видимо связана с высокочастотным дребезгом вала при завершении шага. Кто что может посоветывать по этому поводу?

У вас ошибка в алгоритме. При наличии импульсов только в канале А (Вибрация на границе сектора) и стабильного уровня на канале В будет счет в одном направлении.
Я, в свое время, Использовал прерывания по обоим фронтам канала А, А лучше по всем четырем Фронтам каналов и А и В одновременно повышается в четыре раза дскретность датчика.
PhX
Цитата(MaslovVG @ Nov 19 2008, 12:18) *
У вас ошибка в алгоритме. При наличии импульсов только в канале А (Вибрация на границе сектора) и стабильного уровня на канале В будет счет в одном направлении.
Я, в свое время, Использовал прерывания по обоим фронтам канала А, А лучше по всем четырем Фронтам каналов и А и В одновременно повышается в четыре раза дскретность датчика.

Вот СПАСИБО!!!! a14.gif beer.gif
Как я сам не допер.
haker_fox
Цитата(PhX @ Nov 19 2008, 17:05) *
Вот СПАСИБО!!!! a14.gif beer.gif
Как я сам не допер.

Да уж) Значит все таки интуитивно мой совет был верным: нужно отслеживать все четыре состояния энкодера))))
Поздравляю с победой!
PhX
Цитата(haker_fox @ Nov 19 2008, 13:13) *
Да уж) Значит все таки интуитивно мой совет был верным: нужно отслеживать все четыре состояния энкодера))))
Поздравляю с победой!

И Вам СПАСИБО! И вообще Всем СПАСИБО!!!
dpss
Цитата(haker_fox @ Nov 19 2008, 06:22) *
ИМХО, это также относится и к предыдущему посту: поллить энкодеры "высокочастотные" энкодеры не есть лучшее занятие, хотя, может быть я и ошибаюсь. Интересно, как в этом случае поведет себя связка ПЛИС + МК? Просто в некотором будущем, возможно, предстоит работать с такими энкодерами. Управлять придется 6 двигателями, на каждом энкодер, ориентировочно 1000 им / об.
Посмотрите в сторону tms320f280x серии. Младшие чипы стоят меньше 200 рублей. На борту имеет 2 четырехквандрантных декодера с 32 разрядными реверсивными счетчиками специально для энкодеров. Если применяются аналоговые синусно-косинусные энкодеры , и нужно получить высокую точность и большую скорость , то можно использовать такую схему: отцифровывать аналоговые сигналы
синус-косинус на встроенном в микроконтроллер относительно медленном ADC и их же ,превратив в четырехквандрантный код , считать на аппаратном счетчике. Данные с ADC можно использовать для точного позиционирования привода в назначенной точке когда скорость близка к нулю.
haker_fox
Цитата(dpss @ Nov 20 2008, 02:12) *
Посмотрите в сторону tms320f280x серии. Младшие чипы стоят меньше 200 рублей. На борту имеет 2 четырехквандрантных декодера с 32 разрядными реверсивными счетчиками специально для энкодеров.

Ага, мне уже раз второй советуют именно эту серию МК! Ну чтож, значит будущее будущих приводов, если таковые придется строить, определено! Спасибо!
Цитата(dpss @ Nov 20 2008, 02:12) *
Данные с 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;
}
PhX
Цитата(haker_fox @ Nov 20 2008, 06:45) *
По началу я не считал эту задачу сложной, но теперь понял, что все не так просто...

Я знаю человека, который на эту тему дисер защитил. biggrin.gif
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;
}
haker_fox
Цитата(PhX @ Nov 20 2008, 12:09) *
Я знаю человека, который на эту тему дисер защитил. biggrin.gif

А я вот с ним не знаком crying.gif
Цитата(PhX @ Nov 20 2008, 12:09) *
Возможно эта статейка Вам поможет www.compumotor.com/whitepages/ServoFundamentals.pdf

Спасибо! Почитаю!
Цитата(PhX @ Nov 20 2008, 12:09) *
эту тему следует вынести в отдельную ветку.

Я тоже так считаю. Новая тема.
arisov
При изготовлении своего варианта сервоконтроллера я использовал следующую схему (рис.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

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

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

..И ещё продолжение.
arisov
Итогов пока я там не заметил, но может плохо искал. biggrin.gif
haker_fox
Цитата(arisov @ Feb 7 2009, 21:00) *
При изготовлении своего варианта сервоконтроллера я использовал следующую схему (рис.1).

Ваша схема мне показалась все таки несколько сложной. Но может быть у нее есть преимущества перед схемами, которые приводились выше? Как Вы считаете? Поверьте, это действительно профессиональный интерес! laughing.gif
_Pasha
Вопрос с подвохом : а всегда ли сигналы с энкодера имеют амплитуду 5 вольт wink.gif Может, надо еще обратить внимание на стандартные входы IEC61131-2 или немножечко их сдвинуть в область 5-вольт ?
arisov
Цитата(haker_fox @ Feb 7 2009, 20:24) *
Ваша схема мне показалась все таки несколько сложной. Но может быть у нее есть преимущества перед схемами, которые приводились выше? …

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

Цитата(_Pasha @ Feb 8 2009, 15:23) *
Вопрос с подвохом : а всегда ли сигналы с энкодера имеют амплитуду 5 вольт wink.gif Может, надо еще обратить внимание на стандартные входы IEC61131-2 или немножечко их сдвинуть в область 5-вольт ?

Всё делается и делалось для конкретного применения (для энкодера с Uпит.=5V) поэтому и такая схема, но для других напряжений ничто не мешает поставить защитный стабилитрон или BAV99 с токоограничивающим резистором.
При описанной выше настройке (еб…) мне так и хотелось «задрать» напряжение сигнальных линий до 24В и поставить оптроны для развязки, тем более входа управления (Step/Dir) уже были так подключены. Но потом получилось с буфером – и я не стал дальше «извращаться».
_Pasha
Цитата(arisov @ Feb 9 2009, 00:50) *
Если Вы имеете ввиду ещё какие то схемы, то дайте пожалуйста непосредственные ссылки.
Оптимистический пример из тупого принтера Epson Stylus Photo R270. Энкодер от 3.3 вольт. RC-цепь 1к+100пФ, подтяжка 6к8 на 3.3вольта. Все! напряжение ШИМ 42 вольта. Помехоустойчивость еще хуже! Но при этом на кабель надет феррит. Попробуйте и Вы ферритовые прибамбасы и/или витые пары проводов. 
arisov
Спасибо, про ферриты как то подзабыл, хотя своё время с помощью них "гасил" помехи от телефона с АОН на радиоприёмник. Но там и частоты были УКВ-FM диапазона. При возможности попробую. И в принтере расстояния маленько не те, что в станках с ЧПУ. Про витую пару вспомнил уже когда всё собрал.
Надо "добавить" всё это в "копилку" рекомендаций по изготовлению сервоконтроллера.
_Pasha
Цитата(arisov @ Feb 9 2009, 14:33) *
Надо "добавить" всё это в "копилку" рекомендаций по изготовлению сервоконтроллера.

Тогда еще кое-что. Можно применять дифференциальные пары приемник/передатчик, такие, как для организации RS-485(422), для передачи сигналов от энкодера к серваку в условиях помех. Даже где-то на форуме обсуждали - не помню ключевых слов для поиска sad.gif
arisov
Да я видел такие схемы на SN75115N, например.
Только сейчас нашёл инфу в ж. Радио №9/98, стр.54, что положительную обратную связь на К561ЛП2 можно подавать только на 2, 5, 9, 12 входа. Так что по схеме на рис.2 это надо учитывать.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.