Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 2 из 3«123»
Модератор форума: demanik 
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Энкодер (программа для обслуживания енкодера)
Энкодер
fedonin Дата: Сб, 03.05.2014, 22:55  |                                                                                                                Сообщение # 16
Группа: Пользователи
Ранг:  Новенький
Сообщений: 13
Репутация: 0   ±
Замечания:   ±
На сайте с 08.03.2014

Статус: Offline

Спасибо! Очень интересно, и очень непонятно... Больше не буду цитировать моих друзей, работающих в 1С, хотя и от фанатов Линукса я слышал подобное. У меня другой вопрос - не все же можно сделать через прерывания, да и вариантов (каналов) прерываний немного: от таймера, изменение на старших входах порта В, и вход В0, кроме того, надо принимать во внимание, что программа обработки прерываний должна быть предельна проста, в ней не понаставишь меток и переходов по разным условиям... И еще надо понять от какого источника пришло прерывание, ведь и обработка при этом должна быть разной. Поэтому, мы в основном, все делаем в основном цикле, делим программу на модули, программа "скачет" по ним, проверяя условия запуска того или иного модуля, и если есть условие его запуска, "погружается" в него, внутри его подцикла всегда есть выход в модуль, являющийся ключевым, например модуль обработки кнопки "Стоп". В связи с этим, вопрос - какая у кого методика оценки скорости работы программы? Мы, например, придумали такое изобретение: заводим переменную, размером в бит, засовываем ее в счетчик, инкриминирующий ее значение при каждом проходе цикла, присваиваем ее значение биту в каком-либо выходном порту, на порту получается меандр, остается только встать на этот порт частотомером, либо осциллографом, не забывая при этом полученную частоту умножить на 2. Наверное, есть более изящные методы, может кто поделится?
С Уважением к Форуму, А.Федонин.
ЯНДЕКС Дата: 03.05.2014
terrarus Дата: Вс, 04.05.2014, 17:11  |                                                                                                                Сообщение # 17
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 542
Репутация: 16   ±
Замечания:   ±
На сайте с 21.08.2008

Статус: Offline

"...да и вариантов (каналов) прерываний немного: от таймера, изменение на старших входах порта В, и вход В0 .."
 
Хорошо разобравшись с этим набором прерываний и теми которые дополнительно существуют в PIC16 можно "творить чудеса" Но если вдруг Вам этого не хватит советую обратить внимание на такие микроконтроллеры семейства PIC как PIC18 и PIC24/
Например в PIC18 внешние прерывания можно можно отслеживать входами В0, В1, В2 да и еще использовать так называеммую систему приоритетов прерываний (которая очень поможет "когда нужно понять от какого источника пришло прерывание").
Что касается оценки времени выполнения основного цикла, то мне как-то не совсем понятно для чего это нужно. Я уже давно перешел на 18 серию и использую кварцы 40 мГц и если я чувствую, что цикл основной программы достаточно велик, я строю его таким образом чтобы его минимизировать.
terrarus Дата: Вс, 04.05.2014, 17:14  |                                                                                                                Сообщение # 18
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 542
Репутация: 16   ±
Замечания:   ±
На сайте с 21.08.2008

Статус: Offline


Сообщение отредактировал terrarus - Вс, 04.05.2014, 17:16
fedonin Дата: Вт, 06.05.2014, 00:32  |                                                                                                                Сообщение # 19
Группа: Пользователи
Ранг:  Новенький
Сообщений: 13
Репутация: 0   ±
Замечания:   ±
На сайте с 08.03.2014

Статус: Offline

Добрый вечер, Уважаемый terrarus! Заранее прошу прощения, если Вам надоел... Я попробовал поиграться со счетом по прерываниям, подал сигналы от энкодера на PORTB.0 и PORTB.1, прерывание по B.0 .
INTCON = %10010000, основной модуль начинается с ENABLE кончается DISABLE,
модуль прерывания довольно простой, он вне основного цикла:

INT:
IF PORTB.1 = 1 THEN N = N + 1
IF PORTB.1 = 0 THEN N = N - 1
INTCON.1 = 0
RESUME

Поскольку мы попадаем в этот модуль по B.0, его состояние проверять отдельно не надо. Все работает на макетке, но... только при очень медленном вращении энкодера, а при частоте импульсов больше нескольких десятков герц - пропуски счета. И я выяснил, в чем причина, но устранить ее не могу. Это DEFINE LCD_DATAUS 50 - задержка посылки данных на LCD. Если не обращаться к дисплейчику в цикле, а завести обращение на кнопку, либо по прекращению движения, то все нормально. Получается, что контроллер не может прервать собственную паузу даже при наличии прерывания. Интересно, а 18 серия может?  Мой "измеритель" скорости работы программы показывает, что цикл с 10 метками и проверками IF... GOTO без обращения к LCD крутится со скоростью ~ 100кгц, а при одиночном за цикл обращении к LCD ~ 91гц. Но главное, что он не может прервать работу с LCD, как я понимаю...
PS: В Вашем примере в посте #8, тоже в главном цикле экранчик, неужели он Вам не мешал считать риски?
С Уважением, А. Федонин.

Сообщение отредактировал fedonin - Вт, 06.05.2014, 06:59
terrarus Дата: Вт, 06.05.2014, 11:49  |                                                                                                                Сообщение # 20
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 542
Репутация: 16   ±
Замечания:   ±
На сайте с 21.08.2008

Статус: Offline

Я с таким не сталкивался. Выложите пож. весь код вашей игрушки. Я посмотрю. тогда может быть сделаю какие-то выводы.

У меня на нескольких станках сделаны четырех-канальные измерительные системы на энкодерах и магнитных линейках GEMAC  с датчиками серии GC-MK , которые выдают сигнал аналогичный энкодерам. На магнитных линейках получилась измерительная система с точностью 0,04 мм. На некоторых станках применял программируемые энкодеры DFS-60 c 65535 импульсами на оборот, я их программировал и на 65512  импульсов. Таким энкодером я обеспечил точность поворота изделия на 120 позиций    с точностью 2 секунды.

Для токарно-карусельного станка 1540Ф1 я сделал 4-координатную измерительную систему, запрограммировал DFS-60 на 4074 импульса.  и добился точности измерений не хуже 0,01 мм.


 

Сообщение отредактировал terrarus - Вт, 06.05.2014, 12:02
fedonin Дата: Ср, 21.05.2014, 21:00  |                                                                                                                Сообщение # 21
Группа: Пользователи
Ранг:  Новенький
Сообщений: 13
Репутация: 0   ±
Замечания:   ±
На сайте с 08.03.2014

Статус: Offline

Добрый вечер всем! Я кажется, понял некоторые свои ошибки, и решил их не исправлять, а переделать все кординально. Короче, я решил переделать проект на Протоне, там очень много ценных новшеств по отношению к Пик-Бейсику, одни переменные DWord и Float дорогого стоят, плавающая запятая очень ценная вещь, а Context Save/Restore при работе в прерываниях вообще делают обработку двухпотоковой. Позже отпишусь по результату. Всем спасибо, особенно terrarus, Вам!

Добавлено (21.05.2014, 21:00)
---------------------------------------------
Добрый вечер, Уважаемый terrarus! Восхищаюсь Вашим с Хилинским трудом - книгой о Протоне! Огромная моя вам благодарность! Я чуть упростил Ваш код энкодера, работает по-моему нормально, никакой LCD его не тормозит, проверил на железе. Вот что получилось:

'Выходы энкодера подключены к RB0 и RB1

Dim A As Dword 'ПЕРМЕННАЯ ДЛЯ ХРАНЕНИЯ ЗНАЧЕНИЯ ЭНКОДЕРА

OPTION_REG = %01000000 'ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ И ФРОНТ RB0 (ВЫСОКИЙ)

INTCON = %10010000 'РАЗРЕШЕНИЕ ПРЕРЫВАНИЙ

INTCON.1 = 0 'НУЛИРОВАНИЕ ФЛАГА ПРЕРЫВАНИЯ ОТ RB0

A = 0 'НУЛИРОВАНИЕ ПЕРЕМЕННОЙ ЭНКОДЕРА

On_Interrupt GoTo ENCODER ' ПРИ ПОЯВЛЕНИИ ФЛАГА ПРЕРЫВАНИЯ ОТ RB0
'ОБРАБАТЫВАЕМ МОДУЛЬ ЭНКОДЕРА

MAIN: 'НАЧАЛО ОСНОВНОГО ЦИКЛА
Print At 1, 1, Dec6 A 'ОТОБРАЖЕНИЕ РЕЗУЛЬТАТА НА ЭКРАНЕ
GoTo MAIN 'КОНЕЦ ГЛАВНОГО ЦИКЛА

ENCODER: 'ПОПАДАЕМ СЮДА ПО ПРЕРЫВАНИЮ (ВЫСОКОМУ УРОВНЮ НА RB0)
Context Save 'СОХРАНЯЕМ ТЕКУЩЕЕ СОСТОЯНИЕ
If PORTB.1 = 1 Then A = A + 1 'УВЕЛИЧИВАЕМ A ПРИ ВРАЩЕНИИ ВПЕРЕД
If PORTB.1 = 0 Then A = A - 1 'УМЕНЬШАЕМ A ПРИ ВРАЩЕНИИ НАЗАД
INTCON.1 = 0 'СБРАСЫВАЕМ ФЛАГ ПРЕРЫВАНИЯ ОТ RB0 ПОСЛЕ ОБРАБОТКИ
Context Restore 'ВОССТАНАВЛИВАЕМ СОСТОЯНИЕ, БЫВШЕЕ ДО ПРЕРЫВАНИЯ
Enable 'РАЗРЕШАЕМ ОБРАБОТКУ ПРЕРЫВАНИЙ
Resume 'ВОЗВРАЩАЕМСЯ В ТОЧКУ, ГДЕ НАХОДИЛИСЬ ДО ПРЕРЫВАНИЯ
End

Думаю, в таком виде, как пример, это более наглядно, разве что слишком просты комментарии... В целом свой проект пока не доделал, приходится отвлекаться, работа... Заметил интересную особенность HPWM, не зависящую от языка PBP или PROTON; если мы однажды включаем HPWM, то полностью погасить ее не удается ни прекращением условия ее включения, ни переводом соответствующего порта в LOW - на выходе остаются 1-2 процентной скважности импульсы. Одинаково ведут себя в этом смысле и 628А и 876А и 877. Полностью погасить можно, например, такой командой: HPWM 1, 0, 0.
С Уважением, А. Федонин.
PS: Гляньте на досуге мой пример обработки матричной 4х4 клавиатуры - кажется так никто не делал...
 



Сообщение отредактировал fedonin - Пн, 12.05.2014, 19:02
dimitriy-bc Дата: Сб, 10.01.2015, 15:51  |                                                                                                                Сообщение # 22
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 198
Репутация: 1   ±
Замечания:   ±
На сайте с 19.03.2012

Статус: Offline

Всем доброго времени суток. Пришлось приобрести энкодер E40S8-250-6-L-5. Надеюсь, что выходов А и В мне хватит. Но если помехоустойчивость будет недостаточной то как лучше задействовать как прямые так и инверсные выходы?
terrarus Дата: Пн, 12.01.2015, 16:57  |                                                                                                                Сообщение # 23
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 542
Репутация: 16   ±
Замечания:   ±
На сайте с 21.08.2008

Статус: Offline

Если ваш оптический инкрементальный энкодер будет соединяться с МК посредством линий больше 2-3 метров то следует предусмотреть защиту от импульсных помех наводящихся на длинные линии и компенсацию искажений фронтов квадратичных сигналов каналов А и В.
Для борьбы с этим я использую провереные временем приемы:
1. Питаю энкодеры через отдельные гальванически развязывающие DC/DC преобразователи типа PEAK P6AU-0505ELF вход 4,5-5,5В, выход 5В/200 мА, (если допускается питание энкодеров от источника +5В), если же энкодеры питаются от источника +10...30В то использую DC/DC преобразователи PC10U-0512Z вход 4,5-5,5В, выход 12В/86 мА.
2. Развязываю длинные линии при помощи быстродействующих оптронов H11L1. Причем между 4 и 6 ножками устанавливаю резистор 270 Ом, строго по даташиту. Это развязка позволяет микроконтроллеру Pic18F452  по входам RB0, RB1, RB2 в прерываниях считать импульсы от трех энкодеров одновременно с частотой до 100 кГц .
3. Все длинные линии должны быть экранированными (обычно использую гибкую многожильную экранированную витую пару для сетей LAN )
4. На печатной плате все линии +5В обязательно шунтирую конденсаторами 0,068 мФ.


Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
Сообщение отредактировал terrarus - Пн, 12.01.2015, 17:18
terrarus Дата: Пн, 12.01.2015, 17:19  |                                                                                                                Сообщение # 24
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 542
Репутация: 16   ±
Замечания:   ±
На сайте с 21.08.2008

Статус: Offline

Самая длинная линия, которую я использовал, примерно равна 30 метров и работает она отлично.
Чем длиннее линия тем больше помех наводится на неё. Поэтому лучше на длинных линиях использовать
каналы A и НЕА, В и НЕB см. схему в приложенном файле.
Да, забыл! Так как на выходе оптронов происходит инвертирование сигналов это нужно учитывать в программе обработки прерываний.
Прикрепления: 4101711.jpg(132Kb)


Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
Сообщение отредактировал terrarus - Пн, 12.01.2015, 17:23
dimitriy-bc Дата: Пн, 12.01.2015, 22:20  |                                                                                                                Сообщение # 25
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 198
Репутация: 1   ±
Замечания:   ±
На сайте с 19.03.2012

Статус: Offline

terrarus, спасибо. На данный момент ответ более чем исчерпывающий.
Уточните где лучше ставить DC/DC преобразователи, возле энкодеров или на основной плате с учетом падения напряжения?
AndrF Дата: Вт, 13.01.2015, 13:57  |                                                                                                                Сообщение # 26
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 148
Репутация: 3   ±
Замечания:   ±
На сайте с 03.02.2012

Статус: Offline

Возле, конечно. Но тут все зависит от расстояний - на небольших подобным заморачиваться совершенно не нужно.
terrarus Дата: Вт, 13.01.2015, 15:28  |                                                                                                                Сообщение # 27
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 542
Репутация: 16   ±
Замечания:   ±
На сайте с 21.08.2008

Статус: Offline

dimitriy-bc, Я размещаю DC/DC преобразователи на основной плате. На длинных линиях желательно проконтролировать величину питания непосредственно на энкодере. Если оно меньше +4,5В для энкодеров с 5-ти вольтовым питанием, или меньше +10V для энкодеров с питанием 10В...30В, то необходимо увеличить сечение проводников по которым подается питание. Обычно в витой паре 4 проводника я использую для сигналов А и НЕА и В и НЕВ. 2 проводника для +5В и 2 для -5(GND), и обязательно использую экран.

AndrF, "...Возле, конечно. Но тут все зависит от расстояний - на небольших подобным заморачиваться совершенно не нужно."
 Вы сами-то использовали энкодеры с гальванически неразвязанным питанием в условиях цеха, хотя бы небольшого, чтобы делать такие смелые заявления?  
Сомневаюсь я однако!
И сколько по вашему в метрах будет чтобы "...подобным заморачиваться совершенно не нужно."

Лично у меня так не получается. Даже линии по 2-3 метра зачастую приводят к сбоям МК. Вот поэтому реальные сбои и заставили меня разработать меры по борьбе с помехами в условиях реальных цехов. Еще очень хорошо помогают ферритовые кольца надетые на проводники в непосредственной близости от разъемов. 

 Я питаю основную схему с МК с полностью развязанным питанием (обычно использую PPM20-В-0505ZSLF в качестве основного блока питания), а все цепи выходящие за пределы МК развязываю оптронами питаемые от отдельных DC/DC преобразователяй, которые , в свою очередь, питаются от основного БП на  PPM20-В-0505ZSLF.


Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
terrarus Дата: Вт, 13.01.2015, 15:30  |                                                                                                                Сообщение # 28
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 542
Репутация: 16   ±
Замечания:   ±
На сайте с 21.08.2008

Статус: Offline

Вот пример такого схемного решения:
Прикрепления: 4471488.jpg(138Kb)


Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
terrarus Дата: Вт, 13.01.2015, 15:39  |                                                                                                                Сообщение # 29
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 542
Репутация: 16   ±
Замечания:   ±
На сайте с 21.08.2008

Статус: Offline

Вот еще примеры:

И еще:
Прикрепления: 0573644.jpg(129Kb) · 0482940.jpg(124Kb)


Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
AndrF Дата: Вт, 13.01.2015, 16:47  |                                                                                                                Сообщение # 30
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 148
Репутация: 3   ±
Замечания:   ±
На сайте с 03.02.2012

Статус: Offline

Цитата terrarus ()
Вы сами-то использовали энкодеры с гальванически неразвязанным питанием в условиях цеха, хотя бы небольшого, чтобы делать такие смелые заявления?

Да - на трех станках прекрасно работают. Никакой опторазвязкой  я не заморачивался. Разве что на некоторых выходах стоят опторелюшки, но это чисто для удобства - взамен обычных реле или ключей.

Цитата terrarus ()
И сколько по вашему в метрах будет чтобы "...подобным заморачиваться совершенно не нужно."

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

Добавлено (13.01.2015, 16:47)
---------------------------------------------
Цитата terrarus ()
Вот пример такого схемного решения:

Кстати, последнее время я предпочитаю вместо оптронов использовать оптореле...

Сообщение отредактировал AndrF - Вт, 13.01.2015, 16:51
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Энкодер (программа для обслуживания енкодера)
Страница 2 из 3«123»
Поиск: