Перейти к содержанию

Подключение и работа с энкодером


Рекомендуемые сообщения

Проблема с состовлением прошивки для энкодера (фирмы PEPPERL+FUCHS по данной программе выдает примерно 330-340 импульсов на оборот) линии данных подключил на int0 и int1 atmega8 прошивку пишe в codevision avr 
Включил прерывания int0 и int1 по любому изменению состояния и повешал на оба прерывания функцию обработки
void enkoder(){
    if((PIND.2==0)&&(PIND.3==0)){input = 0;
    }else if((PIND.2==1)&&(PIND.3==0)){input = 1;
    }else if((PIND.2==1)&&(PIND.3==1)){input = 2;
    }else if((PIND.2==0)&&(PIND.3==1)){input = 3;
    };
    if(input!=buf){
        switch(buf) {
            case 0:{
                if(input == 1) impuls++;
                if(input == 3) impuls--; 
                break;
            }case 1:{
                if(input == 2) impuls++;
                if(input == 0) impuls--;  
                break;
            }case 2:{
                if(input == 3) impuls++;
                if(input == 1) impuls--;  
                break;
            }case 3:{
                if(input == 0) impuls++;
                if(input == 2) impuls--; 
                break;
            };
            buf = input;
        };
    }; 
    ugol=impuls;
};

после того как вращаю энкодер и возвращаю его в обратное положение значение переменной impuls неправельное оно всегда больше 0 и с каждым вращением погрешность все больше 
подскажите что я делаю нетак.

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

так как энкодер стоит в станке нужно чтобы он обрабатывался независимо от программы чтобы непроскочить момент остановки

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

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Как только выполняется break, программа выходит из switch{}. Поэтому строчка

buf = input;

не работает. Её надо передвинуть за следующую фигурную скобку, иначе это присваивание никогда не исполняется.

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

10 минут назад, Yurkin2015 сказал:

Как только выполняется break, программа выходит из switch{}. Поэтому строчка


buf = input;

не работает. Её надо передвинуть за следующую фигурную скобку, иначе это присваивание никогда не исполняется.

после перемещения отроки вообще все перестало работать  теперь 1-2 импульса на 1 оборот энкодера

попробую еще раз проверить осцилографом на дребезг и помехи

Изменено пользователем SHipa
Ссылка на комментарий
Поделиться на другие сайты

Тут точно правильно :

1 час назад, SHipa сказал:

    if((PIND.2==1)&&(PIND.3==1)){input = 2;
    if((PIND.2==0)&&(PIND.3==1)){input = 3;

?

А

buf = input;

вынесите за switch. Иначе, как уже сказали выше, точно ничего работать не будет.

Ссылка на комментарий
Поделиться на другие сайты

Да и много лишних телодвижений, эти input и buf тут совсем не нужны по-моему.

Надо сделать проще. Например так

void enkoder(){
    if(PIND.2==0)
    {
        if(PIND.3==0)ugol++;
        else ugol--;
    }
    else
    {
        if(PIND.3==0)ugol--;
        else ugol++;
    }
}

 

Ссылка на комментарий
Поделиться на другие сайты

Да, чёт я погорячился. Надо использовать разные процедуры прерывания для разных входов.

Вот, пусть int0 для ноги PIND.2. Если на ноге фронт импульса и другая нога PIND.3 = 0, то прибавляем. Если спад импульса и другая нога = 1, то тоже прибавляем. В остальных случаях - вычитаем.

void enkoder0()
{
    if(PIND.2==1) 
   {
        if(PIND.3==0)ugol++;
        else ugol--;
    }
    else
    {
        if(PIND.3==1)ugol++;
        else ugol--;
    }
}

Аналогично для другого прерывания int1 для ноги PIND.3

void enkoder1()
{
   if(PIND.3==1)
    {   
        if(PIND.2==1)ugol++;
        else ugol--;
    }
    else
    {
        if(PIND.2==0)ugol++;
        else ugol--;
    }
}

 

Изменено пользователем Yurkin2015
Ссылка на комментарий
Поделиться на другие сайты

  • 7 месяцев спустя...

энкодер по таймеру

void encoder_read(void)
{unsigned char tempPORT;	
 static unsigned char encoder; 
    tempPORT=PORTB;
    encoder<<=2;
    if(tempPORT&((1<<2)) encoder |=(1<<0);
    if(tempPORT&((1<<3)) encoder |=(1<<1);

      switch (encoder & 0x0F) {
     
      // UP  
      case 0b0001:
      case 0b0111:
      case 0b1000:
      case 0b1110:          
          impuls++;
        break;
        
      // DOWN 
      case 0b0000:
      case 0b0100:
      case 0b1011:
      case 0b1101: 
          impuls--;
        break;

     // nothing happened      
      case 0b0000:
      case 0b0101:      
      case 0b1010:      
      case 0b1111:
            
      // error
      case 0b0011:
      case 0b0110:
      case 0b1001:
      case 0b1100:      
        break;

         default:
         break;
      }   // switch encoder 6 state

}//end void encoder_read(void)

 

Ссылка на комментарий
Поделиться на другие сайты

Мой вариант сканирования энкодера по таймеру, 1 мс достаточно для отлова самых быстрых вращений рукой. При более длинных не проверял.

uint16_t enc, enc_prev;
int8_t turn = 0;

void encoder (void)   // Scan encoder
{
  uint16_t r;

// Энкодер подключен к портам PA0 и РA1 с внешними подтяжками на +5В через 10к резисторы.
// Никакие дополнительные фильтрующие конденсаторы не требуются. 
  r = (uint16_t)GPIOA->IDR & 3;  // Для других портов/битов/МК, применить соответствующую 
				//команду чтения, маску и сдвиг для помещения результата в младшие разряды.
  if (enc_prev != r)
	{
		enc_prev = r;
		enc = ((enc | r) << 2) & 0xFFF;	// применил маску для страховки, можно попробовать без нее
		if (enc == 0x0E1C) // 0x11_10_00_01_11_00, фазы состояний энкодера 3-2-0-1-3
		{
			r = enc = enc_prev = 0;
			turn = 1; // Поворот по часовой стрелке.
		}
			else if (enc == 0x0D2C) // 0x11_01_00_10_11_00, фазы состояний энкодера 3-1-0-2-3
			{
				r = enc = enc_prev = 0;
				turn = -1; // Поворот против часовой стрелки.
			}
				// else turn = 0;  // Энкодер в простое. Обнулить после использования.
	}
}

Естественно, что указанные "против" и "по часовой стрелке" условны, зависят от того, какой вывод энкодера к какому пину МК подключен.

Изменено пользователем Zhuk72
Ссылка на комментарий
Поделиться на другие сайты

мягко сказать странный алгоритм... исходящий из предположений

1. начальное состояние энкодера 3

2. в момент получения кодовой посылки ошибки отсутствуют.

Ссылка на комментарий
Поделиться на другие сайты

Ну и что с того, что 3? Его контакты подтянуты к питанию, стало быть на них "1". Главное отлавливать изменение состояний и их правильную последовательность.

Второй момент не понял. Что вы имели в виду? Если есть сомнения в работоспособности, попробуйте в железе. Железозависимая строка тут только одна, меняется элементарно.

Ссылка на комментарий
Поделиться на другие сайты

1. с того что это работает только на энкодерах с положениями(тактильные щелчки)

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

Ссылка на комментарий
Поделиться на другие сайты

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

On 10.07.2017 at 11:21 PM, SHipa said:

по данной программе выдает примерно 330-340 импульсов на оборот

таких что-то не припомню. А вот 360 импульсов на оборот да (это импульсов на фазу)

On 10.07.2017 at 12:10 AM, Alex said:

Дребезг контактов учитываете ?

там дребезга не будет. Оптроны

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

ну если энкодер "фирменный", то да. Скорее всего да ну

но в аппаратке обычно стоит фильтр на это дело. Причем такецкий фильтр, что даже от обычного ручного энкодера звон отрабатывает. Мега тут полюбому сдуется, как ни крути. Так что смысла качать эту тему на таком железе думаю нет. Можно конечно попробовать воткнуть на каждую фазу по емкости, но тогда фронты могут начать заваливаться на приемлемом подавлении. Ну можно тогда воткнуть ТШ, это поможет. Но все равно надо будет успевать отрабатывать по 360 импульсов на фазу. Причем и по фронту и по срезу. И это еще не известно какая скорость вращения

Оговорка - если мега будет работать только на энкодер, то сколько то оборотов/секунду она сдюжит. Не выполняя основной код )

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

Только что, mail_robot сказал:

Мега тут полюбому сдуется, как ни крути.

ну по поводу меги не знамо, а первоисточник для ПЫХ на приведенный мной код утверждает работоспособность по изменению порта до 13кГц при 4,096МГц тактовой

Ссылка на комментарий
Поделиться на другие сайты

это с учетом основного кода? Или чисто при работе на энкодер и не по прерываниям?

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...