Еще пример из дика по этой методе: вставились пустые строки и
удалены пробелы форматирования кода. Причем если этот код копируешь
и в VScode вставляешь, то форматирование ессно он исправляет, а
пустые строки остаются. Поэтому имхо проще без кнопки вставлять и
можно пример в редакторе с автоформатированием посмотреть без
пустых строк. Firefox, win7.
<p>Еще пример из дика по этой методе: вставлены пустые строки и удалены пробелы форматирования кода<br><pre>#include <stdio.h> #include <stdint.h> #include <stdbool.h> // Параметры фильтрации #define FILTER_WINDOW_SIZE 5 // Размер окна фильтра #define FILTER_THRESHOLD 3 // Порог для принятия решения // Таблица переходов для определения направления вращения const int8_t transition_table[4][4] = { // Текущее состояние: 00, 01, 10, 11 { 0, -1, 1, 0}, // Предыдущее состояние: 00 { 1, 0, 0, -1}, // Предыдущее состояние: 01 {-1, 0, 0, 1}, // Предыдущее состояние: 10 { 0, 1, -1, 0} // Предыдущее состояние: 11 }; // Глобальные переменные для хранения состояния энкодера volatile int32_t encoder_count = 0; // Счетчик импульсов энкодера volatile uint8_t last_state = 0; // Последнее стабильное состояние volatile uint8_t filter_buffer[FILTER_WINDOW_SIZE]; // Буфер для фильтрации volatile uint8_t filter_index = 0; // Индекс в буфере фильтра // Функция для чтения текущего состояния энкодера (A и B каналы) uint8_t read_encoder_state() { // Здесь должен быть код для чтения состояния пинов энкодера // Например, для A и B каналов: // uint8_t state = (PINB & 0x03); // Чтение первых двух битов порта B // return state; return 0; // Заглушка, замените на реальное чтение } // Функция для фильтрации состояния энкодера uint8_t filter_encoder_state(uint8_t new_state) { // Добавляем новое состояние в буфер filter_buffer[filter_index] = new_state; filter_index = (filter_index + 1) % FILTER_WINDOW_SIZE; // Подсчитываем количество каждого состояния в буфере uint8_t count[4] = {0}; for (uint8_t i = 0; i < FILTER_WINDOW_SIZE; i++) { count[filter_buffer[i]]++; } // Определяем наиболее часто встречающееся состояние uint8_t filtered_state = 0; uint8_t max_count = 0; for (uint8_t i = 0; i < 4; i++) { if (count[i] > max_count) { max_count = count[i]; filtered_state = i; } } // Если состояние встречается чаще порога, возвращаем его if (max_count >= FILTER_THRESHOLD) { return filtered_state; } // Иначе возвращаем последнее стабильное состояние return last_state; } // Функция для обработки сигналов энкодера void process_encoder() { uint8_t current_state = read_encoder_state(); // Фильтрация состояния uint8_t filtered_state = filter_encoder_state(current_state); // Определение направления вращения if (filtered_state != last_state) { int8_t direction = transition_table[last_state][filtered_state]; if (direction == 1) { encoder_count++; // Вращение по часовой стрелке } else if (direction == -1) { encoder_count--; // Вращение против часовой стрелки } last_state = filtered_state; } } int main() { // Инициализация (настройка пинов, таймеров и т.д.) // ... while (1) { // Основной цикл обработки process_encoder(); // Вывод текущего значения счетчика энкодера printf("Encoder count: %ld\n", encoder_count); // Задержка для имитации работы в реальном времени // (в реальной системе это может быть реализовано через прерывания) // ... } return 0; }</stdbool.h></stdint.h></stdio.h></pre> </p><p><br></p><p><br></p>