Страница 18 из 18 ПерваяПервая ... 812131415161718
Показано с 171 по 178 из 178
  1. #171
    Новичок
    Регистрация
    19.04.2018
    Сообщений
    4
    Вес репутации
    0

    По умолчанию Re: Управление при помощи поворотного энкодера (Rotary Encoder)

    Есть вопрос. Можно ли обрабатывать нажатие на энкодер в функции прерывания?

  2. #172
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,376
    Вес репутации
    10

    По умолчанию Re: Управление при помощи поворотного энкодера (Rotary Encoder)

    Можно конечно.
    У меня есть код для энкодера с обработкой нажатия и использует всего 1 прерывание
    Последний раз редактировалось Chip; 19.04.2018 в 23:16.

  3. #173
    Новичок
    Регистрация
    19.04.2018
    Сообщений
    4
    Вес репутации
    0

    По умолчанию Re: Управление при помощи поворотного энкодера (Rotary Encoder)

    Цитата Сообщение от Chip Посмотреть сообщение
    Можно конечно.
    У меня есть код для энкодера с обработкой нажатия и использует всего 1 прерывание
    Ардуина может обрабатывать только одну функцию прерывания ?
    Буду благодарен если смогу посмотреть на ваш код.

  4. #174
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,376
    Вес репутации
    10

    По умолчанию Re: Управление при помощи поворотного энкодера (Rotary Encoder)

    Ардуина может обрабатывать только одну функцию прерывания ?
    Нет не одну, но прерываний не бывает много их всегда не хватает

    Скетч взял от стробоскопа http://cyber-place.ru/showthread.php?t=2703
    Энкодер можно вращать без нажатия изменяя чавстоту стробоскопа и вращать с нажатием изменяется длительность импульса
    Визуально изменения можно наблюдать на светодиоде D13
    Если что то будет не понятно, разъясню
    PHP код:
    //Скетч от Cyber-Place.ru

    // Выводы ЭНКОДЕРА
    #define CLK 3  // Clock Подключаем к INT1, нельзя переназначать
    #define DT 4  // второй вывод энкодера
    #define SW 5  // switch кнопка энкодера

    #define Min 1 // минимальное значение 
    #define Max 20000 //максимальное значение
    #define led_pin 12        // подключен светодиод
    #define coil_pin A0

    #define step_freq 1       // шаг изменения частоты плавно 0,1гц
    #define step_timelght 100 // шаг приращивания в мкс
    volatile int freq 250// частота в Гц умноженная на 10, для более плавной настройки
    volatile uint32_t paustime_light=2000// время свечения светодиода в мкс
    uint32_t oldcount;
    boolean DT_last// последнее состояние энкодера

    void setup()  
    {
      
    pinMode(CLK,INPUT_PULLUP); // Clock Подключаем к INT1, нельзя переназначать
      
    pinMode(DTINPUT_PULLUP); // второй вывод энкодера
      
    pinMode(SWINPUT_PULLUP); // кнопка энкодера
      
    pinMode(led_pinOUTPUT);    // управление симистором
      
    pinMode(coil_pinOUTPUT);

      
    attachInterrupt(1encoderTickCHANGE); // прерывания от Энкодера
      
      
    DT_last digitalRead(CLK);         // считываем положение CLK
    }

    void loop()
    {
        
    paus=5000000/freq;
        
    digitalWrite(coil_pin1);
        
    digitalWrite(led_pin1);
        
        
    oldcount micros();
        while( (
    micros() - oldcount) < time_light){}   // длительность импульса выдержки          
        
    digitalWrite(led_pin0);
        while( (
    micros() - oldcount) < paus){}  // положительный полупериод
        
    digitalWrite(coil_pin0);
        
        
    oldcount micros();
        while( (
    micros() - oldcount) < paus){} //отрицательный полупериод
    }

    //********************обработчики прерываний Энкодера*******************************
    void encoderTick()     // Обратка прерываний от Энкодера
    {
      
    uint8_t DT_now digitalRead(CLK);       // считываем текущее положение CLK
      
      
    if (DT_now != DT_last && digitalRead(SW))   // если предыдущее и текущее положение не равны, значит был поворот 
      
    {                     
        if (
    digitalRead(DT) != DT_now)    // если DT не равен CLK, значит вращение по часовой стрелке
        
    {                             
          if( 
    freq Max freq += step_freq;    // прибавить 
        
    } else {                                   // если DT равен CLK, значит вращение против часовой
                 
    if( freq Min freq -= step_freq;  // убавить            
                
    }
      } else 
              if (
    DT_now != DT_last && !digitalRead(SW)) //если нажата кнопка и было вращение
              
    {
               if (
    digitalRead(DT) != DT_now)         // если DT не равен CLK, значит вращение по часовой стрелке
                
    {                             
                  if( 
    time_light paus ) { time_light += step_timelght; } // убавить длительность           
                
    } else  if( time_light time_light -= step_timelght;    // прибавить длительность импульса выдержки/
              
    }
              
      
    DT_last DT_now;                   // сохранить положение CLK для следующей проверки

    Последний раз редактировалось Chip; 20.04.2018 в 11:34.

  5. #175
    Новичок
    Регистрация
    19.04.2018
    Сообщений
    4
    Вес репутации
    0

    По умолчанию Re: Управление при помощи поворотного энкодера (Rotary Encoder)

    Цитата Сообщение от Chip Посмотреть сообщение
    Нет не одну, но прерываний не бывает много их всегда не хватает
    А если нужно отработать нажатие на вал энкодера как на кнопку (нажал - отпустил) , функция прерывания будет вызываться только при изменении DT . Значит кнопку энкодера нужно тоже подключить к прерыванию?

    PHP код:
    #define CLK 4  
    #define DT 3
    #define SW 2

    long count 0;
    boolean DT_1DT_2;
    void setup() {
      
    Serial.begin (9600);
      
    pinMode (CLKINPUT);
      
    pinMode (DTINPUT);
      
    pinMode (SWINPUT_PULLUP);
      
      
      
    attachInterrupt(1encoderCHANGE);
      
    attachInterrupt(0encoderPressCHANGE); // если обозначить новое прерывание таким способом ( выдаёт ошибку) 
      
    DT_2 digitalRead(DT);          
    }
    void loop() {
      
    Serial.println(count);
                  
    }
    void encoder() {
      
    DT_1 digitalRead(DT);         
      if (
    DT_1 != DT_2) {           
        if (
    digitalRead(CLK) != DT_1) { 
          
    count ++;                    
        } else {                          
          
    count --;                     
        }
      }
      
    DT_2 DT_1;                   
    }

    void encoderPress() {

     if(!
    digitalRead(SW)) {

     
    count += 10;
     }


  6. #176
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,376
    Вес репутации
    10

    По умолчанию Re: Управление при помощи поворотного энкодера (Rotary Encoder)

    Можно подключить к прерыванию, но можно и в главном цикле обрабатывать

  7. #177
    Новичок
    Регистрация
    19.04.2018
    Сообщений
    4
    Вес репутации
    0

    По умолчанию Re: Управление при помощи поворотного энкодера (Rotary Encoder)

    Вот , как ввести 2-ю функцию прерывания параллельно первой ?

  8. #178
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,376
    Вес репутации
    10

    По умолчанию Re: Управление при помощи поворотного энкодера (Rotary Encoder)

    Прерывание INT0 INT1 работают независимо друг от друга

Страница 18 из 18 ПерваяПервая ... 812131415161718

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 4 (пользователей: 0 , гостей: 4)

Метки этой темы

Ваши права

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