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

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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.10.2021, 00:11   #1
chip
Member
 
Регистрация: 14.05.2016
Сообщений: 46
Вес репутации: 157
chip has much to be proud ofchip has much to be proud ofchip has much to be proud ofchip has much to be proud ofchip has much to be proud ofchip has much to be proud ofchip has much to be proud ofchip has much to be proud of
По умолчанию Новый код для 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
Просмотров: 19
Размер:	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 код Выкл.

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


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


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