реклама на сайте
подробности

 
 
> Обработка инкрементального энкодера
PhX
сообщение Nov 17 2008, 09:15
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 473
Регистрация: 10-09-06
Из: Тольятти. Самарская обл.
Пользователь №: 20 249



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

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


--------------------
Если все, то не я...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
haker_fox
сообщение Nov 17 2008, 09:43
Сообщение #2


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Цитата(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.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
PhX
сообщение Nov 17 2008, 09:50
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 473
Регистрация: 10-09-06
Из: Тольятти. Самарская обл.
Пользователь №: 20 249



Цитата(haker_fox @ Nov 17 2008, 13:43) *
Гм, а коим образом происходит расшифровка импульсов с двух каналов?

Штука вся в том, что прерывание происходит по нарастающему фронту, а так как имульсы энкодеровые сдвинуты на 90 град, то на ножке PC1 будет 1 или 0 в зав. от направления вращения. Пальцами крутишь работает нормально.
Спасибо за схемку попробуем поиграться с триггерами.


--------------------
Если все, то не я...
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Nov 17 2008, 10:08
Сообщение #4


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



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

ну направление отследить да, можно. Но как померить координату, что-то не могу сообразить. При обработке только одной фазы, не выходит( Может быть плохо соображаю? sad.gif


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
PhX
сообщение Nov 17 2008, 10:14
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 473
Регистрация: 10-09-06
Из: Тольятти. Самарская обл.
Пользователь №: 20 249



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

Да почему одной-то??? прерывания по наростающему фронту с канала А.
На ножку PC1 приходят импульсы с канала B.
Энкодер один выводов у него 4:
1 +5
2 А
3 В
4 GND


--------------------
Если все, то не я...
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Nov 18 2008, 03:27
Сообщение #6


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



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

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


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
PhX
сообщение Nov 18 2008, 04:05
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 473
Регистрация: 10-09-06
Из: Тольятти. Самарская обл.
Пользователь №: 20 249



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

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

p.s. Да, haker_fox, ваша схема также дает разрешение 1x. А зачем подтяжки 2.7К к шине питания?


--------------------
Если все, то не я...
Go to the top of the page
 
+Quote Post
evgeny_ch
сообщение Nov 18 2008, 04:22
Сообщение #8


чукчхэшаражогрмонтажник
*****

Группа: Участник
Сообщений: 1 852
Регистрация: 13-07-07
Из: Minsk
Пользователь №: 29 094



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

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


--------------------
Quo vadis?
Go to the top of the page
 
+Quote Post
dxp
сообщение Nov 18 2008, 05:11
Сообщение #9


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



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

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


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
dpss
сообщение Nov 18 2008, 17:04
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 19-04-08
Из: Москва
Пользователь №: 36 913



Цитата(dxp @ Nov 18 2008, 08:11) *
Только (на сегодняшний день) лучше это не возлагать на МК (даже если он мощный), поручить более специальным микрухам.

у таких микрух есть ограничение по максимальной частоте выхода 500 - 1000 килогерц. Для энкодеров с большим разрешением будет заметное ограничение по максимальной скорости вращения. Например для 50000 импульсов на оборот скорость меньше 10 оборотов в секунду.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Nov 19 2008, 03:22
Сообщение #11


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



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

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


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
dpss
сообщение Nov 19 2008, 18:12
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 19-04-08
Из: Москва
Пользователь №: 36 913



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


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Цитата(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;
}


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
PhX
сообщение Nov 20 2008, 04:09
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 473
Регистрация: 10-09-06
Из: Тольятти. Самарская обл.
Пользователь №: 20 249



Цитата(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;
}


--------------------
Если все, то не я...
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Nov 20 2008, 07:03
Сообщение #15


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Цитата(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) *
эту тему следует вынести в отдельную ветку.

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


--------------------
Выбор.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- PhX   Обработка инкрементального энкодера   Nov 17 2008, 09:15
|||- - PhX   Цитата(evgeny_ch @ Nov 18 2008, 08:22) Ес...   Nov 18 2008, 04:31
||||- - evgeny_ch   Цитата(PhX @ Nov 18 2008, 08:31) Евгений,...   Nov 18 2008, 04:52
||- - haker_fox   Цитата(PhX @ Nov 18 2008, 12:05) p.s. Да,...   Nov 18 2008, 08:45
|- - Adviser   Цитата(PhX @ Nov 17 2008, 12:50) Спасибо ...   Nov 17 2008, 11:01
- - _Pasha   Цитата(PhX @ Nov 17 2008, 13:15) Точность...   Nov 17 2008, 11:22
|- - PhX   Цитата(_Pasha @ Nov 17 2008, 15:22) Вы то...   Nov 17 2008, 11:34
- - evgeny_ch   Цитата(PhX @ Nov 17 2008, 13:15) Мат. час...   Nov 17 2008, 11:40
|- - PhX   Цитата(evgeny_ch @ Nov 17 2008, 15:40) Уж...   Nov 17 2008, 11:56
|- - evgeny_ch   Цитата(PhX @ Nov 17 2008, 15:56) Абсолютн...   Nov 17 2008, 12:57
- - Vokchap   Обработку на логике ИМХО сделать удобнее всего, ес...   Nov 17 2008, 11:59
|- - PhX   Цитата(Vokchap @ Nov 17 2008, 15:59) Обра...   Nov 17 2008, 12:51
|- - Vokchap   Цитата(PhX @ Nov 17 2008, 15:51) Что-то с...   Nov 17 2008, 13:04
- - Alex11   Вот еще вариант программной реализации. Код вызыва...   Nov 18 2008, 11:10
- - evgeny_ch   ЦитатаAny sin/cos-encoder, with analog output sign...   Nov 19 2008, 04:03
- - PhX   Добавление НЧ фильтра не помогло. Хотя прямоугольн...   Nov 19 2008, 04:11
- - MaslovVG   Цитата(PhX @ Nov 17 2008, 12:15) Мат. час...   Nov 19 2008, 08:18
|- - PhX   Цитата(MaslovVG @ Nov 19 2008, 12:18) У в...   Nov 19 2008, 09:05
|- - haker_fox   Цитата(PhX @ Nov 19 2008, 17:05) Вот СПАС...   Nov 19 2008, 09:13
|- - PhX   Цитата(haker_fox @ Nov 19 2008, 13:13) Да...   Nov 19 2008, 09:49
- - arisov   При изготовлении своего варианта сервоконтроллера ...   Feb 7 2009, 13:00
|- - haker_fox   Цитата(arisov @ Feb 7 2009, 21:00) При из...   Feb 7 2009, 17:24
- - blackfin   Может, уже была ссылка на обсуждение, но все же: ....   Feb 7 2009, 13:35
|- - arisov   Итогов пока я там не заметил, но может плохо искал...   Feb 7 2009, 13:55
- - _Pasha   Вопрос с подвохом : а всегда ли сигналы с энкодер...   Feb 8 2009, 12:23
- - arisov   Цитата(haker_fox @ Feb 7 2009, 20:24) Ваш...   Feb 8 2009, 20:50
|- - _Pasha   Цитата(arisov @ Feb 9 2009, 00:50) Если В...   Feb 9 2009, 11:11
- - arisov   Спасибо, про ферриты как то подзабыл, хотя своё вр...   Feb 9 2009, 11:33
|- - _Pasha   Цитата(arisov @ Feb 9 2009, 14:33) Надо ...   Feb 9 2009, 11:41
- - arisov   Да я видел такие схемы на SN75115N, например. Толь...   Feb 9 2009, 11:49


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 02:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.01588 секунд с 7
ELECTRONIX ©2004-2016