ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
21 апреля
1504104 Топик полностью
Andreas (07.03.2025 09:38, просмотров: 57) ответил General на Нажимаешь кнопку
Еще пример из дика по этой методе: вставились пустые строки и удалены пробелы форматирования кода. Причем если этот код копируешь и в 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>