|
AVR-MT-128 и энкодер, сигналы без тормозов |
|
|
|
 |
Ответов
(1 - 53)
|
May 7 2010, 13:15
|

Участник

Группа: Участник
Сообщений: 55
Регистрация: 16-02-07
Из: Deutschland
Пользователь №: 25 408

|
Цитата(PaulB @ May 7 2010, 16:46)  ЛИР-158 2500имп/мин. может 2500 имп/оборот? Какова скорость вращения вала энкодера и какова частота импульсов. А вы устраняли "дребезг"?
|
|
|
|
|
May 7 2010, 17:32
|
Частый гость
 
Группа: Участник
Сообщений: 147
Регистрация: 20-08-06
Пользователь №: 19 681

|
Цитата(konstan @ May 7 2010, 17:15)  может 2500 имп/оборот? Какова скорость вращения вала энкодера и какова частота импульсов.
А вы устраняли "дребезг"? Да, Вы правы2500имп/оборот В паспорте написано что мах.частота вращения вала 10000об/мин и выходного сигнала 2,5МГц Пишу в кодвижене вот часть кода: CODE while(PINA.1==1){ //Стоп if (PINB.2==1) { while(PINB.2==1){ } q=q+1; }}
--------------------
|
|
|
|
|
May 8 2010, 04:10
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
Цитата(PaulB @ May 8 2010, 02:32)  Да, Вы правы2500имп/оборот Однако, такие частоты нужно обрабатывать аппаратно, а не программно (ИМХО). Как вариант, Вы можете использовать специализированные микросхемы, предназначенные для этого, либо (если нет дребезга) что-нибудь на базе D-триггеров и счетчиков из дискретной логики. Но еще лучше, опять же ИМХО, взять CPLD и организовать на ней необходимые функции. Если нужно программно, то не следует забывать, что частота опроса энкодера должна быть в несколько раз выше максимальной частоты импульсов с энкодера для конкретного случая. Например, если Вы будете вращать вал с максимальной скорость 10 об/сек, то частота опроса может быть 10 * 2500 *4 = 100 кГц. Т.е. в 4 раза больше. А с учетом цифровой фильтрации различных помех и еще выше. Таким образом, все ресурсы МК будут затрачены на обработку энкодера.
--------------------
Выбор.
|
|
|
|
|
May 13 2010, 04:51
|
Участник

Группа: Участник
Сообщений: 60
Регистрация: 16-06-05
Пользователь №: 6 074

|
Вот так я делал на Mega16. Работает без глюков при частоте импульсов 500 Гц. Тактовая МК 16МГц. Фаза А сидит, одновременно, на INT0 (нарастание) и INT1 (спад). Код #include <avr/io.h> #include <avr/interrupt.h> ... #define PHASA_B_PORT PORTD #define PHASA_B_DDR DDRD #define PHASA_B_PIN PIND #define PHASA_B_n 1 ... volatile signed char count_temp; ... ISR (INT0_vect) { if (bit_is_clear(PHASA_B, PHASA_B_n)) count_temp++; }
ISR (INT1_vect) { if (bit_is_clear(PHASA_B, PHASA_B_n)) count_temp--; }
void int_init ( void ) { PHASA_B_DDR &= ~(1 << PHASA_B_n); PHASA_B_PORT &= ~(1 << PHASA_B_n); count_temp = 0; MCUCR = (1 << ISC01) | (1 << ISC00) | (1 << ISC11) | (0 << ISC10); GICR |= (1 << INT0) | (1 << INT1); }
int main ( void ) { signed char count_temp2; long counter; ... int0_init(); sei(); ... while(1) { ... cli(); count_temp2 = count_temp; sei(); counter += count_temp2; cli(); count_temp -= count_temp2; sei(); ... }; return 0; }
|
|
|
|
|
May 25 2010, 11:49
|
Местный
  
Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101

|
Оба вывода энкодера подаются на 2 прерывания по обоим фронтам. Или (лучше) опрашивать энкодер с частотой, достаточной для ловли его состояний. Обработчик прерывания один и тот же: Читаем энкодер. При вращении вперёд он проходит значения 1-0-2-3-1-0-2-3..., назад - наоборот. Если считанное состояние 2, предыдущее 0, пред-предыдущее 1 то шаг++. Если текущее 1, предыдущее 0, пред-предыдущее 2 то шаг--. Всё другое - это дрожание вала ака "дребезг". Регистровая переменная "шаг" изменяется в прерывании, переменная "шаги" в основной программе не реже, чем 100 шагов: шаги+= шаг; шаг=0. Анализ, изменилось ли состояние, занимает 9 циклов контроллера и шаг++/шаг-- ещё 14. Ну и на вход-выход в прерывание ваш С-компилятор накрутит не знаю сколько
Сообщение отредактировал Maik-vs - May 25 2010, 11:53
|
|
|
|
|
Aug 11 2010, 13:46
|
Частый гость
 
Группа: Участник
Сообщений: 147
Регистрация: 20-08-06
Пользователь №: 19 681

|
Сделал счетчик от прерывания, оказалось что такого вполне должно хватить. Энкодер подключен напрямую к мк без логики т.к. сначало хочется хотябы просто считать импульсы в одном направлении. Считать то вроде считает, но неправильно. энкодер отключил, после включения питания на дисплее показания сразу добегают до пары тысяч, и изменяются каждую секунду. значит дело в коде? Код #include<mega128.h> #include <delay.h> #include <stdlib.h> #include <stdio.h> #include <lcd.h>
#asm .equ __lcd_port=0x15;PORTC #endasm
unsigned long q; interrupt [EXT_INT0] void ext_int0_isr(void) // процедура обработки прерывания { q++; //с каждым прерыванием значение переменной увеличивается на 1 } int main() { char w[32]; //для преобразования числа в строку/символы DDRA=0x00; PORTA=0x00; DDRB=0xF0; PORTB=0x00; DDRE = 0b00110000; PORTE = 0b00100000; lcd_init(16); lcd_gotoxy(5,0); lcd_putsf("Hello!"); Privet(); delay_ms(3000); while(1) { q=0; lcd_clear(); Go(); lcd_putsf(" "); Stop(); lcd_putsf(" "); Reset(); delay_ms(10); if (!(PINA & 0b00000001)) { //Пуск lcd_clear(); Go(); delay_ms(1000); SREG.7 = 1; EIMSK = 0x01; EICRA = 0x0C; EICRB = 0x0C; while(PINA & 0b00000100){ //Сброс lcd_clear(); sprintf(w,"adc= %d\n",q); lcd_puts(w); delay_ms(50); } lcd_clear(); Reset(); delay_ms(2000); } } return 0;
}
--------------------
|
|
|
|
|
Aug 11 2010, 15:46
|

Местный
  
Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530

|
Цитата значит дело в коде? Риторический вопрос Вы дребезг как давите? Датчик кодируется кодом Грея? Попробуйте применить RC-цепочку на входе ИНТ0 с постоянной цепи скажем так в 5 раз меньшей максим. частоты импульсов, или примените логику на входе для подавления дребезга например на елементах исключающее ИЛИ.
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
Aug 11 2010, 17:10
|

Местный
  
Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530

|
Цитата(PaulB @ Aug 11 2010, 19:04)  я же вроде указал что датчик от платы совсем отключил, а прошивка в момент работы сама считает не пойми какие прерывания, хотя должна показывать 0 т.к. энкодер отключон и прерываний не происходит.
о дребезге позже, как будет хотябы болие менее работать с датчиком. Посмотрите для начала как генерирует код начальной инициализации Ваш помощник встроенный в Вашем компиляторе. Посмотрите как опрашиваются кнопки. Что такое Go(); , Stop();, и Reset(); остаётся только догадываться. Ваши значения счётчика могут так изменятся из-за наводок на входе ИНТ0 или неправильной инициализации МК. Что в MCUCR и GICR ? ЗачемВам здержки? посмотрите хотябы код предложенный Vetal-Soft. прочитайте ссылку данную выше. Обнлвление на ЖКИ сделайте к примеру по прерыванию таймера а не в цикле
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
Aug 18 2010, 15:04
|
Частый гость
 
Группа: Участник
Сообщений: 147
Регистрация: 20-08-06
Пользователь №: 19 681

|
А кодом неподелитесь, может легче будет? А то все равно что то недопойму во эту часть: Цитата(backa @ Aug 13 2010, 11:20)  Как только приходил один из импульсов в обработчике прерывания менял на сработку этого вывода на уже спадающий фронт - дабы дождаться либо окончания импульса или наоборот если пошёл реверс то отмену прибавки в счётчике и уже ожидания окончания импульса для того что-бы его вычесть из текущего числа импульсов
--------------------
|
|
|
|
|
Nov 27 2010, 19:41
|
Частый гость
 
Группа: Участник
Сообщений: 147
Регистрация: 20-08-06
Пользователь №: 19 681

|
Продоржаю тему подключения энкодера ЛИР к контроллеру. Немного истории: предидущее подключение энкодера было "прямым", датчик напрямую подключался к контроллеру и сигналы считались от прерывания (счетчик был реверсивным), однако счет был неверным так как в датчике наблюдался дребизг. параметры: мах. частота вращения вала на который закреплен датчик: 5000 об/мин датчик: 2500 имп. на оборот частота работы мк: 16МГц Что хочется сделать теперь: 1. Избавиться от дребизга и осуществить реверс 2. Использовать Для счета таймер/счетчик 3. Исбользовать в качестве контроллера Xmega c частотой работы в 32МГц, так как помимо счета надо выполнять еще и другие операции. ================================== начнем с пункта №1. Для избежания дребизга планируется использовать оптопары, то есть каждый сигнал канала будет проходить через свою оптопару. Кто что об этом думает? Как лучше избавиться от дребезга? Аппаратно или программно? Реверс планирую осушествить добаврением к схеме двух корпусов логики триггера и элемента "И".  Жду коментариев, предложений?
--------------------
|
|
|
|
|
Nov 27 2010, 20:41
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата 5000 об/мин Это 83,33.... об/сек - зачем Xmega с 32 000 000 операций за секунду , на что может не хватить 16 000 000 оп/сек? А от датчика придёт только ~ 42 импульса за секунду. Цитата Для избежания дребЕзга планируется использовать оптопары и чем это должно помочь?
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Nov 27 2010, 22:32
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата(PaulB @ Nov 28 2010, 01:17)  В секунду с датчика придет: 83.33*2500=300имп в сек Да, правильно, посмотрел в этот момент на об.мин, правильно 300 . И что это меняет из 16 000000? Цитата оптопара: зглаживание пульсаций За счёт чего , ёмкости самой оптопары, ну очень острые пички он уберёт , остальное пропустит
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Nov 28 2010, 09:48
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата Да, чисто для счета 16 МГц хватит, но мне надо будет еще проделать несколько операцай помимо счета, для которых может и нехватить такой скорости. А если и хватит то впритык. Цитата _Pasha Блин, на что может не хватать 16Мгц? Вам уже два человека задали этот вопрос, при условии того , что считать у Вас будет TIMER , а у него своя частота , в зависимости от его включения и с основной программой как-то не завязан. Цитата Vasily_ У вас энкодер уже оптический, откуда там дребезг? Цитата PaulB однако счет был неверным так как в датчике наблюдался дребизг
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Nov 28 2010, 12:52
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата(Duhas @ Nov 28 2010, 14:03)  83.33*2500=300имп в сек
это очень интересно... как при 83 оборотах в секунду при 2500 импульсов на оборот получается 300 импульсов в секунду ? может 207500? Помоему запутались совсем и начнём считать с этих данных Цитата Есть отладочная плата AVR-MT-128 и подключоный к ней энкодер вращения ЛИР-158 2500имп/мин Отсюда 41,66666.... импульсов в секунду, которые по идее и надо считать, а сколько их будет за N- ое количество оборотов , не столь важно
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|