Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 2
  • «
  • 1
  • 2
Модератор форума: demanik, ivan_fd  
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Все опять энкодер (Помогите перевести)
Все опять энкодер
LeXaCH Дата: Ср, 23.01.2013, 18:33  |                                                                                                                Сообщение # 16
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 33
Репутация: 0   ±
Замечания:   ±
На сайте с 05.01.2010

Статус: Offline

ivan_fd, Спасибо все заработало
dimitriy-bc Дата: Пт, 01.03.2013, 16:59  |                                                                                                                Сообщение # 17
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 198
Репутация: 1   ±
Замечания:   ±
На сайте с 19.03.2012

Статус: Offline

Всем доброго времени суток. В одном изделии я поставил самодельный энкодер, который выдавал просто 60 импульсов за оборот. Сейчас у меня появилась необходимость определять направления движения. Переделал энкодер, поставив заводское колесо на 30 импульсов и два фотоприемника. Чтоб не переделывать всю схему, поставил в энкодер пик16ф628а. Его задача: по одному проводу передавать направление движения, а по второму 60 импульсов за оборот. За основу для пик16ф628а, взял программу предложенную ivan_fd. В переделанной программе чтоб убрать дребезг, вложил участок

If  DIRECTION.2 != PORTB.2 Then
    DIRECTION.2 = PORTB.2
    Enc_Data = 0
ElseIf Enc_Data > 1 Then     'после именения направления движения, только со второго перепада
    PORTB.3 = EncData.0   'изменяем состояние счетного выхода.
EndIf

Но у него при смене направления движения теряется первый импульс. Для его восстановления, в приемнике добавил

If PORTD.7 = 1 Then        'определение направления движения
    If PORTD.6 = 1 Then   '
        DIRECTION.2 = 1
    Else
        If DIRECTION.2 = 1 Then
            DIRECTION.2 = 0
                If DIRECTION.0 = 0 Then  Inc EncData    ' компенсация проущенного импуласа пик 16ф628а
            DIRECTION.0 = 1
            Inc EncData
        EndIf
    EndIf
Else
    If PORTD.6 = 1 Then
        DIRECTION.2 = 1
    Else
        If DIRECTION.2 = 1 Then
            DIRECTION.2 = 0
                If DIRECTION.0 = 1 Then  Dec EncData     ' компенсация проущенного импуласа пик 16ф628а
            DIRECTION.0 = 0
            Dec EncData
        EndIf
    EndIf
EndIf

При проверке в железе, небольшая ошибка есть.
Подскажите, что у меня не так. Заранее благодарен.
Прикрепления: ENKODER-874A.rar(118.6 Kb)

Сообщение отредактировал dimitriy-bc - Пт, 01.03.2013, 17:08
dimitriy-bc Дата: Сб, 02.03.2013, 13:32  |                                                                                                                Сообщение # 18
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 198
Репутация: 1   ±
Замечания:   ±
На сайте с 19.03.2012

Статус: Offline

Сделал еще один вариант. На мое видение, ошибка счета исключена. Единственное, что проигрыш дискретности в два раза. На железе смогу проверить только в понедельник.
Может будут замечания или предложения? cry
Прикрепления: ENKODER-874A_N.rar(94.0 Kb)

Сообщение отредактировал dimitriy-bc - Сб, 02.03.2013, 13:40
доцент2 Дата: Сб, 29.08.2020, 15:35  |                                                                                                                Сообщение # 19
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 445
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

Для обработки энкодера использую вот такой блок с прерыванием:
'-------------------------- Прерывания--------------------------
Int_Label:
Context Save  '
T0IF =0       ' сбросить Флаг переполнения TMR0                           
    Inc N        ' приращение ТИКОВ проверки состояния pin подключенных к энкодеру
            If N=1 Then A1=PORTA.2: B1=PORTA.3: A2=A1: B2=B1 ' запоминаем состояние портов при ПЕРВОМ ТИКЕ
             If N=2 Then A2=PORTA.2: B2=PORTA.3              ' читаем сотояние портов и записываем в переменные A2 и B2 при ВТОРОМ ТИКЕ
              If A2=A1 And B2=B1 Then N=1: GoTo EndTMR0      ' если при ПЕРВОМ и ВТОРОМ ТИКЕ состояние портов одинаковое, значит вращение энкодера не было
                     Inc Y                                   ' приращение кол-ва изменений, которые надо пропустить (например, надо считать 1 из 4 изменений на выводах энкодера)
                     If Y!=4 Then N=0: GoTo EndTMR0          ' если недостигнуто заданное кол-во изменений, то пропустить счет перейдя по метке
              '************************* счет положения енкодера **************
                If A1=1 And B1=0 Then
                    If A2=1 And B2=1 Then X=X+1                             
                    If A2=0 And B2=0 Then X=X-1
                EndIf
                    If A1=1 And B1=1 Then
                        If A2=0 And B2=1 Then X=X+1
                        If A2=1 And B2=0 Then X=X-1
                    EndIf
                        If A1=0 And B1=1 Then
                            If A2=0 And B2=0 Then X=X+1
                            If A2=1 And B2=1 Then X=X-1
                        EndIf
                            If A1=0 And B1=0 Then
                                If A2=1 And B2=0 Then X=X+1
                                If A2=0 And B2=1 Then X=X-1
                            EndIf
              '****************************************************************
N=0                                  ' сбрасываем переменную ТИКОВ проверки состояния портов
If Y=4 Then Y=0               ' если достигнуто заданное значение нечитаемых изменений положения вала энкодара, то сбросить переменную счета
EndTMR0:
If X<0 Then X=0          'ограничение
If X>255 Then X=255  'счета от 0 до 255                
GIE = 1                            ' разрешение глобального прерывания                                
Context Restore               ' Возврат из обработчика прерывания

Все работает нормально, но мне нужно ограничить получаемые с энкодера значения:
если достигли нуля, то показывает min=0,
если 255, то показывает max=255.
Пока получается следующее: доходит до 0 продолжаем вращать, все равно получаем 0 - нормально, а вот при вращении в большую сторону значение доходит до 128 и сбрасывается в 0.
Подскажите как корректно поставить ограничения max и min.
ivan_fd Дата: Вс, 30.08.2020, 12:42  |                                                                                                                Сообщение # 20
Группа: Модераторы
Ранг:  Специалист
Сообщений: 1115
Репутация: 103   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Цитата доцент2 ()
а вот при вращении в большую сторону значение доходит до 128 и сбрасывается в 0.


Почему до 128? У вас, что переменная X - знаковая? SBYTE?

Цитата доцент2 ()
Подскажите как корректно поставить ограничения max и min.


Нужно ставить ограничения в после момента инкремента, или декремента.

Например:

Код

  '************************* счет положения енкодера **************
                If A1=1 And B1=0 Then
                    If A2=1 And B2=1 Then X=X+1  
                          if x = 0 then x = 255
                    If A2=0 And B2=0 Then X=X-1
                           if x = 255 then x = 0
                EndIf
                    If A1=1 And B1=1 Then
                        If A2=0 And B2=1 Then X=X+1
                           if x = 0 then x = 255
                        If A2=1 And B2=0 Then X=X-1
                          if x = 255 then x = 0
                    EndIf
                        If A1=0 And B1=1 Then
                            If A2=0 And B2=0 Then X=X+1
                    if x = 0 then x = 255
                            If A2=1 And B2=1 Then X=X-1
                    if x = 255 then x = 0
                        EndIf
                            If A1=0 And B1=0 Then
                    If A2=1 And B2=0 Then X=X+1
                           if x = 0 then x = 255
                    If A2=0 And B2=1 Then X=X-1
                         if x = 255 then x = 0
                            EndIf
              '****************************************************************


Цитата доцент2 ()
If X<0 Then X=0          'ограничение
If X>255 Then X=255  'счета от 0 до 255


Это убрать!


Меня все время преследуют умные мысли...но я быстрее!!!
доцент2 Дата: Вс, 30.08.2020, 19:00  |                                                                                                                Сообщение # 21
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 445
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

Переменная не знаковая Byte. Поэтому мне не совсем понятно почему счет доходит только до 128.
Попробую их Вашего примера. Спасибо.
ЯНДЕКС Дата: 30.08.2020
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Все опять энкодер (Помогите перевести)
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск: