Еще пример из дика по этой методе: вставились пустые строки и
удалены пробелы форматирования кода. Причем если этот код копируешь
и в 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>