энкодер и ускорение

fsdb
Offline
Зарегистрирован: 24.10.2015

Добрый день!

Вопрос в следующем.

Есть обычная крутилка- энкодер.

нужно точно задавать значения в диапазоне от 0 до 10000 только при помощи энкодера.

Все дело в том что шаг мне нужен 1 для точной настройки, но сами понимаете 10тыс импульсов ручками не накрутишь.

Я хочу попытаться сделать нечто вроде при активном изменении прибавлять не по 1 а с каким нибудь коэффициентом.

я пытался при помощи millis() как то вырулить но не получается потому что нет ясного понимания как это реализовать.

Если крутить постоянно то разница между t1 и millis() равна примерно 103мс; Где t1 это когда я в последний раз крутил ручку..

Думаю может как то нужно еще привязаться к посчету - сколько раз я *быстро* крутил ручку и потом только вводить коэффициент.

Подскажите кто что думает на эту тему

 

 

fsdb
Offline
Зарегистрирован: 24.10.2015

Еще момент - бесконечно *быстро* тоже не получится рукой вращать, ведь нужно через менее чем оборот перехватывать крутилку

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

сделайте как делают все, нажимаешь кнопку энкодера и идёт с ускорением раз в 100, повторное нажатие возвращает в нормальный режим

fsdb
Offline
Зарегистрирован: 24.10.2015

if (PosMenu==2) {  
if (encoder1Pos>encoder1PosOld)  {
MotorCnt2=0;
if ((millis()-t3)<120) {MotorCnt1++;} else {MotorCnt1=0;}
if (MotorCnt1>1) {MotorKof=25*MotorCnt1;} else {MotorKof=1;}

Serial.print(millis()-t3);
Serial.print(" ");
Serial.println(MotorKof); 

MotorSpeed=MotorSpeed+1*MotorKof; t1=0; t3=millis();}




if (encoder1Pos<encoder1PosOld)  {
MotorCnt1=0;

if ((millis()-t3)<120) {MotorCnt2++;} else {MotorCnt2=0;}
if (MotorCnt2>1) {MotorKof=25*MotorCnt2;} else {MotorKof=1;}

Serial.print(millis()-t3);
Serial.print(" ");
Serial.println(MotorKof); 

MotorSpeed=MotorSpeed-1*MotorKof; t1=0; t3=millis();
}
if (MotorSpeed<0) {MotorSpeed=0;}
if (MotorSpeed>30001) {MotorSpeed=30000;}
}
//Скорость

ua6em     - у меня кнопка это уже вход в меню для настройки скорости вращения двигателя. повторная кнопка -выход из меню

вот код он работает но не так мягко как хотелось бы. возникают сложности допустим когда я докрутил до 3253 и нужно докрутить до 3270 и тут неожиданно получаю перелет на 50... может по мягче как сделать можно.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

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

Эргономика должна быть эргономной )))

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Вообще-то еще проще. У вас  0 до 10000. Но лучше 0000-9999. Так что лучше сделать так . по часовой -против от 0 до 9 тысяча, потом кнопка от 0 до 9 сотен , от 0 до 9 десяток, от 0 до 9 единиц и потом щелчек и число введено.  

 Как вариант поворот может быть выбирать от 0 до 9 и <-   (вернуться на разряд назад)

                         sw           sw         sw          sw
Упрощеная схема (0..9,<-)-->(0..9,<-)-->(0..9,<-)-->(0..9,<-)-->введено

 

Nosferatu
Offline
Зарегистрирован: 04.11.2012

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

Если был импульс энкодера то:
коэффициент += коэффициент;

Периодический таймер:
коэффициент -= коэффициент / делитель;

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Nosferatu пишет:

Можно коэффициент увеличивать с каждым импульсом энкодера на величину коэффициента, а уменьшать через временной период, тоже на коэффициентно, но деленный на делитель. 

Проще говоря , не линейную сделать шкалу ,а логарифмическую. Ну как номиналы резисторов.

https://goo.gl/dafAIk

1,2,3,5,7,10,15,22,33,47,68,100,150,220,330,470,680,1000,1500,2200,3300,4700,6800,9999

 

fsdb
Offline
Зарегистрирован: 24.10.2015

спасибо за ответы. все таки сделал по примеру Nosferatu. Требуется оперативность в изменении скорости. в целом нормально вышло.

Logik
Offline
Зарегистрирован: 05.08.2014

Я делаю с ускорением иногда. Код из моей либы.

#ifdef ENCODER_ACCELERATION
  if (pCallBackAcceleration)
  {
     switch (d=pCallBackAcceleration((millis()&0xffff)-Time, Flags))
     {
       case 0:        
           Flags&=1; //очистка счетчика количества "быстрых" тактов
           break;
       case 1:
            Flags+=2;  //накапливаем счетчик быстрых событий
     }
  }
  else
  {
 
  /* Ускорение при быстром вращении*/
  if ((millis()&0xffff)-Time<10) //"быстрый" такт 
  {
      if (bit_is_set(Flags,6)) //дотикал счетчик количества "быстрых" тактов
          d=100;
      else
          Flags+=2;    //счетчик количества "быстрых" тактов
  }
  else
      Flags&=1; //очистка счетчика количества "быстрых" тактов
  }
  Time=millis();
#endif /* ENCODER_ACCELERATION */

Там два варианта. Если задае калбек то он определяет когда и на сколько ускорятся,, это чтоб либу не переписывать под каждый случай. Если он не задан - то после 32 быстрых такта, т.е быстрей 10мсек инкремент становится 100 вместо 1. Первый небыстрый такт возвращает инкремент в 1. Это переменная d, в единицу она установлена до фрагмента. 

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

fsdb
Offline
Зарегистрирован: 24.10.2015

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

arduinec
Offline
Зарегистрирован: 01.09.2015

Энкодер можно крутить и в нажатом состоянии. В ненажатом - у меня прибавляются/отнимаются единицы, а в нажатом - сотни.

MacSim
Offline
Зарегистрирован: 28.11.2012

или по нажатию кнопки выбирать разряд который меняем

selevo
selevo аватар
Offline
Зарегистрирован: 21.12.2013

fsdb

а где код,я тоже  хочу.

Может кто  проверял уже, в курсе поддерживает ли  вот это библиотека  : https://www.pjrc.com/teensy/td_libs_Encoder.html

Ускорение ?

Пока проверить нет возможности

 

fsdb
Offline
Зарегистрирован: 24.10.2015

selevo  - практика показала что практичней сделать кнопки. не нужно постоянно крутить, а ускорение привязал к времени удерживания кнопки