Леонид Иванович (24.08.2010 10:52 - 10:56, просмотров: 1083) ответил Vladimir Ljaschko на Л.И., Ваш код обслуживания ротор-энкодера при обрыве одного сигнала продолжает генерировать инкремент/декремент при вращении в одну сторону, что не совсем верно. Подскажите плз, как проще подправить.
В моём коде такого нет. При обрыве или закоротке одной из фаз при вращении энкодера ничего не происходит.
/----------------------------------------------------------------------------
//Модуль поддержки энкодера
//Энкодер подключается к портам ENC_F1 (фаза 1) и ENC_F2 (фаза 2).
//Функция Encoder_Scan() вызывается в основном цикле.
//Результат обработки энкодера возвращается функцией Encoder_Get().
//----------------------------------------------------------------------------
#include "Main.h"
#include "Encoder.h"
//----------------------------- Константы: -----------------------------------
enum { State0, StateA, StateB, StateAB }; //состояния энкодера
//----------------------------- Переменные: ----------------------------------
static char EncPrev; //предыдущее состояние энкодера
static char EncPrevPrev; //пред-предыдущее состояние энкодера
static char Msg; //сообщение энкодера
//----------------------- Инициализация энкодера: ----------------------------
void Encoder_Init(void)
{
EncPrev = State0; //инициализация предыдущего состояния
EncPrevPrev = State0; //инициализация пред-предыдущего состояния
}
//------------------------- Обработка энкодера: ------------------------------
void Encoder_Exe(void)
{
char EncCur = 0;
if(!Pin_ENC_F1) EncCur = StateA; //опрос фазы 1 энкодера
if(!Pin_ENC_F2) EncCur |= StateB; //опрос фазы 2 энкодера
if(EncCur != EncPrev) //если состояние изменилось,
{
if(EncPrev == StateAB && //если предыдущее состояние StateAB
EncCur != EncPrevPrev ) //и текущее и пред-предыдущее не равны,
{
if(EncCur == StateB) //если текущее состояние StateB,
Msg = ENC_UP; //шаг вверх
else //иначе
Msg = ENC_DN; //шаг вниз
}
EncPrevPrev = EncPrev; //сохранение пред-предыдущего состояния
EncPrev = EncCur; //сохранение предыдущего состояния
}
}
//-------------------------- Чтение энкодера: --------------------------------
char Encoder_Get(void)
{
char m = Msg; //сохранение сообщения энкодера
Msg = ENC_NO; //очистка сообщения энкодера
return(m);
}
//----------------------------------------------------------------------------