Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.10.2021, 00:11   #1
chip
Junior Member
 
Регистрация: 14.05.2016
Сообщений: 16
Вес репутации: 0
chip is an unknown quantity at this point
По умолчанию Новый код для Arduino энкодера


Собирая один из проектов с использованием encoder я столкнулся с проблемой. Не смог найти нормально работающего кода для Ардуино. Боле менее работающий код требует подключения двух выходов (A, B) к пинам ардуино D2 и D3 которые используются в коде для внешних прерываний INT0 и INT1. Но в моем проекте эти прерывания нужны обработки других сигналов. Скетчи использующие один пин с прерыванием INT0 или INT1, работаю отвратительно и при вращении вала энкодера вылезает очень много ошибок. Код без использования прерываний работает стабильно, но он не работает в фоновом режиме, его нужно встраивать в тело основной программы, что в свою очередь приводит не своевременному срабатыванию обработчика и пропускам при вращении энкодера. Пришлось написать свой код обработки, который исключает описанные выше проблемы. С дребезгом контактов я не стал бороться программно, так как это приводит к задержкам обработки. Проще и надежней использовать керамические конденсаторы.

Схема подключения энкодера к Ардуино
Для считывания сигналов с выходов EC-11, нужно использовать два цифровых входа Arduino.
В схеме подключения я использовал редко используемые мной в своих проектах выводы Arduino(A1 и A2).
Подтягивающие резисторы отсутствуют, так как я использовал внутреннюю подтяжку микроконтроллера.
Конденсаторы нужны для гашения импульсов дребезга контактов. Если у вас новый и хороший энкодер то можно обойтись и без них.

Все используемые в тестировании компоненты из магазина duino.ru
Arduino nano — 1 шт.
Энкодер EC11 — 1 шт.
Соединительные повода — 3 шт.
Керамические конденсаторы 0,1 мкФ — 2 шт.


Нажмите на изображение для увеличения
Название: ec-11.jpg
Просмотров: 2
Размер:	103.0 Кб
ID:	5273

PHP код:
/*
Код написан при содействии магазина DUINO.RU
и является его собственностью.
При публичном использовании ссылка на источник обязательна.
*/
volatile boolean enc_state;
volatile uint8_t lastcomb;
volatile int enc_rotation=0;
//********************************
void setup() 
{
  
pinMode(A1,INPUT_PULLUP); // ENC-A
  
pinMode(A2,INPUT_PULLUP); // ENC-B
  
PCICR =  0b00000010// PCICR |= (1<<PCIE1); Включить прерывание PCINT1
  
PCMSK1 0b00000110// Активировать входы A1, A2  для работы по перыванию  
  
Serial.begin(115200);
}
//****************************************
void loop() 
{
  if(
enc_state// Если энкодер вращался то посмотрим куда и насколько
  
{
    
Serial.println(enc_rotation);
    
enc_state=0//обнуляем статус
  
}
}
//****************************************
ISR (PCINT1_vect//Обработчик запросов прерывания от пинов A0..A5
{
   
uint8_t comb = (bitRead(PINC2)<<1) | (bitRead(PINC1)); //считываем состояние выводов энкодера
 
if (comb == 0//Если оба пина энкодера замкнуты, то проверяем его предыдущее состояние 
 
{
     if (
lastcomb == 1) --enc_rotation//вращение по часовой стрелке
     
if (lastcomb == 2) ++enc_rotation//вращение против часовой
     
enc_state=1// был поворот энкодера    
  
}
  
lastcomb comb//сохраняем текущее состояние энкодера

Ссылка на полную статью https://duino.ru/blog/all/enkoder-ar...kod-obrabotki/

Последний раз редактировалось chip; 31.10.2021 в 17:52.
chip вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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


Текущее время: 11:43. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика