реклама на сайте
подробности

 
 
5 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Энкодер и дребезг, нужна помощь
BigCoster
сообщение Apr 11 2007, 18:24
Сообщение #1


Участник
*

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



Подскажите, что делать с дребезгом, если датчик положения
(у меня крыльчатка + оптический датчик "на просвет") подключен
к счётчику контроллера. Проблема втом что имеется ошибка которая пстоянно имеет
разное значение. Я так понимаю что програмно тут ни чем не поможешь.
Частота сигнала с датчика около 200 Гц.
пытался делать RC-фильтр но при ёмкости С=1мкФ не помогает, а при 2.2
не работает при номинальных оборотах двигателя.
Я начинающий, сильно не ругайте...

Сообщение отредактировал BigCoster - Apr 11 2007, 18:39
Go to the top of the page
 
+Quote Post
Visor
сообщение Apr 11 2007, 18:44
Сообщение #2


Местный
***

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



Цитата(BigCoster @ Apr 11 2007, 23:24) *
Подскажите, что делать с дребезгом, если датчик положения
(у меня крыльчатка + оптический датчик "на просвет") подключен
к счётчику контроллера. Проблема втом что имеется ошибка которая пстоянно имеет
разное значение.

Ошибка в "плюс" или в "минус"?
Go to the top of the page
 
+Quote Post
BigCoster
сообщение Apr 11 2007, 18:49
Сообщение #3


Участник
*

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



Цитата(Visor @ Apr 11 2007, 18:44) *
Ошибка в "плюс" или в "минус"?


Ошибка в "плюс", поэтому и грешу на дребезг
забыл сказать, энкодер стоит на мотор-редукторе
Go to the top of the page
 
+Quote Post
Visor
сообщение Apr 11 2007, 18:58
Сообщение #4


Местный
***

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



200Гц довольно много. Крыльчатка правильно рассчитана? Фотодатчик имеет достаточное быстродействие?
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 11 2007, 19:21
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Надо посмотреть осциллографом. Тогда будет понятнее.
Go to the top of the page
 
+Quote Post
CD_Eater
сообщение Apr 11 2007, 19:22
Сообщение #6


Частый гость
**

Группа: Новичок
Сообщений: 173
Регистрация: 3-09-04
Из: Moscow
Пользователь №: 595



Цитата
датчик положения (у меня крыльчатка + оптический датчик "на просвет") подключен к счётчику контроллера.
Поясните, что мешает тупо опрашивать обычный цифровой (или аналогово-компараторный) вход и обрабатывать дребезг как обычно? Если Вы подключились к внешнему входу таймера, то там бороться с дребезгом программно невозможно - дребезг обрабатывается аппаратно (внутри чипа) и с несоответствующей данной задаче задержкой (порядка нескольких тактов вместо требуемых нескольких сотен мкс).

Сообщение отредактировал CD_Eater - Apr 11 2007, 19:23
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Apr 11 2007, 22:00
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(BigCoster @ Apr 11 2007, 18:24) *
Подскажите, что делать с дребезгом, если датчик положения
(у меня крыльчатка + оптический датчик "на просвет") подключен
к счётчику контроллера.

Обычно нужно, чтобы на счетный вход поступал практически идеальный сигнал (с крутыми фронтами).
Иначе на пологом фронте возможно срабатывание счетчика несколько раз от незначительных помех.
Простое добавление интегрирующей цепочки не помогает, естественно.
Попробуйте включить триггер Шмитта между интегрирующей цепочкой и счетным входом, или обработать сигнал программно, как Вам советовали выше.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Stas633
сообщение Apr 11 2007, 22:18
Сообщение #8


Частый гость
**

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



Цитата(BigCoster @ Apr 11 2007, 19:24) *
Подскажите, что делать с дребезгом, если датчик положения
(у меня крыльчатка + оптический датчик "на просвет") подключен
к счётчику контроллера. ..

Считаю, что "дребезгом" называют неустойчивое (быстроменяющееся от min до беск.) сопротивление контактной группы при замыкании/размыкании. В случае использования оптического датчика дребезг не возможен по определению.

Если предположить, что ложные срабатывания вызваны датчиком положения, то на мой взляд возможны две причины. Первая, наиболее вероятная - это очень малый (или отсутсвующий вовсе) гистерезис усилителя тока фотоэлемента. Вторая, очень маловероятная - это малый размер отверстий (прорезей) в крыльчатке. Вторая причина может рассамриваться, если размер отверстий сопоставим с "биениями" (дрожанием) крыльчатки, вызванными вращением двигателя.

Также возможно, что ошибка в подсчете импульсов вызвана ошибкой в программе. Опубликуйте программу..
Go to the top of the page
 
+Quote Post
bgc
сообщение Apr 12 2007, 09:49
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 313
Регистрация: 30-07-06
Из: Москва
Пользователь №: 19 188



много раз делал подобные схемы - заводил на вход таймера ( в том числе и квадратичного ) проблем с дребезгом не бывает .
На входе процессора ставил обычно 2н2 (убрать наведенные иголки)
Частоты от 0Гц до 300КГц.
Ищите проблему в другом.
При верхних частотах возникает проблема с подбором оптопары. На таких частотах (время порядка 5мкс) необходим фотодиод с усилителем, а обычные фотоприемники без него. Либо надо брать быстрый с встроенным усилителем (имеющий задержку меньше 1 мкс) либо городить внешний каскад (я бы так делать не стал) что стоит у Вас.


--------------------
Окружающий мир - не иссякающий источник сюрпризов!
Go to the top of the page
 
+Quote Post
BigCoster
сообщение Apr 12 2007, 10:25
Сообщение #10


Участник
*

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



Цитата(Stas633 @ Apr 11 2007, 22:18) *
Считаю, что "дребезгом" называют неустойчивое (быстроменяющееся от min до беск.) сопротивление контактной группы при замыкании/размыкании. В случае использования оптического датчика дребезг не возможен по определению.

Если предположить, что ложные срабатывания вызваны датчиком положения, то на мой взляд возможны две причины. Первая, наиболее вероятная - это очень малый (или отсутсвующий вовсе) гистерезис усилителя тока фотоэлемента. Вторая, очень маловероятная - это малый размер отверстий (прорезей) в крыльчатке. Вторая причина может рассамриваться, если размер отверстий сопоставим с "биениями" (дрожанием) крыльчатки, вызванными вращением двигателя.

Также возможно, что ошибка в подсчете импульсов вызвана ошибкой в программе. Опубликуйте программу..


У меня осцилографом работает звуковая карточка, надеюсь скоро обзавестись настояшим, так что дребезга особо я заметить не могу. sad.gif
Но он проявляется когда крыльчатка останавливается на границе срабатывания оптопары.
Я это вижу на дин. индикации (считает, а двигатель стоит blink.gif )


Цитата(bgc @ Apr 12 2007, 09:49) *
много раз делал подобные схемы - заводил на вход таймера ( в том числе и квадратичного ) проблем с дребезгом не бывает .
На входе процессора ставил обычно 2н2 (убрать наведенные иголки)
Частоты от 0Гц до 300КГц.
Ищите проблему в другом.
При верхних частотах возникает проблема с подбором оптопары. На таких частотах (время порядка 5мкс) необходим фотодиод с усилителем, а обычные фотоприемники без него. Либо надо брать быстрый с встроенным усилителем (имеющий задержку меньше 1 мкс) либо городить внешний каскад (я бы так делать не стал) что стоит у Вас.

Сейчас у меня датчик подключен так:

Прикрепленное изображение
Go to the top of the page
 
+Quote Post
ZAO
сообщение Apr 12 2007, 10:27
Сообщение #11





Группа: Новичок
Сообщений: 8
Регистрация: 17-01-06
Пользователь №: 13 289



Цитата(BigCoster @ Apr 11 2007, 19:24) *
Я так понимаю что програмно тут ни чем не поможешь.
Частота сигнала с датчика около 200 Гц.

Как раз программно эту проблему решить проще всего.
Запустите таймерное прерывание с периодом раза в два меньше минимального периода датчика и опрашивайте в нем сигнал с датчика. Если в последовательных прерываниях считываются разные значения - то это является дребезгом.
Go to the top of the page
 
+Quote Post
BigCoster
сообщение Apr 12 2007, 10:40
Сообщение #12


Участник
*

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



Цитата(ZAO @ Apr 12 2007, 10:27) *
Как раз программно эту проблему решить проще всего.
Запустите таймерное прерывание с периодом раза в два меньше минимального периода датчика и опрашивайте в нем сигнал с датчика. Если в последовательных прерываниях считываются разные значения - то это является дребезгом.


Всего два таймера/счётчика
Одно из прерываний по таймеру занято индикацией, другое паузами при
достижении счетчиком заданого количества тиков.
Go to the top of the page
 
+Quote Post
ZAO
сообщение Apr 12 2007, 10:46
Сообщение #13





Группа: Новичок
Сообщений: 8
Регистрация: 17-01-06
Пользователь №: 13 289



Цитата(BigCoster @ Apr 12 2007, 11:40) *
Всего два таймера/счётчика
Одно из прерываний по таймеру занято индикацией, другое паузами при
достижении счетчиком заданого количества тиков.

А что за индикация используется? Ее можно посадить, допустим, и на прерывание таймера для датчика или использовать в основном цикле программы.
Go to the top of the page
 
+Quote Post
BigCoster
сообщение Apr 12 2007, 11:00
Сообщение #14


Участник
*

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



Цитата(ZAO @ Apr 12 2007, 10:46) *
А что за индикация используется? Ее можно посадить, допустим, и на прерывание таймера для датчика или использовать в основном цикле программы.


Индикация используется вот такая вот:
Прикрепленное изображение

и не знаю как посадить её на прерывание от счётчика
энкодера, потому что при обработке прерывания от счётчика
выполняется пауза (пустой цикл) в этом же прерывании,
а основная программа занята тем что считает сколько было остановок,
в какую сторону крутится двигателю, перемещение по вектору пауз и тд

Сообщение отредактировал BigCoster - Apr 12 2007, 11:01
Go to the top of the page
 
+Quote Post
ZAO
сообщение Apr 12 2007, 11:41
Сообщение #15





Группа: Новичок
Сообщений: 8
Регистрация: 17-01-06
Пользователь №: 13 289



Вы вполне можете завести одно таймерное прерывание, которое будет фильтровать дребезг и обновлять индикаторы. При каждом вызове обрабатывается один из индикаторов и определяется сигнал от датчика.
Если для обновления индикатора период таймера слишком маленький, Вы можете организовать внутри прерывания счетчик, по достижении определенного значения которого и обрабатывать индикатор.
Go to the top of the page
 
+Quote Post
BigCoster
сообщение Apr 12 2007, 11:55
Сообщение #16


Участник
*

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



Цитата(ZAO @ Apr 12 2007, 11:41) *
Вы вполне можете завести одно таймерное прерывание, которое будет фильтровать дребезг и обновлять индикаторы. При каждом вызове обрабатывается один из индикаторов и определяется сигнал от датчика.
Если для обновления индикатора период таймера слишком маленький, Вы можете организовать внутри прерывания счетчик, по достижении определенного значения которого и обрабатывать индикатор.


Тоесть в обработчике прерываний от таймера смотренть состояние датчика,
если оно не изменяется в течение 2-3 прерываний дребезга нет?
Go to the top of the page
 
+Quote Post
ZAO
сообщение Apr 12 2007, 13:05
Сообщение #17





Группа: Новичок
Сообщений: 8
Регистрация: 17-01-06
Пользователь №: 13 289



Цитата(BigCoster @ Apr 12 2007, 12:55) *
Тоесть в обработчике прерываний от таймера смотренть состояние датчика,
если оно не изменяется в течение 2-3 прерываний дребезга нет?

Да.
Только для гарантированной фильтрации дребезга, период прерываний надо подобрать раза в 64 меньше минимального периода изменений датчика. И если в течении 64 прерываний состояние датчика не изменилось, то можно говорить о достоверности состояния. В идеале чем период меньше - тем фильтрация лучше.

Сообщение отредактировал ZAO - Apr 12 2007, 13:05
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Apr 12 2007, 13:28
Сообщение #18


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(BigCoster @ Apr 12 2007, 12:55) *
Тоесть в обработчике прерываний от таймера смотренть состояние датчика,
если оно не изменяется в течение 2-3 прерываний дребезга нет?

Помедитируй на тему машины состояний (состояния можно получать либо опросом по таймеру, либо по прерываниям от смены состояния на входах). У меня такое стабильно работает не то что с оптическим, а с заведомо "трескучим" механическим энкодером.
Go to the top of the page
 
+Quote Post
Stas633
сообщение Apr 12 2007, 13:44
Сообщение #19


Частый гость
**

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



Цитата(BigCoster @ Apr 12 2007, 11:25) *
У меня осцилографом работает звуковая карточка, надеюсь скоро обзавестись настояшим, так что дребезга особо я заметить не могу. sad.gif
Но он проявляется когда крыльчатка останавливается на границе срабатывания оптопары.
Я это вижу на дин. индикации (считает, а двигатель стоит blink.gif )
Сейчас у меня датчик подключен так:

Прикрепленное изображение


Настоятельно рекомендую R2 "разместить" в непосредственной близости от входа МП, и "+5в" "брать" от шины питания МП (от вывода питания МП). Конденсатор или убрать совсем, или емкость снизить с 1мкФ до <1нФ. На мой взгляд, приведенная схема датчика вполне работоспособна, и при условии исправных элементов, "сбоев" давать не должна.

Для того, чтобы исключить программную ошибку попробуйте разделить работу программы на этапы (на время отладки):
1 этап: - посчет импульсов; - индикация НЕ ОТОБРАЖАЕТСЯ;
2 этап: - вывод значения на индикатор; - импульсы не подсчитываются.

Программу подсчета импульсов на время отладки нужно максимально упростить (подсчитал -> вывел). Всяческие ветвления аглоритма убрать! Определение направления, расчет скорости и т.д. не выполнять.

Это позволит Вам выяснить работоспосбность связки датчик<->МП. И только когда удастся добиться устойчивой работы постого алгоритма, можно переходить к усложнению программы.

Re..Опубликуйте программу..
Go to the top of the page
 
+Quote Post
BigCoster
сообщение Apr 12 2007, 14:04
Сообщение #20


Участник
*

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



Вот осцилограмма работы датчика, записанная в SoundForge.
Щуп подключен к ноге контроллера:

Прикрепленное изображение

Из нее видно, что частота около 70Гц, а не 200Гц, как я говорил ранее извините... huh.gif

И ещё осцилограмка обновления индикации.
Щуп к R9 (см. на схемке несколькими постами выше):
Прикрепленное изображение

В прерывании по таймеру обрабатывается вся индикация, а не по одному знаку в каждом прерывании.
Видим, что частота 40Гц (мерцания не видно! blink.gif хотя странно)

Я так понимаю, что метод с подсчётом импульсов в прерывании от таймера для индикации
не подходит (программа не маленькая и на асме, переделывать не очень то и хочется)
Триггер Шмидта???
Go to the top of the page
 
+Quote Post
_artem_
сообщение Apr 12 2007, 14:13
Сообщение #21


учащийся
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249



если есть механичекое дрожение крыльчатки при остановки мотора то дребезг убрать будет трудно . Можно разместить вторую оптопару смешенную относительно первой а импульсы считать так - ждешь первую оптопару , если засветилась то переключаешся на другую и тд при условии что амплитуда нежелательных угловых механичеких дрожений гарантиранно меньше углового расстояния между оптопарами.


--------------------
Зачем лаять на караван , когда на него можно плюнуть?

Go to the top of the page
 
+Quote Post
BigCoster
сообщение Apr 12 2007, 14:29
Сообщение #22


Участник
*

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



Цитата(Stas633 @ Apr 12 2007, 13:44) *
Настоятельно рекомендую R2 "разместить" в непосредственной близости от входа МП, и "+5в" "брать" от шины питания МП (от вывода питания МП). Конденсатор или убрать совсем, или емкость снизить с 1мкФ до <1нФ. На мой взгляд, приведенная схема датчика вполне работоспособна, и при условии исправных элементов, "сбоев" давать не должна.

Re..Опубликуйте программу..


R2 датчика и +5в близко к контроллеру,
он mcs51, программа соответственно...
1.Задание расстояния
Код
;--------------------------
;Настройка позиционирования|
;--------------------------
upr:
    mov th1,#0
    mov tl1,#0
    mov kol_post_down,#0
    mov kol_post_up,#0
    mov addr_length,#0
    setb tr0      ;разрешить счёт таймеру
    setb et0      ;разрешить прерывания от таймера
upr_set:
    jb k_set,upr_menu
upr_set_1:
    clr tr0
    clr tr1
    call time2
    call save_pos
    setb tr0
    setb tr1
upr_menu:
    jb k_menu,upr_plus
pr_menu_1:
    clr tr0
    clr tr1
    clr et0
    clr et1
    call time2
    ret
upr_plus:
    jb k_plus,upr_minus
upr_plus_1:
    call r_up
upr_minus:
    jb k_minus,upr_set
upr_minus_1:
        call l_down
    jmp upr_set
;FUNCTIONS upr_minus
;-------------------------------------------
;Крутит нижний двигатель, увеличивает длину |
;-------------------------------------------
l_down:          ;Крутим (L/DOWN) двигатель
    clr tr1
    clr et0
        clr type_count;инкрементирующий счётчик
        call on_down
        setb et0
        setb tr1
down_m1:
    jnb k_minus,down_m1
;clr tr0
;call time1
;setb tr0
;jnb k_minus,down_m1
    clr tr1
    clr tr0
    call on_all
    setb tr0
    ret
;FUNCTIONS upr_plus
;------------------------------------------
;Крутит верхний двигатель, уменьшает длину |
;------------------------------------------
r_up:           ;Крутим (R/UP) двигатель
    clr tr1
    clr et0
        mov a,th1
        cpl a
        mov th1,a
        mov a,tl1
        cpl a
        mov tl1,a
           setb type_count;декрементирующий счётчик
        call on_up
        setb et0
        setb tr1
up_m1:
    jnb k_plus,up_m1
;clr tr0
;call time1
;setb tr0
;jnb k_plus,up_m1
    clr tr1
    clr tr0
    call on_all
    setb tr0
    ret

2.Прерывания
Код
;************************
;* ОБРАБОТКА ПРЕРЫВАНИЙ *
;************************

;------------------------------------------------
;Обслуживание прерывания при переполнении таймера|
;------------------------------------------------
t0_overflow:
    jb type_count,t0_overflow_1
    call inc_counter
    reti
t0_overflow_1:
    call dec_counter
    reti
;FUNCTIONS t0_overflow
;------------------------
;Инкрементирующий счётчик|
;------------------------
inc_counter:
    clr tr0            ;запретить счёт таймеру
    call inc_bcd
    call bin_to_bcd
    call display
    setb tr0              ;разрешить счёт таймеру
    ret
;sub FUNCTIONS inc_counter
;---------------------------------------------
;Предварительная обработка значений для работы|
;    счётчика в инкрементирующем режиме     |
;---------------------------------------------
inc_bcd:
    mov a,th1
    mov dph,a
    mov a,tl1
    mov dpl,a
    ret
;FUNCTIONS t0_overflow
;------------------------
;Декрементирующий счётчик|
;------------------------
dec_counter:
    clr tr0
    call dec_bcd
    call bin_to_bcd
    call display
    setb tr0
    ret
;sub FUNCTIONS dec_counter
;---------------------------------------------
;Предварительная обработка значений для работы|
;     счётчика/2 в декрементирующем режиме    |
;---------------------------------------------
dec_bcd:
    mov a,th1
    cpl a
    mov dph,a
    mov a,tl1
    cpl a
    mov dpl,a
    ret
;common sub FUNCTIONS dec_counter & inc_counter
;----------------------------------------------------
;Подготовка значений для отображения функцией DISPLAY|
;    во время работы дв.      |
;----------------------------------------------------
bin_to_bcd:
    mov disp0,#2fh                ;устанавливаем
    mov disp1,#30h                ;начальные
    mov disp2,#30h                ;значения
bin_to_bcd_go:
    inc disp0                     ;подсчёт едениц
dec_dptr:
        dec dpl                    ;ументшаем dptr
        mov a,dpl                     ;пока не станет
    cjne a,#0ffh,bin_to_bcd_m1    ;равен 0ffh
    dec dph
bin_to_bcd_m0:
    mov a,disp0
    cjne a,#3ah,bin_to_bcd_go     ;если переполнение едениц
    
    inc disp1                     ;подсчёт десятков
      mov disp0,#30h
      mov a,disp1
      cjne a,#3ah,bin_to_bcd_go     ;если переполнение десятков
      
      inc disp2                     ;подсчёт сотен
      mov disp1,#30h
      mov a,disp2
      cjne a,#3ah,bin_to_bcd_go     ;если переполнение сотен
      
overload_bcd:        ;пишем Е в разряд сотен
      mov disp2,#3eh
      sjmp bin_to_bcd_exit          ;выход, если переполнение сотен
bin_to_bcd_m1:
        mov a,dph                     ;выход, если значения
    cjne a,#0ffh,bin_to_bcd_m0    ;подготовлены
bin_to_bcd_exit:
    ret
;common sub FUNCTIONS dec_counter & inc_counter
;-------------------------------------------
;Отображение чисел по адресам предварительно|
;    записаных в disp0, disp1, disp2        |
;-------------------------------------------
display:
    mov r0,disp2
    mov p0,@r0
    mov p2,#1h
    call time1
    mov r0,disp1
    mov p0,@r0
    mov p2,#2h
    call time1
    mov r0,disp0
    mov p0,@r0
    mov p2,#4h
    call time1
    clr p2.2
    ret
;-------------------------------------------------
;Обслуживание прерывания при переполнении счётчика|
;-------------------------------------------------
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


если кто то захочет разбираться, я могу продолжать,
думаю некто не захочет wacko.gif

Сообщение отредактировал BigCoster - Apr 12 2007, 14:31
Go to the top of the page
 
+Quote Post
Stas633
сообщение Apr 12 2007, 14:43
Сообщение #23


Частый гость
**

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



Цитата(BigCoster @ Apr 12 2007, 15:04) *
....

Прикрепленное изображение

...


Положительный фронт "затягивается" из-за зарядки конденсатора. Уберите его из схемы, и посмОтрите как изменится сигнал.

Я считаю, что, судя по приведенной осциллограмме, датчик работает "правильно", а ошибка "формируется" программой.

Цитата(BigCoster @ Apr 12 2007, 15:04) *
...
Я так понимаю, что метод с подсчётом импульсов в прерывании от таймера для индикации
не подходит (программа не маленькая и на асме, переделывать не очень то и хочется)
Триггер Шмидта???


Не переделывайте, не нужно.. Напишите новую, но очень маленькую (настроечную).

А триггер Шмидта только "выпрямит" фронты, и "добавит" в работу датчика гистерезис.

.... пишу по поводу программы... Неправильный "подход" уже очевиден...
Go to the top of the page
 
+Quote Post
BigCoster
сообщение Apr 12 2007, 15:10
Сообщение #24


Участник
*

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



Цитата(Stas633 @ Apr 12 2007, 14:43) *
Положительный фронт "затягивается" из-за зарядки конденсатора. Уберите его из схемы, и посмОтрите как изменится сигнал.

Я считаю, что, судя по приведенной осциллограмме, датчик работает "правильно", а ошибка "формируется" программой.
Не переделывайте, не нужно.. Напишите новую, но очень маленькую (настроечную).

А триггер Шмидта только "выпрямит" фронты, и "добавит" в работу датчика гистерезис.

.... пишу по поводу программы... Неправильный "подход" уже очевиден...

Убрал ёмкость, вот что получилось:
Прикрепленное изображение

Думаю на мой "осцилограф" не сильно стоит обращать внимание
т.к. 44.1кГц, 16 бит + у него на входе наверное фильтр какой нить.

Ошибка увеличилась почти на целый оборот вала двигателя.
Go to the top of the page
 
+Quote Post
Stas633
сообщение Apr 12 2007, 15:13
Сообщение #25


Частый гость
**

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



Цитата(BigCoster @ Apr 12 2007, 15:29) *
Код
2.Прерывания
[code];************************
;* ОБРАБОТКА ПРЕРЫВАНИЙ *
;************************

;------------------------------------------------
;Обслуживание прерывания при переполнении таймера|
;------------------------------------------------
t0_overflow:
    jb type_count,t0_overflow_1
    call inc_counter
    reti
t0_overflow_1:
    call dec_counter
    reti
;FUNCTIONS t0_overflow
;------------------------
;Инкрементирующий счётчик|
;------------------------
inc_counter:
    clr tr0        ;запретить счёт таймеру
    call inc_bcd
    call bin_to_bcd
    call display
    setb tr0             ;разрешить счёт таймеру
    ret
;sub FUNCTIONS inc_counter
;---------------------------------------------
;Предварительная обработка значений для работы|
;    счётчика в инкрементирующем режиме     |
;---------------------------------------------
inc_bcd:
    mov a,th1
    mov dph,a
    mov a,tl1
    mov dpl,a
    ret
;FUNCTIONS t0_overflow
;------------------------
;Декрементирующий счётчик|
;------------------------
dec_counter:
    clr tr0
    call dec_bcd
    call bin_to_bcd
    call display
    setb tr0
    ret


Общеизвестно, что при работе систем realtime, коей является Ваше устройство, программа обработки прерываний должна содержать минимум кода. Например алгоритм работы по прерыванию, может быть таким: 1. сохранил значение (таймера-счетчика или еще чего-либо) во временной переменной. 2. установил флаг обновления этой временной переменной 3.конец. И уж совсем не допустимым, на мой взгляд является использование вызова подпрограмм (call) из прерывания. Если нет возможности отказаться от использования какой-либо функции при отработке прерывания, то размещайте её (функцию) внутри прерывания!

Код
interrupt [EXT_INT1] void ext_int1_isr(void)
{
if(PIND.4)Encod=Encod-vc_step;
else Encod=Encod+vc_step;
valcod=1;
}

или

Код
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
if (--Time2==0){Time2=15;vzvod=1;}
}


Ещё.... Если Вы используете работу по прерываниям в realtime системе, то необходимо "расставить" приоритеты. Точнее выбрать ГЛАВНУЮ ЗАДАЧУ, выполнение которой не может быть "отодвинуто" ни чем другим. Если для Вас главное - подсчет импульсов, то если "мешает" вывод на индикатор, то им нужно жертвовать... и т.д.
Go to the top of the page
 
+Quote Post
BigCoster
сообщение Apr 12 2007, 15:30
Сообщение #26


Участник
*

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



Цитата(Stas633 @ Apr 12 2007, 15:13) *
Общеизвестно, что при работе систем realtime, коей является Ваше устройство, программа обработки прерываний должна содержать минимум кода. Например алгоритм работы по прерыванию, может быть таким: 1. сохранил значение (таймера-счетчика или еще чего-либо) во временной переменной. 2. установил флаг обновления этой временной переменной 3.конец. И уж совсем не допустимым, на мой взгляд является использование вызова подпрограмм (call) из прерывания. Если нет возможности отказаться от использования какой-либо функции при отработке прерывания, то размещайте её (функцию) внутри прерывания!

Код
interrupt [EXT_INT1] void ext_int1_isr(void)
{
if(PIND.4)Encod=Encod-vc_step;
else Encod=Encod+vc_step;
valcod=1;
}

или

Код
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
if (--Time2==0){Time2=15;vzvod=1;}
}


Ещё.... Если Вы используете работу по прерываниям в realtime системе, то необходимо "расставить" приоритеты. Точнее выбрать ГЛАВНУЮ ЗАДАЧУ, выполнение которой не может быть "отодвинуто" ни чем другим. Если для Вас главное - подсчет импульсов, то если "мешает" вывод на индикатор, то им нужно жертвовать... и т.д.


Приоритеты для прерываний установлены так: счётчик->таймер->внешние прерывания
(пока не задействованы).
По поводу всех замечаний на счёт написания программы согласен, но на том этапе,
когда она писалась оправданы были все действия (перед собой)
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Apr 12 2007, 15:44
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Ну, если счетчик считает при остановленном двигателе, и двигатель управляется тем же контроллером, то поможет только одно программное извращение - не считать, если двигатель установлен :-)
Ничто другое не поможет, если крыльчатка вибрирует - только изменение конструкции датчика.
Второй канал датчика, как уже предложили.
И непонятно, для чего нужно знать точное количество импульсов.
А приоритетов прерываний в AVR не существует. Так, теоретически можно искусственно сделать два уровня.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Visor
сообщение Apr 12 2007, 15:51
Сообщение #28


Местный
***

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



Цитата(Stas633 @ Apr 12 2007, 20:13) *
программа обработки прерываний должна содержать минимум кода.

Абсолютно солидарен, хороший стиль. В прерывании инкрементируй счетчик и всё, остальное в общем цикле.
Go to the top of the page
 
+Quote Post
Stas633
сообщение Apr 12 2007, 15:55
Сообщение #29


Частый гость
**

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



Цитата(BigCoster @ Apr 12 2007, 16:30) *
Приоритеты для прерываний установлены так: счётчик->таймер->внешние прерывания
(пока не задействованы).
По поводу всех замечаний на счёт написания программы согласен, но на том этапе,
когда она писалась оправданы были все действия (перед собой)


Действительно, "разобраться в чужой программе сложнее, чем написать свою"..., но если Вы поясните алгоритм функционирования Вашего устройства, в части касающейся обработки вращения (углового перемещения) двигателя, то возможно Вам предложат КАК написать программу.

Ну а "не правильно" написанную (равно как и работающую с ошибками) программу придется переписывать...
Go to the top of the page
 
+Quote Post
BigCoster
сообщение Apr 12 2007, 16:13
Сообщение #30


Участник
*

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



Цитата(Dog Pawlowa @ Apr 12 2007, 15:44) *
Ну, если счетчик считает при остановленном двигателе, и двигатель управляется тем же контроллером, то поможет только одно программное извращение - не считать, если двигатель установлен :-)

Это програмное извращение уже реализовано
Код
t1_overflow:
    clr tr0        ;запретить счёт таймеру
    clr tr1        ;запретить счёт счётчику
    mov p0,#0
    call stop
    setb yet
    setb tr0       ;разрешить счёт таймеру
    setb tr1       ;разрешить счёт счётчику
    reti

Цитата(Dog Pawlowa @ Apr 12 2007, 15:44) *
И непонятно, для чего нужно знать точное количество импульсов.

Чтобы проехать заданное расстояние
Цитата(Dog Pawlowa @ Apr 12 2007, 15:44) *
А приоритетов прерываний в AVR не существует. Так, теоретически можно искусственно сделать два уровня.

У меня не AVR
Добъюсь работы на этом контроллере потом буду "ковырять" AVR

Цитата(Stas633 @ Apr 12 2007, 15:55) *
Действительно, "разобраться в чужой программе сложнее, чем написать свою"..., но если Вы поясните алгоритм функционирования Вашего устройства, в части касающейся обработки вращения (углового перемещения) двигателя, то возможно Вам предложат КАК написать программу.

Алгоритм такой:
НАСТРОЙКА
-нажимаем кнопку-едем едем сколько надо
-нажимаем кнопку-сохраняем
и так необходимое кол-во раз
РАБОТА
-едим, сколько сохранили
-проехали, остановились, постояли некоторое время
и так столько, сколько раз сохраняли потом тоже самое в обратную сторону
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Apr 12 2007, 16:51
Сообщение #31


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(BigCoster @ Apr 12 2007, 16:13) *
Чтобы проехать заданное расстояние

Я реализую такую функцию с помощью второго датчика привязки к абсолютному положению, что позволяет избежать накопления ошибки.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Stas633
сообщение Apr 12 2007, 17:03
Сообщение #32


Частый гость
**

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Visor
сообщение Apr 12 2007, 17:13
Сообщение #33


Местный
***

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



Цитата(BigCoster @ Apr 12 2007, 21:13) *
РАБОТА
-едим, сколько сохранили
-проехали, остановились, постояли некоторое время
и так столько, сколько раз сохраняли потом тоже самое в обратную сторону

Чтоб энкодер был реверсивный, нужно два датчика, смещенные на полшага. Иначе ошибка на смене направления обеспечена, да и с двумя датчиками можно считать туда-сюда, определяя направление вращения. Так устроены фирменные энкодеры.
Go to the top of the page
 
+Quote Post
Stas633
сообщение Apr 12 2007, 18:14
Сообщение #34


Частый гость
**

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



Цитата(Visor @ Apr 12 2007, 18:13) *
Чтоб энкодер был реверсивный, нужно два датчика, смещенные на полшага. Иначе ошибка на смене направления обеспечена, да и с двумя датчиками можно считать туда-сюда, определяя направление вращения. Так устроены фирменные энкодеры.


Внимание OFFTOP!
Не согласен. Для обеспечения "правильного" (без ошибок) счета достаточно одного датчика. Возникающая ошибка исправляется программно.
Но вот направление вращения с одним дадчиком определить НЕ ВОЗМОЖНО! Согласен абсолютно!
Go to the top of the page
 
+Quote Post
Visor
сообщение Apr 12 2007, 19:08
Сообщение #35


Местный
***

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



Цитата(Stas633 @ Apr 12 2007, 23:14) *
Внимание OFFTOP!
Не согласен. Для обеспечения "правильного" (без ошибок) счета достаточно одного датчика. Возникающая ошибка исправляется программно.

Был неправ, вспылил smile.gif, на самом деле минимальная ошибка энкодера и есть ширина зуба, и никак её не скомпенсируешь. А вообще я имел ввиду энкодер, как аппаратное устройство дающее полностью достоверные показания. Именно такие используют в промышленности. Кстати, с двумя датчиками можно увеличить кратность счёта в 2 либо 4 раза, считая фронты, ну или уменьшить соответственно число зубьев диска.

Сообщение отредактировал Visor - Apr 12 2007, 19:45
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Apr 12 2007, 19:20
Сообщение #36


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Stas633 @ Apr 12 2007, 18:14) *
[b]...Не согласен. Для обеспечения "правильного" (без ошибок) счета достаточно одного датчика. Возникающая ошибка исправляется программно...

Если можно, более подробно.
Какая ошибка исправляется программно?


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
_Sam_
сообщение Apr 12 2007, 23:03
Сообщение #37


Местный
***

Группа: Свой
Сообщений: 278
Регистрация: 18-01-05
Из: Санкт-Петербург
Пользователь №: 2 031



Цитата
Вот осцилограмма работы датчика
........
Из нее видно, что частота около 70Гц,


Цитата
В прерывании по таймеру обрабатывается вся индикация, а не по одному знаку в каждом прерывании.
Видим, что частота 40Гц


Конечно импульсы будут пропускаться. Чтобы не пропускались надо частоту прерываний по таймеру увеличить как минимум до 2*70Гц, а более правильно до 2*макс.частота_срабатывания_оптрона.


Цитата
Убрал ёмкость
......
Ошибка увеличилась почти на целый оборот вала двигателя

Можете пояснить каким образом вы считаете импульсы? По переднему, по заднему, по обоим фронтам или просто по уровню?
Go to the top of the page
 
+Quote Post
BigCoster
сообщение Apr 13 2007, 10:23
Сообщение #38


Участник
*

Группа: Свой
Сообщений: 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кГц )

На длительность периода входных сигналов ограничений сверху нет.
Go to the top of the page
 
+Quote Post
Stas633
сообщение Apr 13 2007, 10:36
Сообщение #39


Частый гость
**

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



Цитата(Visor @ Apr 12 2007, 20:08) *
....на самом деле минимальная ошибка энкодера и есть ширина зуба, и никак её не скомпенсируешь. А вообще я имел ввиду энкодер, как аппаратное устройство дающее полностью достоверные показания. Именно такие используют в промышленности...


В соответствии с заданной автором темой (вопросом) необходимо помочь найти ошибку в работе устройства.

Устройство состоит из датчика углового перемещения, на основе ОДНОЙ оптопары. При этом система не "следящая" и алгоритм работы такой: задал координату -> включил двигатель -> при достижении коорд., останов. (ветвление алгоритма на определение направления вращения двигателя не привожу сознательно)... Это, так сказать "условие задачи", которую нужно решить.

Согласен с Вами, что схемо-техническая переделка устройства повысит точность работы устройства. Но согласитесь и Вы со мной, в том что переписать программу проще чем заниматься "слесарщиной" и все равно переписывать программу.

Судя по вопросам-ответам автора точность устройства с одним датчиком его устраивает. Если "обращаться" к промышленным изделиям, то это например датчик углового перемещения для станков с ЧПУ (по-моему ВМ175 он "называется") обеспечивает от 2500 до 10000 импульсов на оборот, состоит из 15 (по-моему) оптопар, требует внешних импульсов синхронизации, да и "крыльчатка" там выполнена в виде прозрачного диска с нанесенными рисками (если я ошибся -поправьте). Я считаю, что применение энкодера ТАКОГО (или подобного) уровня должно быть чем-то обосновано.

Не согласен с Вами в том, что минимальная ошибка энкодера - это ширина зуба. На мой взгляд, минимальная ошибка обусловлена скоростью "реакции" системы на возниктовение события "фронт/спад". А ширина зуба может быть "компесирована" (исправлена ) программно (алгоритмически).

Цитата
Dog Pawlowa:
Если можно, более подробно.
Какая ошибка исправляется программно?


В связи с тем, что задание направления вращени является первоочередным (см.посты автора темы о алгоритме работы ус-ва) компенсировать ошибку "зуба" возможно переключением работы INT с "по фронту" (при вращении в "прямом" направлении) на "по спаду" (при вращении в "обратном" направлении.

Что меня огорчает больше всего, это то, что все написанное выше в этом посте НИ КАКОЙ полезной информации для автора темы не несет. А со сути является "флудом" и "засоряет" тему.
Go to the top of the page
 
+Quote Post
_Sam_
сообщение Apr 13 2007, 11:32
Сообщение #40


Местный
***

Группа: Свой
Сообщений: 278
Регистрация: 18-01-05
Из: Санкт-Петербург
Пользователь №: 2 031



Цитата
Дело в том что импульсы от датчика считает счётчик Т1,
я спрашиваю: "можно ли избавится от дребезга при таком включении ?"
Прерывание INT1 занято датчиком конечной точки перемещения, INT0 датчиком тока


Полностью избавиться при таком включении нельзя, но по идее таких больших насчётов быть не должно.

Нашёл у вас грубую ошибку: в прерывании t0_overflow вы оперируете со значение счётчика t1, не запрещая прерывания.

Допустим выполнилась команда mov a,th1, а в это время пришло пришло прерывание, по которому надо инкрементировать счётчик, тогда mov a,tl1 перешлёт в аккум. младший байт нового значения счётчика. В итоге будем работать с неправильным счётчиком.
Go to the top of the page
 
+Quote Post
BigCoster
сообщение Apr 13 2007, 15:44
Сообщение #41


Участник
*

Группа: Свой
Сообщений: 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 перешлёт в аккум. младший байт нового значения счётчика. В итоге будем работать с неправильным счётчиком.

таймер для индикации и не обязательно отображать совершенно точные показания энкодера
поправте, если не правильно Вас понял
Go to the top of the page
 
+Quote Post
BigCoster
сообщение Apr 13 2007, 17:30
Сообщение #42


Участник
*

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



ещё допишу...
отображать совсем точно значения не надо, это по поводу замечания со значениями T1 во
время прерываний.

И про достаточную точность позиционирования (можно сбится на один импульс от датчика) - я имел
ввиду свой случай при реверсе
Go to the top of the page
 
+Quote Post
_Sam_
сообщение Apr 13 2007, 18:27
Сообщение #43


Местный
***

Группа: Свой
Сообщений: 278
Регистрация: 18-01-05
Из: Санкт-Петербург
Пользователь №: 2 031



Наверное я не так понял программу.
А что вы делаете в прерывании t1? Можно код посмотреть?
type_count определяет в минус или в плюс считать импульсы в зависимости от задания на двигатель?
Если t1 полностью независимый зачем тогда анализирутеся type_count в прерывании t0?
Go to the top of the page
 
+Quote Post
BigCoster
сообщение Apr 13 2007, 19:14
Сообщение #44


Участник
*

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



Цитата(_Sam_ @ Apr 13 2007, 18:27) *
Наверное я не так понял программу.
А что вы делаете в прерывании t1? Можно код посмотреть?
type_count определяет в минус или в плюс считать импульсы в зависимости от задания на двигатель?
Если t1 полностью независимый зачем тогда анализирутеся type_count в прерывании t0?

В прерывании от t1 делаю паузу перед началом следующего вращения двигателя
не знаю как ещё можна реализовать паузу. unsure.gif
Если по флагу, в основной программе, то какая разница занята программа этой паузой или она
обрабатывается прямо в прерывании.
За 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
Go to the top of the page
 
+Quote Post
Visor
сообщение Apr 13 2007, 19:38
Сообщение #45


Местный
***

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
_Sam_
сообщение Apr 13 2007, 19:48
Сообщение #46


Местный
***

Группа: Свой
Сообщений: 278
Регистрация: 18-01-05
Из: Санкт-Петербург
Пользователь №: 2 031



Вроде дошло. smile.gif
Попробуйте скачать какую-нибудь терминальную программку(например такую) в которой можно cts,rts дёргать или ножки лпт. Затем ножку с LPT или COM подключите вместо датчика.Нажатиями на кнопки в программе проэмитируйте работу датчика.Будет ли насчитывать?
Также можно просимулировать всё это в кейле. Там для этого какой-то скриптовый язык есть.

Более подходящая программа. Приятное доп. к вашему осциллографу smile.gif
Go to the top of the page
 
+Quote Post
Visor
сообщение Apr 13 2007, 19:51
Сообщение #47


Местный
***

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



'BigCoster'
Я сторонник отладки частями, и чтобы определиться где "хандрит", в железе или в софте, было бы неплохо написать совсем простенькую программку подсчета импульсов, может даже без прерываний.
Go to the top of the page
 
+Quote Post
BigCoster
сообщение Apr 13 2007, 20:09
Сообщение #48


Участник
*

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



Цитата(_Sam_ @ Apr 13 2007, 19:48) *
Вроде дошло. smile.gif
Попробуйте скачать какую-нибудь терминальную программку(например такую) в которой можно cts,rts дёргать или ножки лпт. Затем ножку с LPT или COM подключите вместо датчика.Нажатиями на кнопки в программе проэмитируйте работу датчика.Будет ли насчитывать?
Также можно просимулировать всё это в кейле. Там для этого какой-то скриптовый язык есть.

Более подходящая программа. Приятное доп. к вашему осциллографу smile.gif


Пасибки пребольшое a14.gif
smile3046.gif разберёмся...

Цитата(Visor @ Apr 13 2007, 19:51) *
'BigCoster'
Я сторонник отладки частями, и чтобы определиться где "хандрит", в железе или в софте, было бы неплохо написать совсем простенькую программку подсчета импульсов, может даже без прерываний.

Завтра приступим...

Сообщение отредактировал BigCoster - Apr 13 2007, 20:10
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Apr 14 2007, 10:03
Сообщение #49


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(BigCoster @ Apr 13 2007, 20:09) *
smile3046.gif разберёмся...
Завтра приступим...

Мне нравится желание изобрести что-то новое, оригинальное, но не нравится упертое желание наступить на грабли.
Поскольку у меня есть определенный опыт с позиционированием (автофокус), то вынужден напомнить, что задача не имеет надежного решения с одним каналом. Быть может, если создается поделка для себя... Но ТЗ мы тут тоже не увидели.
Короче, успехов! smile.gif


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Stas633
сообщение Apr 14 2007, 19:44
Сообщение #50


Частый гость
**

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



Цитата(Dog Pawlowa @ Apr 14 2007, 11:03) *
Мне нравится желание изобрести что-то новое, оригинальное, но не нравится упертое желание наступить на грабли.
Поскольку у меня есть определенный опыт с позиционированием (автофокус), то вынужден напомнить, что задача не имеет надежного решения с одним каналом. Быть может, если создается поделка для себя... Но ТЗ мы тут тоже не увидели.
Короче, успехов! smile.gif


Полностью поддерживаю!

Ув. BigCoster, уж если Вы решились на "переделку" своего устройства, то непременно воспользуйтесь приведенными в теме рекомендациями.
Go to the top of the page
 
+Quote Post
BigCoster
сообщение Apr 18 2007, 14:28
Сообщение #51


Участник
*

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



Спасибо всем за ответы, многие из них очень информативные, в часности по поводу реализации
энкодеров

При частоте резонатора 12МГц один цикл равен 0,1мкс.
Уменя 6МГц значит 0,2мкс.
Померял LPT анализатором период дребезга около 0,05мкс.
Имеем апаратный фильтр, ошибка в программе.
Если ошибся поправляйте!!!

И ещё один такой вот вопрос, выходящий из всего выше сказанного :
Как (где) используется тайиер/счётчик в режиме счётчика ???
Go to the top of the page
 
+Quote Post
mandr
сообщение May 17 2007, 14:46
Сообщение #52





Группа: Новичок
Сообщений: 1
Регистрация: 12-03-05
Пользователь №: 3 275



Имею по работе проекты, в которых используются датчики импульсов типа ПДФ-3. Даже оставив датчик
без приёмной цифровой схемы, он самопроизвольно генерирует импульсы, когда берёшся за вал рукой,
при этом я нахожусь на полу из металлических плит. При коммутации какой-либо нагрузки происходит аналогичное явление. Побороть данного вида помехи позволило заземление общей точки питания самого датчика. Поэтому, считаю что Вам необходимо начать поиск в начале с самого энкодера, потом схемы, на которую он работает, а затем уже саму программу.
Go to the top of the page
 
+Quote Post
BigCoster
сообщение May 17 2007, 15:36
Сообщение #53


Участник
*

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



Я для себя решил, что без осциллографа схему менять не буду (общая точка датчика на земле, схемы включения я приводил, сказали вроде б нормально).
Не могу понять, как правильно организовать задание расстояния, которое должен проехать моторчик.
у меня просто: пока держишь кнопку счётчик считает, а программа проверяет не отпущена ли кнопка,
бросаем кнопку, нажимаем другую и сохраняем.
после всего этого едем и видим, что не совсем так же проехали, как при настройке, а больше и тем больше проезжаем,
чем больше раз нажимали книпку задания расстояния тем .. cranky.gif cranky.gif cranky.gif
А сейчас вообще не пишет данные в EEPROM, вернее возвращает постоянно одинаковое значение.
И концевой датчик тоже сошел с ума .. cranky.gif
Go to the top of the page
 
+Quote Post
OlegIvanov
сообщение May 23 2007, 22:51
Сообщение #54


Участник
*

Группа: Новичок
Сообщений: 38
Регистрация: 12-09-05
Пользователь №: 8 464



1. Двухканальный энкодер (о чем упоминалось выше), - там максимальная абсолютная неточность в пределах импульса (и сразу защита от всяких любых дребезгов если правильно отрабатывать).
2. В прерывании переполнения таймера-счетчика организовать программный счетчик и
считать каждый импульс (событие 255 прописанных +1 пришедший).
3. Если пункт 1 не устраивает то пункт 2 + антидребезг. Как организовать антидребезг - это насколько хватит фантазии. Триггер Шмидта помогает - стандартное решение для одноканальных энкодеров. Расчитанно именно на ситуацию когда метка в слабо-определенном состоянии.

К сожалению трудно четко представить чего там у вас происходит.
Go to the top of the page
 
+Quote Post
MaslovVG
сообщение May 24 2007, 06:06
Сообщение #55


Профессионал
*****

Группа: Свой
Сообщений: 1 210
Регистрация: 24-01-05
Из: Россия Волгодонск
Пользователь №: 2 134



Просмотрел ветку. Мое мнение. Подавить дребезг при подаче импульсов прямо на T1 програмно проблематично, если вообще возможно. Нужно искать причину возниновения.
Ничего не сказано про осветитель. Возможность посторонней засветки.
Для уменьшения влияния дрожания крыльчатки увеличить размер светового пятна у увеличить гистерезис датчика. Осцилограммы мне совсем не нравятся. Лучше всего если со светодиода (перед компаратором) при вращении крыльчатки будет идти треугольник.
Go to the top of the page
 
+Quote Post
vladimir_orl
сообщение Sep 3 2013, 05:44
Сообщение #56


Частый гость
**

Группа: Участник
Сообщений: 191
Регистрация: 18-09-12
Из: Орёл
Пользователь №: 73 591



Тема конечно устарела, но сейчас столкнулся с тем же. Посадил выход от энкодера на внешнее прерывание на меге128 (INT2). Сразу побежал дребезг. Сделал напрямую на порт:
Код
m_value = PIND & (1 << PD2);
        if (m_value == 0){
            m_trigger = 1;
        } else {
            if (m_trigger == 1){
                ++m_counter;
            }
            m_trigger = 0;
        }


всё хорошо стало. Потому что внешнее прерывание ещё использовать уметь надо.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Sep 4 2013, 20:02
Сообщение #57


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(vladimir_orl @ Sep 3 2013, 09:44) *
.


Да не в умении даже дело. Прерывание почти каждый дребезг поймает, но и ваша система иногда будет напарываться. Простое решение это запретить прерывание как оно случилось и очистить его флаг на случай если вызвалось снова пока вызывался обработчик, запустить таймер на половину короткого интервала. По прерыванию таймера считать достоверное значение и снова разрешить прерывание от сигнала.

Я делал обработчик в более удобной среде там было два смещенных датчика с перекрытием как синус и косинус. Правда надо было етхе регистрировать направление. Итого было четыре области, которые я мог различить. 00, 01, 11 и 10 если бит 0 еыто сигнал одного датчика, а бит 1 второго. Далее я построил машину состояний (автомат) с четырьмя состояниями и разрешил в ней переходы между состояниями, соответствующиими соседним значениям датчиков. То есть если я в состоянии 01, то переход в 11 или 00 возможен, а в 10 нет. Расстояние хемминга 1 инициирует переход. И моя модель крутилась вслед за датчиком.

Сообщение отредактировал IgorKossak - Sep 6 2013, 17:26
Причина редактирования: избыточное цитирование
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Sep 9 2013, 18:13
Сообщение #58


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Какая скорость прихода импульсов с валкодера? Разрешение? Крутит человек или это колесо на производстве чего-то?
Дребезг давить аппаратно (с опичтеских не требуется), если быстродействие озволяет, оба сигнала завести на прерывания. Обработчик общий на двоих:


Код
static uint_fast8_t old_val;

void spool_encinterrupt(void)
{
    const uint_fast8_t new_val = hardware_get_encoder_bits();    /* Состояние фазы A - в бите с весом 2, фазы B - в бите с весом 1 */

    // dimensions are:
    // old_bits new_bits
    static const int_fast8_t graydecoder [4][4] =
    {
        {
            +0,        /* 00 -> 00 stopped                */
            -1,        /* 00 -> 01 rotate left            */
            +1,        /* 00 -> 10 rotate right        */
            +0,        /* 00 -> 11 invalid combination */        
        },
        {
            +1,        /* 01 -> 00 rotate right        */
            +0,        /* 01 -> 01 stopped                */
            +0,        /* 01 -> 10 invalid combination */
            -1,        /* 01 -> 11 rotate left            */
        },
        {
            -1,        /* 10 -> 00 rotate left            */
            +0,        /* 10 -> 01 invalid combination */
            +0,        /* 10 -> 10 stopped                */
            +1,        /* 10 -> 11 rotate right        */
        },
        {
            +0,        /* 11 -> 00 invalid combination */
            +1,        /* 11 -> 01 rotate right        */
            -1,        /* 11 -> 10 rotate left            */
            +0,        /* 11 -> 11 stopped                */
        },
    };


#if ENCODER_REVERSE
    position1 -= graydecoder [old_val][new_val];
#else
    position1 += graydecoder [old_val][new_val];
#endif
    old_val = new_val;
}


В инициализации не забыть
Код
    old_val = hardware_get_encoder_bits();    /* Состояние фазы A - в бите с весом 2, фазы B - в бите с весом 1 */

чтобы ложные шаги при ресете не проходили на стоящем валкодере.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Sep 9 2013, 19:35
Сообщение #59


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(Genadi Zawidowski @ Sep 9 2013, 22:13) *
.


Красиво.
Дребезг даже не подавленный не будет мешать, однако будут лишние вызовы прерываний, что не есть хорошо. Если время оборота составляет несколько миллисекунд, то возможно поллинг будет лучшим подходом.

Сообщение отредактировал IgorKossak - Sep 10 2013, 18:39
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Sep 10 2013, 01:07
Сообщение #60


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



Цитата(Tarbal @ Sep 4 2013, 16:02) *
... Далее я построил машину состояний (автомат) с четырьмя состояниями и разрешил в ней переходы между состояниями, соответствующиими соседним значениям датчиков. То есть если я в состоянии 01, то переход в 11 или 00 возможен, а в 10 нет. Расстояние хемминга 1 инициирует переход. И моя модель крутилась вслед за датчиком.

Классная идея. disco.gif


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Sep 11 2013, 00:05
Сообщение #61


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(A. Fig Lee @ Sep 10 2013, 05:07) *
Классная идея. disco.gif


Я на похожем алгоритме сделал модем приемник FSK 1200-2200 на PIC16C71 с системной частотой 1 мегагерц. Подобные на DSP 40 мегагерцовых делали sm.gif

У меня дома есть действующая модель. Приходи покажу.
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Sep 11 2013, 02:14
Сообщение #62


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



Цитата(Tarbal @ Sep 10 2013, 20:05) *
Я на похожем алгоритме сделал модем приемник FSK 1200-2200 на PIC16C71 с системной частотой 1 мегагерц. Подобные на DSP 40 мегагерцовых делали sm.gif

У меня дома есть действующая модель. Приходи покажу.

Мы в одном городе? sm.gif


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Sep 13 2013, 13:30
Сообщение #63


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(A. Fig Lee @ Sep 11 2013, 06:14) *
Мы в одном городе? sm.gif


В разных, но нет ничего невозможного sm.gif
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Oct 3 2013, 20:53
Сообщение #64


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



Цитата(Genadi Zawidowski @ Sep 9 2013, 14:13) *
.


Идея красивая, но чтото я не понял как дребезг давится.
Например, у меня 11 на входе, потом я получил 0:
11-10, далее в результате дребезга 10-11, 11-10, 10-11 и так далее.

Сообщение отредактировал IgorKossak - Oct 4 2013, 11:44
Причина редактирования: избыточное цитирование


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Oct 4 2013, 19:27
Сообщение #65


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



Добил.

В принципе, избавлятся от дребезга в енкодере проще, чем в кнопке.
Так как начало и конец импульса всегда отделены началом и концом другого импульса.
Типа:
Нажал1-Нажал2-Отжал1-Отжал2.
Между нажал1 и отжал1 всегда есть нажал2.

Вывод: надо играть на edges.
Не важен дребезг, сколько не дребезжи, после первого edge сигнал игнорируем
до активности на другом сигнале.
Еще мысль:
после первого edge имеем направление движения:
или 10, или 01, после второго edge фиксируем предыдущее состояние (направление).

Наваял код в Microchip X Lab xc8
для PIC18F14K50 - то, что под рукой было.

Преобразовывает в gray code - в зависимости от направления вращения состояния
меняются:

00
01
11
10
00

или
00
10
11
01
00

CODE
/*
* File: main.c
* Author: dmitriy
*
* Created on September 17, 2013, 10:55 PM
*/

#include <htc.h>
#include <stdlib.h>
#include <stdint.h> /* For uint8_t definition */

#include "config.h"

uint8_t values;

void Init()
{
// Input PB4, PB5 for encoder
// Output PC1, PC2
TRISC = 0xF1;
ANSEL = 0;
ANSELH = 0;

// Enable pullups on PORTB
INTCON2bits.NOT_RABPU = 0;

//Enable interrupt on change for PB4, PB5, PB6
IOCBbits.IOCB4 = 1;
IOCBbits.IOCB5 = 1;

//Enable interrupt on change
INTCON2bits.RABIP = 1;
INTCONbits.RBIE = 1;
INTCONbits.PEIE = 1;
INTCONbits.GIE = 1;


}

void interrupt isr(void) {
if (INTCONbits.RBIF) {
values = (PORTB & 0x30) >> 4;
INTCONbits.RBIF = 0;
}
}


/*
*
*/
int main(int argc, char** argv) {
uint8_t edges = 0;
uint8_t edge;
uint8_t old_values;
uint8_t grey = 0;
uint8_t myvalue;

Init();
old_values = (PORTB & 0x30) >> 4;

while (1) {
myvalue = values;
edge = myvalue ^ old_values;
old_values = myvalue;
if (edge) {
//activity detected
if (edge != edges) {
//activity on new edge
edges = edge;
if (!myvalue) {
//fix direction
// which depends on edge
if (edge & 0x01) {
switch (grey) {
case 00:
grey = 0x01;
break;
case 0x01:
grey = 0x03;
break;
case 0x03:
grey = 0x02;
break;
case 0x02:
grey = 0x00;
break;
} //switch
} else {
switch (grey) {
case 00:
grey = 0x02;
break;
case 0x02:
grey = 0x03;
break;
case 0x03:
grey = 0x01;
break;
case 0x01:
grey = 0x00;
break;
} //switch
} //if (edge & 0x01)
PORTC = grey << 1;
} //if (!myvalue)
} //if (edge != edges)
}
}

return (EXIT_SUCCESS);
}


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Oct 4 2013, 20:28
Сообщение #66


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



Состряпал hardware схемку.
Не тестировал, правда.
Гдето так:



--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Oct 8 2013, 13:36
Сообщение #67


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Подавитель дребезга на стейт машине не давит дребезг каждый шаг, но за оборот (4 шага в одном направлении) давит.
Идея в том, что сумму надо поделить на 4 и если она изменилась, то достоверно было событие. При целом делении эффект дребезга становится меньше одного, а значит ноль. тем он и отфильтровывается.

Сообщение отредактировал Tarbal - Oct 8 2013, 13:37
Go to the top of the page
 
+Quote Post
Линь
сообщение Apr 2 2014, 02:23
Сообщение #68


Частый гость
**

Группа: Участник
Сообщений: 189
Регистрация: 25-10-13
Пользователь №: 78 900



Цитата(Dog Pawlowa @ Apr 12 2007, 02:00) *
Обычно нужно, чтобы на счетный вход поступал практически идеальный сигнал (с крутыми фронтами).
Иначе на пологом фронте возможно срабатывание счетчика несколько раз от незначительных помех.
Простое добавление интегрирующей цепочки не помогает, естественно.
Попробуйте включить триггер Шмитта между интегрирующей цепочкой и счетным входом, или обработать сигнал программно, как Вам советовали выше.

Согласен. Можно также попробовать поиграть током через датчик (фототранзистор как правило) до пределов по даташиту.
Go to the top of the page
 
+Quote Post

5 страниц V   1 2 3 > » 
Reply to this topicStart new topic
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 11:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.02333 секунд с 7
ELECTRONIX ©2004-2016