Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

Atmega32 и энкодер

Непрочитано 18.02.2011, 16:11  
i000386
Прохожий
 
Регистрация: 30.11.2008
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
i000386 на пути к лучшему
По умолчанию Re: Atmega32 и энкодер

1.Вы должны точно знать частоту от енсодера
2.Ваша программа (цикл опроса) должна быть в 4 раза быстрей этой частоты
3.Думайте на программой
Реклама:
i000386 вне форума  
Непрочитано 18.02.2011, 16:40  
anpaza
Прохожий
 
Регистрация: 14.02.2011
Сообщений: 9
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
anpaza на пути к лучшему
По умолчанию Re: Atmega32 и энкодер

Мне кажется, лучше бы оба пина от энкодера висели на одном порту. Тогда можно одним считыванием считать оба бита разом, тогда можно сделать выборку: 01 - в одну сторону, 10 - в другую, 11 или 00 - ошибка, ждём некоторое время и смотрим опять.

И ещё, можно попробовать наоборот уменьшить временную константу антидребезговых RC цепочек. Может просто не всегда успевает зарядиться конденсатор за отведённое время (особенно в случае дребезга).
anpaza вне форума  
Непрочитано 18.02.2011, 17:16  
megalab
Временная регистрация
 
Аватар для megalab
 
Регистрация: 26.10.2009
Сообщений: 52
Сказал спасибо: 86
Сказали Спасибо 84 раз(а) в 25 сообщении(ях)
megalab на пути к лучшему
По умолчанию Re: Atmega32 и энкодер

я пробовал вместо промышленных енкодеров использовать шаговый движок от флопика , или другие миниатюрные.
на прямую даже светодиоды зажигаются...
megalab вне форума  
Непрочитано 18.02.2011, 18:35  
vasilenko_pit
Частый гость
 
Аватар для vasilenko_pit
 
Регистрация: 14.07.2010
Сообщений: 27
Сказал спасибо: 2,690
Сказали Спасибо 45 раз(а) в 13 сообщении(ях)
vasilenko_pit на пути к лучшему
По умолчанию Re: Atmega32 и энкодер

Похоже на то, как будто выполняется две подряд операции ++ или --. Может между ++(или --) и DialChange =1; приходит прерывание. Может сначала DialChange =1; поставить?(А где DialChange =0;?)
vasilenko_pit вне форума  
Непрочитано 18.02.2011, 19:03  
mlecus
Прохожий
 
Регистрация: 21.02.2008
Сообщений: 3
Сказал спасибо: 42
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
mlecus на пути к лучшему
По умолчанию Re: Atmega32 и энкодер

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

/*__ramfunc*/ void enc_interrupt_handler(void)
{
unsigned int temp;
enc_pio_status = enc_pPio-›PIO_PDSR;
if ((enc_pio_status&ENC0_B)!=(enc_old_pio_status&ENC0 _B))
{
count_enable=1;
enc_old_pio_status=enc_pio_status;
}
if ((enc_pio_status&ENC0_A)!=(enc_old_pio_status&ENC0 _A))
{
if ((enc_pio_status&ENC0_A)&&(count_enable))
{
if (enc_pio_status&ENC0_B)
{
enc0_counter++;
enc0_counter%=enc0_max*enc0_step;
}
else
{
if (enc0_counter==0)
{
enc0_counter=enc0_max*enc0_step;
}
else
{
enc0_counter--;
}
}

enc0_stepped_counter=(enc0_counter/enc0_step)%enc0_max;
count_enable=0;
}
enc_old_pio_status=enc_pio_status;
}

if ((enc_pio_status&ENC0_But)!=(enc_old_pio_status&EN C0_But))
{
if (enc_pio_status&ENC0_But)
{
enc_flag|=ENC0_BUTTON_PUSHED;
}
enc_old_pio_status=enc_pio_status;
}
temp=AT91C_BASE_PIOA-› PIO_ISR;
temp=temp;
}
mlecus вне форума  
Непрочитано 18.02.2011, 19:16  
microsmaster
Прохожий
 
Регистрация: 06.02.2010
Сообщений: 4
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 2 сообщении(ях)
microsmaster на пути к лучшему
По умолчанию Re: Atmega32 и энкодер

Попробуй мой исходник - сопрягаем энкодер и микроконтроллер
microsmaster вне форума  
Непрочитано 20.02.2011, 21:03  
Godzilla82
Почётный гражданин KAZUS.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Atmega32 и энкодер

PHP код:
#define EN_A = 0b00001000
#define EN_b = 0b10000000

volatile unsigned char a,b;

ISR(SIG_OUTPUT_COMPARE0)
{
a = PIND;
b = PINС ›› 4;
if(a != pa)    {
            pa = a;
            if(a != b)    count++;
            else        count--;
            }
if(b != pb) {
            pb = b;
            if(a != b)    count--;
            else        count++;
            }
} 
Делаете прерывание с периодом 10 мкс - будет до 100 кГц обсчитывать (кварц не менее 10 МГц).
Желательно фазы A и B повесить на 1 порт. Для уменьшения загрузки процессора - на соседние ноги.

А вобще-то это может быть и глюк энкодера, неравномерности вращения и т.д.

Последний раз редактировалось Godzilla82; 20.02.2011 в 21:07.
Godzilla82 вне форума  
Непрочитано 21.02.2011, 02:01  
Pevek80
Прописка
 
Аватар для Pevek80
 
Регистрация: 21.08.2010
Адрес: Таганрог
Сообщений: 108
Сказал спасибо: 19
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
Pevek80 на пути к лучшему
По умолчанию Re: Atmega32 и энкодер

Спасибо всем!!!
Сейчас я не могу попробовать по ряду причин.
Но я сообщу о результатах.
Сообщение от Godzilla82 Посмотреть сообщение
Желательно фазы A и B повесить на 1 порт
А вот с этим не получится, все пины уже заняты, и ПП разведена и изготовлена.
Pevek80 вне форума  
Непрочитано 21.02.2011, 13:24  
Kosachoff
Частый гость
 
Регистрация: 18.03.2005
Сообщений: 40
Сказал спасибо: 3
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
Kosachoff на пути к лучшему
По умолчанию Re: Atmega32 и энкодер

Энкодер выдает 2 сдвинутых импульса, какой раньше - зависит от направления
вращения. По фронту одного импульса (прерывание) надо СРАЗУ проверить состояние
другого, этим определится направление шага.
Если за время реакции на первый фронт второй импульс успеет задребезжать - возможны ошибки.
Здесь поможет только уменьшение времени реакции.
После того, как направление шага определено можно отсчитывать задержку на антидребезг -
время до следующего шага.

Последний раз редактировалось Kosachoff; 21.02.2011 в 13:34. Причина: уточнение
Kosachoff вне форума  
Непрочитано 21.02.2011, 23:34  
Godzilla82
Почётный гражданин KAZUS.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
Godzilla82 на пути к лучшему
По умолчанию Re: Atmega32 и энкодер

Сообщение от Kosachoff Посмотреть сообщение
... По фронту одного импульса (прерывание) надо СРАЗУ проверить состояние другого, этим определится направление шага.
Если за время реакции на первый фронт второй импульс успеет задребезжать - возможны ошибки.
Здесь поможет только уменьшение времени реакции.
После того, как направление шага определено можно отсчитывать задержку на антидребезг -
время до следующего шага.
Не совсем так.

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

А вот дребезг первого импульса очень коварен. Если не отследить каждый его фронт/спад (кстати, надо не только по фронту отсчитывать события, но и по спаду) то получится ситуация:

По фронту мы определили направление, допустим +. В это время импульс успел вернуться в исходное состояние (из-за дребезга). Но мы проморгали. Тут же опять возникает фронт. По которому мы опять определяем направление +. В итоге у нас +2, когда должно быть +1.

Ага. Задержка. Вводим задержку. Если характер импульсов постоянен (вращение в одну сторону, например). То задержка поможет. Но если ситуация такова:

Мы подождали. Но энкодер остановился как раз в этом неустойчивом положении и дребезг всё равно продолжается. Это весьма вероятно. Задержка тут мало поможет.

Нужно избавиться от дребезга. Ввести RC фильтр и поставить триггер Шмитта с гистерезисом. Гистерезис, как таковой, есть и у TTL входа МК.

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

P.S. и отслеживать по фронту надо не 1 импульс, а все 2.
Godzilla82 вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите настроить АЦП в Atmega32 sergx1300 Микроконтроллеры, АЦП, память и т.д 72 09.11.2010 00:28
Atmega32 и LCD DEJL1985 Делимся опытом 8 20.06.2010 14:35
АЦП 12-bit + ATMega32 моделирование в Proteus Flash_vrn Proteus 4 22.05.2010 05:20


Часовой пояс GMT +4, время: 15:26.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.