Энкодер на ардуино

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Аватара пользователя
Сообщения: 123
Зарегистрирован: Вс дек 13, 2009 01:04:42

Сообщение goodspeedmen »

#include <Wire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
//volatile boolean flag
volatile boolean flag_CW = 0; // переменные тригерра направления.
volatile boolean flag_CWW = 0; // переменные тригерра направления.
boolean enc_A = 2; //переменные входа фазы A.
boolean enc_B = 3; //переменные входа фазы B.
unsigned int update_lcd = 0; //переменная обновления экрана. своеобразное прерывание.
volatile int place_enc; // переменная.
void setup()
{
pinMode(6, INPUT_PULLUP); // настройка пина кнопки на вход, включае поддяжку.
pinMode(enc_A, INPUT);
pinMode(enc_B, INPUT);
attachInterrupt(0, scan_enc, FALLING); //прерывание INT0. 1>0
attachInterrupt(1, flag_reset, RISING); //прерывание INT1. 0>1
lcd.begin(16, 2); //старт lcd.
}
void loop()
{
if (digitalRead(6)==0) //сброс.
{
place_enc = 0;
}
if (update_lcd==0)
{
lcd.setCursor(0,0); //курсор.
lcd.print("Place="); //выводит текст.
lcd.print(place_enc); //выводит значение переменной P.
lcd.print(" "); //выводит выводит пробел.
update_lcd = 2048;
}
update_lcd = update_lcd-1;
}
void scan_enc()
{
if(flag_CW == 1){goto exit;}
if((digitalRead(enc_B)==1))
{
place_enc ++;
flag_CW = 1;
flag_CWW = 0;
}
if(flag_CWW == 1){goto exit;}
if((digitalRead(enc_B)==0))
{
place_enc --;
flag_CWW = 1;
flag_CW = 0;
}
exit:;
}

void flag_reset()
{
if ((digitalRead(enc_A)==1) && (flag_CW = 1))
{
flag_CW = 0;
}
if ((digitalRead(enc_A)==0) && (flag_CWW = 1))
{
flag_CWW = 0;
}
//flag_CW = 0;
}

=================
Ардуино приводит меня в ступор, есть код опроса энкодера у меня он на 1250 импульсов на оборот, он взять из программы написанной на СИ и на Tiny2313 работает без проблем он немного не такой там нет флагов flag_CW flag_CWW там просто есть флаг flag который устраняет ложное срабатывание от тряски на одном месте при большом количестве импульсов это актуально. Но ардуино не пропускает этот код:
======
Arduino: 1.6.9 (Windows XP), Плата:"Arduino Nano, ATmega328"
collect2.exe: error: ld returned 5 exit status
exit status 1
Ошибка компиляции для платы Arduino Nano.
======
Пришлась городить вот эти двойные опросы. Но проблема не только в этом, она в том, что энкодер считает только в плюс? я просто в недоумении в чем проблема sad
Голосовой чат.
Контактная информация:
Реклама
Друг Кота
Сообщения: 19495
Зарегистрирован: Чт фев 20, 2014 18:57:55

Сообщение Morroc »

Какой то нестандартный алгоритм вроде, хотя может просто выглядит так на первый взгляд.
Обычно при изменении состояния смотрят одновременно предыдущее состояние обоих выходов и новое, если эта комбинация похожа на вращение в какую то сторону - регистрируем поворот, если нет - игнорируем.
Есть стандартная библиотека rotary, которую ардуинщики используют во многих проектах - проблем с ней не было ни с механическими ни с оптическими энкодерами.
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 123
Зарегистрирован: Вс дек 13, 2009 01:04:42

Сообщение goodspeedmen »

Зачем проверять то что уже произошло, я имею в виду превывание с 1>0 в фазе А :? нам нужно узнать что в фазе Б.
Голосовой чат.
Контактная информация:
Друг Кота
Сообщения: 19495
Зарегистрирован: Чт фев 20, 2014 18:57:55

Сообщение Morroc »

Это... необычно, может и так можно. Все таки попробуйте стандартной библиотекой для проверки.
Проверяют не то, что произошло, а корректность перехода из старого состояния в новое - некоторые комбинации можно игнорировать несмотря на то, что состояние изменилось - хорошо помогает от дребезга и всякого такого.
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Сообщения: 1920
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

Было бы лучше использоват Gray Code.

Я рекомендую библиотеки Ben Buxton - Rotary encoder handler for arduino. v1.1
Лично я использую 1г. с ардуино на много устройства (меx. енкодер KY-040, 24 ст.). Отказов нет, ошибки нет даже тогда, когда енкодер имеет механические проблемы вследствие експлоатации - код просто пропускает неправильная комбинация.

http://www.buxtronix.net/2011/10/rotary ... perly.html
Контактная информация:
Реклама
Друг Кота
Сообщения: 19495
Зарегистрирован: Чт фев 20, 2014 18:57:55

Сообщение Morroc »

Вот это она и есть, обычно ардуинщики ее используют.
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 123
Зарегистрирован: Вс дек 13, 2009 01:04:42

Сообщение goodspeedmen »

всем спасибо :tea:
Голосовой чат.
Контактная информация:
Ответить

Вернуться в «AVR»