4_Ust-vo_poluchenia_velichi.../Encoder.h

89 lines
2.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef ENC_H
#define ENC_H
// Определяем бит в регистре PIND для сигнала с клока энкодера.
#define PIND_CLK 0b00010000
// Определяем бит в регистре PIND для сигнала с DT энкодера.
#define PIND_DT 0b01000000
int encoder_state, prev_encoder_state = 3, state = 1, total_state;
void read_encoder_state(void)
{
int pin_clk_2, pin_dt_2;
// Устанавливаем начальные значения переменных равное 0
pin_clk_2 = 0;
pin_dt_2 = 0;
// Устанавливаем значение PIN_CLK_2 в зависимости от установки бита PIND_CLK в PIND
pin_clk_2 = (PIND & PIND_CLK) ? 1 : 0;
// Устанавливаем значение PIN_DT_2 в зависимости от установки бита PIND_DT в PIND
pin_dt_2 = (PIND & PIND_DT) ? 1 : 0;
// Получаем состояние энкодера
encoder_state = (pin_clk_2 << 1) | pin_dt_2;
// Проверяем, изменилось ли состояние энкодера
if (encoder_state != prev_encoder_state)
{
switch (encoder_state)
{
case 0: // Поворот против часовой стрелки (CCW)
if (prev_encoder_state == 2)
state++;
else if (prev_encoder_state == 1)
state--;
break;
case 1: // Поворот по часовой стрелке (CW)
if (prev_encoder_state == 0)
state++;
else if (prev_encoder_state == 3)
state--;
break;
case 2: // Поворот против часовой стрелки (CCW)
if (prev_encoder_state == 3)
state++;
else if (prev_encoder_state == 0)
state--;
break;
case 3: // Поворот по часовой стрелке (CW)
if (prev_encoder_state == 1)
state++;
else if (prev_encoder_state == 2)
state--;
break;
}
// Устанавливаем значение prev_encoder_state равным текущему состоянию энкодера
prev_encoder_state = encoder_state;
if ( state == 4 )
{
total_state++;
state=0;
}
if ( state == -4 )
{
total_state--;
state=0;
}
}
}
void encoder_setup(void)
{
// Настройка портов ввода-вывода
DDRD = 0x00;
PORTD = (PIND_CLK + PIND_DT);
}
int encoder_value(void)
{
// Читаем состояние энкодера
read_encoder_state();
return total_state;
}
//#include "enc.cpp"
#endif /*ENC_H*/