|
Обработка инкрементального энкодера |
|
|
|
Nov 17 2008, 09:15
|

Местный
  
Группа: Свой
Сообщений: 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--; } Точность ужасная. Погрешность видимо связана с высокочастотным дребезгом вала при завершении шага. Кто что может посоветывать по этому поводу?
--------------------
Если все, то не я...
|
|
|
|
|
 |
Ответов
|
Nov 17 2008, 09:43
|

Познающий...
     
Группа: Свой
Сообщений: 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.
--------------------
Выбор.
|
|
|
|
|
Nov 17 2008, 09:50
|

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

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

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

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

Местный
  
Группа: Свой
Сообщений: 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К к шине питания?
--------------------
Если все, то не я...
|
|
|
|
|
Nov 18 2008, 04:22
|

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

|
Цитата(PhX @ Nov 18 2008, 08:05)  Ну для данной задачи мне импульсов энкодера хватит вполне. А вообще в следующий раз буду выбирать МК с соответствующей переферией на борту. Если есть АЦП, и энкодер синуснокосинусный, можно обрабатывать сразу, без перехода к лог. уровням. А энкодеры с импульным выходом содержат, как правило, схему обработки и учетверения.
--------------------
Quo vadis?
|
|
|
|
|
Nov 19 2008, 03:22
|

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

|
Цитата(dpss @ Nov 19 2008, 01:04)  у таких микрух есть ограничение по максимальной частоте выхода 500 - 1000 килогерц. Для энкодеров с большим разрешением будет заметное ограничение по максимальной скорости вращения. Например для 50000 импульсов на оборот скорость меньше 10 оборотов в секунду. ИМХО, это также относится и к предыдущему посту: поллить энкодеры "высокочастотные" энкодеры не есть лучшее занятие, хотя, может быть я и ошибаюсь. Интересно, как в этом случае поведет себя связка ПЛИС + МК? Просто в некотором будущем, возможно, предстоит работать с такими энкодерами. Управлять придется 6 двигателями, на каждом энкодер, ориентировочно 1000 им / об.
--------------------
Выбор.
|
|
|
|
|
Nov 19 2008, 18:12
|

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

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

Познающий...
     
Группа: Свой
Сообщений: 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; }
--------------------
Выбор.
|
|
|
|
|
Nov 20 2008, 04:09
|

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

|
Цитата(haker_fox @ Nov 20 2008, 06:45)  По началу я не считал эту задачу сложной, но теперь понял, что все не так просто... Я знаю человека, который на эту тему дисер защитил. 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; }
--------------------
Если все, то не я...
|
|
|
|
|
Nov 20 2008, 07:03
|

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

|
Цитата(PhX @ Nov 20 2008, 12:09)  Я знаю человека, который на эту тему дисер защитил.  А я вот с ним не знаком Цитата(PhX @ Nov 20 2008, 12:09)  Возможно эта статейка Вам поможет www.compumotor.com/whitepages/ServoFundamentals.pdf Спасибо! Почитаю! Цитата(PhX @ Nov 20 2008, 12:09)  эту тему следует вынести в отдельную ветку. Я тоже так считаю. Новая тема.
--------------------
Выбор.
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|