|
|
  |
Энкодер и дребезг, нужна помощь |
|
|
|
Apr 12 2007, 17:03
|

Частый гость
 
Группа: Свой
Сообщений: 105
Регистрация: 6-01-06
Пользователь №: 12 901

|
Цитата(BigCoster @ Apr 12 2007, 17:13)  Алгоритм такой: НАСТРОЙКА -нажимаем кнопку-едем едем сколько надо -нажимаем кнопку-сохраняем и так необходимое кол-во раз РАБОТА -едим, сколько сохранили -проехали, остановились, постояли некоторое время и так столько, сколько раз сохраняли потом тоже самое в обратную сторону То есть, фактически Вы реализуете шаговый двигатель, где величина шага (минимального) равна угловому перемещению вала двигателя между соседними "прорезями" крыльчатки. Если это так, то Вам необходимо в начале добиться работы программы - "сделать шаг". Я бы делал это через работу прерывания INT (оно "есть" и в 51х и в AVR). Алгоритм программы шага такой (!!!в одну сторону): Код 1. Пуск двигателя. 2. Ожидание прерывания INT 3. При "наступлении" INT: a)STOP двигатель b)увеличение (уменьшение) счетчика "положения" 4.конец При движении в обе стороны данного алгоритма не достаточно. Так как, при смене направления движения будет возникать ошибка углового перемещения, равная толщине прорези в крылчатке. Правда эту ошибку легко компенсировать. Или алгоритмически (переключая режим срабатывания INT по фронту или по спаду), или используя попровочный коэффициент, пропорциональный толщине прорези. Если частота работы МП достаточна, то можно "заменить" прерывание опросом вывода МП.
Сообщение отредактировал Stas633 - Apr 12 2007, 17:05
|
|
|
|
|
Apr 12 2007, 17:13
|

Местный
  
Группа: Свой
Сообщений: 240
Регистрация: 23-03-07
Пользователь №: 26 428

|
Цитата(BigCoster @ Apr 12 2007, 21:13)  РАБОТА -едим, сколько сохранили -проехали, остановились, постояли некоторое время и так столько, сколько раз сохраняли потом тоже самое в обратную сторону Чтоб энкодер был реверсивный, нужно два датчика, смещенные на полшага. Иначе ошибка на смене направления обеспечена, да и с двумя датчиками можно считать туда-сюда, определяя направление вращения. Так устроены фирменные энкодеры.
|
|
|
|
|
Apr 12 2007, 18:14
|

Частый гость
 
Группа: Свой
Сообщений: 105
Регистрация: 6-01-06
Пользователь №: 12 901

|
Цитата(Visor @ Apr 12 2007, 18:13)  Чтоб энкодер был реверсивный, нужно два датчика, смещенные на полшага. Иначе ошибка на смене направления обеспечена, да и с двумя датчиками можно считать туда-сюда, определяя направление вращения. Так устроены фирменные энкодеры. Внимание OFFTOP!Не согласен. Для обеспечения "правильного" (без ошибок) счета достаточно одного датчика. Возникающая ошибка исправляется программно. Но вот направление вращения с одним дадчиком определить НЕ ВОЗМОЖНО! Согласен абсолютно!
|
|
|
|
|
Apr 12 2007, 19:08
|

Местный
  
Группа: Свой
Сообщений: 240
Регистрация: 23-03-07
Пользователь №: 26 428

|
Цитата(Stas633 @ Apr 12 2007, 23:14)  Внимание OFFTOP! Не согласен. Для обеспечения "правильного" (без ошибок) счета достаточно одного датчика. Возникающая ошибка исправляется программно. Был неправ, вспылил  , на самом деле минимальная ошибка энкодера и есть ширина зуба, и никак её не скомпенсируешь. А вообще я имел ввиду энкодер, как аппаратное устройство дающее полностью достоверные показания. Именно такие используют в промышленности. Кстати, с двумя датчиками можно увеличить кратность счёта в 2 либо 4 раза, считая фронты, ну или уменьшить соответственно число зубьев диска.
Сообщение отредактировал Visor - Apr 12 2007, 19:45
|
|
|
|
|
Apr 12 2007, 23:03
|
Местный
  
Группа: Свой
Сообщений: 278
Регистрация: 18-01-05
Из: Санкт-Петербург
Пользователь №: 2 031

|
Цитата Вот осцилограмма работы датчика ........ Из нее видно, что частота около 70Гц, Цитата В прерывании по таймеру обрабатывается вся индикация, а не по одному знаку в каждом прерывании. Видим, что частота 40Гц Конечно импульсы будут пропускаться. Чтобы не пропускались надо частоту прерываний по таймеру увеличить как минимум до 2*70Гц, а более правильно до 2*макс.частота_срабатывания_оптрона. Цитата Убрал ёмкость ...... Ошибка увеличилась почти на целый оборот вала двигателя Можете пояснить каким образом вы считаете импульсы? По переднему, по заднему, по обоим фронтам или просто по уровню?
|
|
|
|
|
Apr 13 2007, 10:23
|

Участник

Группа: Свой
Сообщений: 71
Регистрация: 9-03-07
Из: г. Днепропетровск
Пользователь №: 26 009

|
Цитата(_Sam_ @ Apr 12 2007, 23:03)  Конечно импульсы будут пропускаться. Чтобы не пропускались надо частоту прерываний по таймеру увеличить как минимум до 2*70Гц, а более правильно до 2*макс.частота_срабатывания_оптрона. Можете пояснить каким образом вы считаете импульсы? По переднему, по заднему, по обоим фронтам или просто по уровню? Дело в том что импульсы от датчика считает счётчик Т1, я спрашиваю: "можно ли избавится от дребезга при таком включении ?" Прерывание INT1 занято датчиком конечной точки перемещения, INT0 датчиком тока Вот кусок программы настройки таймеров, прерывания пока выключены, счётчик и таймер включается позже: Код mov ie,#0 ;выключить все прерывания mov tmod,#01010000b ;задать тип счётчиков ;|||||||| ;||||||++-Перевести таймер T0 в 13-разрядный режим ;|||||+---Синхронизироваться от внутреннего генератора ;||||+----Запретить управление таймером от ножки INT0 ;|||| ;|||| ;||++-----Перевести таймер T1 в 16-разрядный режим ;|+-------Синхронизироваться от внешних сигналов ;+--------Запретить управление таймером от ножки INT1
clr et0 ;Прерывание от таймера T0 (1-разрешено, 0-запрещено) clr et1 ;Прерывание от счетчика T1 (1-разрешено, 0-запрещено)
clr ex0 ;Прерывание от INT0 (1-разрешено, 0-запрещено) clr ex1 ;Прерывание от INT1 (1-разрешено, 0-запрещено)
clr pt0 ;Бит приоритета таймера T0 (0-низкий, 1-высокий) setb pt1 ;Бит приоритета счетчика T1 (0-низкий, 1-высокий)
clr tr0 ;stop таймера T0 clr tr1 ;stop счетчика T1 clr ea ;=1, все прерывания разрешены setb ea ;разрешить прерывания от всех источников Можно ли управлять срабатыванием счётчика по срезу или по уровню? это из какой то книжки: В режиме счетчика содержимое соответствующего таймера/счетчика инкрементируется под воздействием перехода из 1 в 0 внешнего входного сигнала. (т.е. по спаду ?) На распознавание периода требуются два машинных цикла, максимальная частота подсчета входных сигналов равна 1/24 частоты резонатора. (уменя резонатор 6МГц значит max частота подсчёта 250кГц ) На длительность периода входных сигналов ограничений сверху нет.
|
|
|
|
|
Apr 13 2007, 10:36
|

Частый гость
 
Группа: Свой
Сообщений: 105
Регистрация: 6-01-06
Пользователь №: 12 901

|
Цитата(Visor @ Apr 12 2007, 20:08)  ....на самом деле минимальная ошибка энкодера и есть ширина зуба, и никак её не скомпенсируешь. А вообще я имел ввиду энкодер, как аппаратное устройство дающее полностью достоверные показания. Именно такие используют в промышленности... В соответствии с заданной автором темой (вопросом) необходимо помочь найти ошибку в работе устройства. Устройство состоит из датчика углового перемещения, на основе ОДНОЙ оптопары. При этом система не "следящая" и алгоритм работы такой: задал координату -> включил двигатель -> при достижении коорд., останов. (ветвление алгоритма на определение направления вращения двигателя не привожу сознательно)... Это, так сказать "условие задачи", которую нужно решить. Согласен с Вами, что схемо-техническая переделка устройства повысит точность работы устройства. Но согласитесь и Вы со мной, в том что переписать программу проще чем заниматься "слесарщиной" и все равно переписывать программу. Судя по вопросам-ответам автора точность устройства с одним датчиком его устраивает. Если "обращаться" к промышленным изделиям, то это например датчик углового перемещения для станков с ЧПУ (по-моему ВМ175 он "называется") обеспечивает от 2500 до 10000 импульсов на оборот, состоит из 15 (по-моему) оптопар, требует внешних импульсов синхронизации, да и "крыльчатка" там выполнена в виде прозрачного диска с нанесенными рисками (если я ошибся -поправьте). Я считаю, что применение энкодера ТАКОГО (или подобного) уровня должно быть чем-то обосновано. Не согласен с Вами в том, что минимальная ошибка энкодера - это ширина зуба. На мой взгляд, минимальная ошибка обусловлена скоростью "реакции" системы на возниктовение события "фронт/спад". А ширина зуба может быть "компесирована" (исправлена ) программно (алгоритмически). Цитата Dog Pawlowa: Если можно, более подробно. Какая ошибка исправляется программно? В связи с тем, что задание направления вращени является первоочередным (см.посты автора темы о алгоритме работы ус-ва) компенсировать ошибку "зуба" возможно переключением работы INT с "по фронту" (при вращении в "прямом" направлении) на "по спаду" (при вращении в "обратном" направлении. Что меня огорчает больше всего, это то, что все написанное выше в этом посте НИ КАКОЙ полезной информации для автора темы не несет. А со сути является "флудом" и "засоряет" тему.
|
|
|
|
|
Apr 13 2007, 11:32
|
Местный
  
Группа: Свой
Сообщений: 278
Регистрация: 18-01-05
Из: Санкт-Петербург
Пользователь №: 2 031

|
Цитата Дело в том что импульсы от датчика считает счётчик Т1, я спрашиваю: "можно ли избавится от дребезга при таком включении ?" Прерывание INT1 занято датчиком конечной точки перемещения, INT0 датчиком тока Полностью избавиться при таком включении нельзя, но по идее таких больших насчётов быть не должно. Нашёл у вас грубую ошибку: в прерывании t0_overflow вы оперируете со значение счётчика t1, не запрещая прерывания. Допустим выполнилась команда mov a,th1, а в это время пришло пришло прерывание, по которому надо инкрементировать счётчик, тогда mov a,tl1 перешлёт в аккум. младший байт нового значения счётчика. В итоге будем работать с неправильным счётчиком.
|
|
|
|
|
Apr 13 2007, 15:44
|

Участник

Группа: Свой
Сообщений: 71
Регистрация: 9-03-07
Из: г. Днепропетровск
Пользователь №: 26 009

|
Цитата(_Sam_ @ Apr 13 2007, 11:32)  Полностью избавиться при таком включении нельзя, но по идее таких больших насчётов быть не должно. У меня на один оборот 40 импульсов от датчика, сбится можно на один чтобы достигнуть достаточную точность позиционирования Цитата(_Sam_ @ Apr 13 2007, 11:32)  Нашёл у вас грубую ошибку: в прерывании t0_overflow вы оперируете со значение счётчика t1, не запрещая прерывания.
Допустим выполнилась команда mov a,th1, а в это время пришло пришло прерывание, по которому надо инкрементировать счётчик, тогда mov a,tl1 перешлёт в аккум. младший байт нового значения счётчика. В итоге будем работать с неправильным счётчиком. таймер для индикации и не обязательно отображать совершенно точные показания энкодера поправте, если не правильно Вас понял
|
|
|
|
|
Apr 13 2007, 19:14
|

Участник

Группа: Свой
Сообщений: 71
Регистрация: 9-03-07
Из: г. Днепропетровск
Пользователь №: 26 009

|
Цитата(_Sam_ @ Apr 13 2007, 18:27)  Наверное я не так понял программу. А что вы делаете в прерывании t1? Можно код посмотреть? type_count определяет в минус или в плюс считать импульсы в зависимости от задания на двигатель? Если t1 полностью независимый зачем тогда анализирутеся type_count в прерывании t0? В прерывании от t1 делаю паузу перед началом следующего вращения двигателя не знаю как ещё можна реализовать паузу. Если по флагу, в основной программе, то какая разница занята программа этой паузой или она обрабатывается прямо в прерывании. За call не ругайте, мне кажется что так приятнее выглядит программа Вот код: Код ;------------------------------------------------- ;Обслуживание прерывания при переполнении счётчика| ;------------------------------------------------- t1_overflow: clr tr0 ;запретить счёт таймеру clr tr1 ;запретить счёт счётчику mov p0,#0 call stop setb yet setb tr0 ;разрешить счёт таймеру setb tr1 ;разрешить счёт счётчику reti ;FUNCTIONS t1_overflow ;--------------------------- ;Паузa следующим движением| ;--------------------------- stop: call on_all call pause clr yet ret ;sub FUNCTIONS stop ;------------------ ;Изменяющаяся пауза| ;------------------ pause: push 7 push 5 mov r0,pauses mov a,@r0 mov r3,a inc r3 t55: mov r4,#05h t66: mov r5,#0a0h t77: mov r7,#0ffh djnz r7,$ djnz r5,t77 djnz r4,t66 djnz r3,t55 pop 5 pop 7 ret t0 - индикация значений счётчика type_count - инкрементирующий или декрементирующий счёт на индикаторе
Сообщение отредактировал BigCoster - Apr 13 2007, 19:16
|
|
|
|
|
Apr 13 2007, 19:38
|

Местный
  
Группа: Свой
Сообщений: 240
Регистрация: 23-03-07
Пользователь №: 26 428

|
Цитата(Stas633 @ Apr 13 2007, 15:36)  Если "обращаться" к промышленным изделиям, то это например датчик углового перемещения для станков с ЧПУ (по-моему ВМ175 он "называется") обеспечивает от 2500 до 10000 импульсов на оборот, состоит из 15 (по-моему) оптопар, требует внешних импульсов синхронизации, да и "крыльчатка" там выполнена в виде прозрачного диска с нанесенными рисками (если я ошибся -поправьте). Я считаю, что применение энкодера ТАКОГО (или подобного) уровня должно быть чем-то обосновано. Нет, я говорил несколько о других, их сейчас везде применяют где нужно измерение скорости либо позиционирование. Их великое множество типов и номиналов, от различных производителей, самый простой это инкрементальный энкодер, где на измерение угла стоит именно две оптопары и имеется всего 4 сигнальных линии: А, не А и В, не В, если трасса небольшая используется только две, А и В. Цитата(Stas633 @ Apr 13 2007, 15:36)  Не согласен с Вами в том, что минимальная ошибка энкодера - это ширина зуба. Ваше право, но энкодер "не видит" угла между пульсами, и именно по количеству импульсов на оборот выбирается энкодер, чтобы обеспечить требуемую точность. Цитата(Stas633 @ Apr 13 2007, 15:36)  Что меня огорчает больше всего, это то, что все написанное выше в этом посте НИ КАКОЙ полезной информации для автора темы не несет. А со сути является "флудом" и "засоряет" тему. Информация не бывает бесполезной!
Сообщение отредактировал Visor - Apr 13 2007, 19:40
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|