|
Обработка инкрементального энкодера |
|
|
|
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)  эту тему следует вынести в отдельную ветку. Я тоже так считаю. Новая тема.
--------------------
Выбор.
|
|
|
|
|
Feb 7 2009, 13:00
|
Частый гость
 
Группа: Свой
Сообщений: 157
Регистрация: 17-02-07
Из: Ульяновск
Пользователь №: 25 455

|
При изготовлении своего варианта сервоконтроллера я использовал следующую схему (рис.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 После этого правда меняется кодировка и программе надо это учитывать в программе. Вопросов, у меня нет, это просто так – для общего обозрения. Хотя если есть какие то замечания, с удовольствием «выслушаю».
Эскизы прикрепленных изображений
|
|
|
|
|
Feb 8 2009, 20:50
|
Частый гость
 
Группа: Свой
Сообщений: 157
Регистрация: 17-02-07
Из: Ульяновск
Пользователь №: 25 455

|
Цитата(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 вольт  Может, надо еще обратить внимание на стандартные входы IEC61131-2 или немножечко их сдвинуть в область 5-вольт ? Всё делается и делалось для конкретного применения (для энкодера с Uпит.=5V) поэтому и такая схема, но для других напряжений ничто не мешает поставить защитный стабилитрон или BAV99 с токоограничивающим резистором. При описанной выше настройке (еб…) мне так и хотелось «задрать» напряжение сигнальных линий до 24В и поставить оптроны для развязки, тем более входа управления (Step/Dir) уже были так подключены. Но потом получилось с буфером – и я не стал дальше «извращаться».
Сообщение отредактировал arisov - Feb 8 2009, 20:59
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|