Например, для космического спутника, да? это видимость защиты от сбоев, увы...
Допустим роботизированные такси везет пассажиров со скоростью 100км/ч и в какой-то момент в одном из множества его электронных модулей происходит сбой и он перегружается, возможно целую ms. И берем худший сценарий, в это время тормоза не работают, топливо в двигатель не подается и т.п.. Каких катастрофических последствий можно ожидать учитывая, что за 1 ms машина проедет почти 3см? А космический спутник летит в пустоте, если у него двигатели и есть, то они включаются в редких случаях когда нужно курс подкорректировать. Ему можно всю электронику на неделю отключить и ничего с ним не случится.
если ожидается наводка на линии, то гарантии, что она не обойдёт программный алгоритм нет абсолютно никакой
наводки обычно подчиняются некоторым законам, как и наблюдаемые сигналы. предположим что наводки имеют вид коротких иголок длительностью менее 1mS а импульсы сигнала - минимум 100mS при этом простое сэмплирование по таймеру может принять иголку за сигнал а упомянутый выше алгоритм - нет.
приведенный пример - вполне реален, прямо сам наблюдал именно такие наводки, связанные с работой частотников и фазовых тиристорных регуляторов.
ARV писал(а):
при значительных наводках на линии беспокоиться надо совсем о другом, да... например о том, чтобы устройство вообще осталось целым.
ну это прямо очень притянуто за уши, одно дело тупо уменьшить сопротивление цепи чтоб уменьшить снимаемые наводимые помехи, что не всегда возможно по разным причинам, вроде энергопотребления или свойств выходов итп и совсем другое - добавить нелинейное сопротивление вроде tvs чтоб предотвратьть выход за опасные токи на gpio скажем.
Например, для космического спутника, да? это видимость защиты от сбоев, увы...
Допустим роботизированные такси везет пассажиров со скоростью 100км/ч и в какой-то момент в одном из множества его электронных модулей происходит сбой и он перегружается, возможно целую ms. И берем худший сценарий, в это время тормоза не работают, топливо в двигатель не подается и т.п.. Каких катастрофических последствий можно ожидать учитывая, что за 1 ms машина проедет почти 3см? А космический спутник летит в пустоте, если у него двигатели и есть, то они включаются в редких случаях когда нужно курс подкорректировать. Ему можно всю электронику на неделю отключить и ничего с ним не случится.
авария роботизированного такси даже с учетом возможных компенсаций пострадавших - это в самом крайнем случае сотня миллионов, а отказ спутника - это уже миллиарды. а если речь о, например, роботе на Марсе, так сотни миллиардов. И еще большой вопрос, что лучше, если робот на Марсе из-за сбоя 2 секунды будет ехать не вправо, а влево, или зависнет на месяц или навсегда...
а дребезг, который "может 100 мс длиться", не притянут? а рассуждения о "некомфортной задержке в 100 мс" - не притянуты? у вас есть электронный секундомер? вы попробуйте, для начала, "отмерить" им 0,1 секунды - легко получится? а если учесть, что на самом деле дребезг и 15 мс редко длится, то... не тяните уши
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
Просить готовую библиотеку - это подход ардуинщиков. Им алгоритм ненада, им нада библиотека. Ее втулил - и все работает. И даже думать не нада. Вон на 21 странице вы выклаадывали вариант на базе Гайверовской либы. Там все просто - подключил, кнопку скормил - и думать не нада. Все работает само. It's a magic! А потом нужно будет к МК подключить 12 кнопок.... Фигня вопрос - выделяем на каждую кнопку отдельный пин порта. Делаем 12 экземпляров кнопки средствами гайверовской библиотеки. Каждый экземпляр - 12 байт флагов да 20 байт переменныхСпойлер
А потом приезжает из Китая клавиатура - а там матрицы 3 х 4.... Воблин. А как же ее подключить к библиотеке??? Это, наверное, нужно искать другую библу, для матричных клавиатур...
Поэтому правильно не библиотеку искать/просить/писать, а алгоритм. Вплоть до того, что карандашиком на бумажечке. Разрисовать, какговорил КРАМ, временную диаграмму, натянув ее на свои кнопки либо матрицу кнопок. И когда будет готов алгоритм - он прекрасно ляжет на любой язык программирования и любой МК.
Возможно, этот алгоритм разложится на простые "кубики", которые могут применяться и в других случаях...
Но для определения пути опроса кнопок, повторю еще раз, нужна постановка задачи. Универсальных алгоритмов с идеальной реализацией на все случаи жизни не существует.
А, есть еще вариант. Спросить код у ИИ. Для примера я попросила код опроса 6 кнопок на порту В с подавлением дребезга. Копилот мне выдал вот такое:Спойлер
#define DEBOUNCE_DELAY 100 // Задержка подавления дребезга в мс
volatile uint8_t button_state = 0; // Состояние кнопок volatile uint8_t button_debounced = 0; // Состояние кнопок после подавления дребезга volatile uint8_t button_changed = 0; // Флаг изменения состояния кнопок
ну да, как железный купол израиля, до первой атаки..
ну почемуже, нормальный разработчик ориентируется на статистику в тестах и в реальных боевых условиях а не на какието умозрительные сценарии. подобная статистика имхо единственный критерий применять ли какойто прием или в мусорку, независимо от того насколько хорошо представляешь в деталях как это работает и насколько умеешь обьяснить аппонентам что это единственно правильная интерпритация реальности
аппаратная ecc коррекция например как по мне - вполне работает . а для 1 проекта я делал софтовую проверку содержимого sram корректирующими кодами и уход в инициализацию в случае если уже некорректируемые ошибки. кстати и после ресета полезны такие проверки чтоб понимать сохранились данные в sram или например был критичный провал по питанию. это реально (доказано статистикой) позволяет уменьшить количество сбоев с потерей данных.
у наводок - в зависимости от того, в каком месте бороться: если рассматривается устройство целиком, то кмплитуда (влияет на схемотехнику) длительность и средняя частота (влияют на мощность и/или тип поглощающих наводку элементов), если программа, то предполагаемые длительность импульса и средняя частота следования, ещё могут рассматриваться дополнительные параметры, например следование пачками или возможность предсказания/избежания помехи (например импульс от реле, переключаемый этим-же МК или применение сна для снижпния наводок на собственный АЦП МК) - от этого будет зависеть применённое решение (амплитуды тут нет, т.к. рассматриваются тьлько наводка способная исказить двоичный сигнал, если наводка способна повредить МК, то это вопрос уже не к программе)
Добавлено after 13 minutes 56 seconds: помню пришлось на шумной линии вообще собирать статистику: опрашиваем ногу, если 0 {смотрим переменную если не 0 уменьшаем, иначе взводим флаг нажатой кнопки} иначе {смотрим переменную, если не 0xFF приращиваем, иначе сбрасываем флаг нажатой кнопки} (вместо 0xFF может быть другое число) т.е. тупо "перетягивание каната"...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
// Считываем текущее состояние кнопок uint8_t current_state = PINB;
// Если состояние не изменилось в течение нескольких циклов, считаем его стабильным if (current_state == previous_buttons) { debounce_counter++; } else { debounce_counter = 0; // Сброс счетчика, если состояние изменилось }
// Если прошло достаточно времени для подавления дребезга if (debounce_counter >= (DEBOUNCE_DELAY_MS / 10)) { debounced_buttons = current_state; debounce_counter = 0; // Сброс счетчика после обновления состояния }
// Сохраняем предыдущее состояние для сравнения previous_buttons = current_state; }
int main(void) { DDRB = 0x00; // Настройка всех пинов PORTB как входы PORTB = 0xFF; // Включение внутренних pull-up резисторов
// Инициализация таймера 0 timer0_init();
sei(); // Включаем глобальные прерывания
while (1) { // Основной цикл программы // Здесь можно добавить логику обработки дебаунсированного состояния кнопок for (uint8_t i = 0; i < 8; i++) { if (!(debounced_buttons & (1 << i))) { // Кнопка i нажата (если используем pull-up резисторы) // Добавьте нужную логику обработки } } }
return 0; }
offtop: блин, теперь ведь тупо можно у ИИ спрашивать "как фьюзы задать" или "как проинициализировать USART на 9600 при кварце 4МГц" и копипастить... хоть в петлю...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
кнопки могут быть на разных портах. а еще некоторые датчики дают 1 или 0 при срабатывании. легко прописать как кнопку и так же легко обрабатывать в приведенной мной выше библиотеке, состряпанной из Гайвера.
кстати, о кнопках и ИИ. вот часть моего диалога с китайским ИИ, почитайте, весело Спойлер
ARV писал(а):
ты не прав. дребезг - это не случайное событие, а следствие ИЗМЕНЕНИЯ состояния кнопки. поэтому, если между опросами начнется дребезг, значит, состояние кнопок начинает меняться. в этом случае считывание ЛЮБОГО значения из-за дребезга либо будет корректно отражать новое состояние кнопки, либо покажет предыдущее состояние, которое корректно будет считано при следующем опросе, т.к. к тому времени дребезг однозначно завершится.
Qwen2.5-Plus писал(а):
Вы абсолютно правы в том, что дребезг — это следствие изменения состояния кнопки (при её нажатии или отпускании). Давайте более детально разберём вашу логику и уточним, почему в некоторых случаях простое считывание состояния каждые 50 мс действительно может быть достаточно надёжным для подавления дребезга.
Почему ваш подход работает? Длительность дребезга : Типичная длительность дребезга контактов кнопок составляет от нескольких миллисекунд до примерно 20 мс для большинства обычных механических кнопок. Если период опроса (например, 50 мс) значительно больше максимальной длительности дребезга, то можно быть уверенным, что к моменту следующего опроса дребезг уже завершится. Изменение состояния кнопки : Когда кнопка нажимается или отпускается, дребезг возникает только в этот короткий переходный период. Если опрос происходит с интервалом 50 мс, то есть два возможных сценария: Опрос происходит до начала дребезга: в этом случае будет зафиксировано предыдущее стабильное состояние. Опрос происходит во время или после дребезга: в этом случае будет зафиксировано новое стабильное состояние, так как дребезг уже завершился к моменту следующего опроса. Надёжность метода : Поскольку период опроса (50 мс) намного больше максимальной длительности дребезга (до 20 мс), можно быть уверенным, что любое зафиксированное состояние будет либо старым стабильным значением, либо новым стабильным значением. Промежуточные "дребезжащие" значения не будут учитываться, так как они просто не попадут в момент опроса. Важные замечания Хотя ваш подход действительно работает в большинстве случаев, есть несколько факторов, которые стоит учитывать:
Качество кнопок : Некоторые кнопки могут иметь более длительный дребезг (например, старые или некачественные кнопки). Если длительность дребезга превышает 50 мс, метод перестанет быть надёжным. Для таких случаев рекомендуется использовать дополнительную логику проверки стабильности, как описано ранее. Частота опроса : Период опроса должен быть chosen таким образом, чтобы быть значительно больше максимальной длительности дребезга. Например, если вы знаете, что дребезг может длиться до 20 мс, то период опроса 50 мс является безопасным выбором. Однако, если вы хотите повысить точность обнаружения изменений состояния кнопок, можно уменьшить период опроса (например, до 10–20 мс). Отклик системы : Чем реже происходит опрос, тем медленнее система будет реагировать на изменения состояния кнопок. Например, если период опроса равен 50 мс, то максимальное время реакции на нажатие кнопки также составит 50 мс. Заключение Вы совершенно правы: если период опроса значительно больше максимальной длительности дребезга (например, 50 мс при дребезге до 20 мс), то простое считывание состояния порта каждые 50 мс действительно будет достаточно для подавления дребезга. Этот метод работает потому, что:
Дребезг возникает только в переходном периоде (при нажатии или отпускании). К моменту следующего опроса дребезг уже завершается, и фиксируется новое стабильное состояние. Тем не менее, для повышения надёжности и универсальности системы (например, при использовании кнопок с более длительным дребезгом) можно добавить дополнительную логику проверки стабильности, как описано в предыдущих примерах кода. Это позволит работать с широким диапазоном кнопок без необходимости точно знать их характеристики.
Спасибо за ваше наблюдение! Ваш подход — это простой и эффективный способ решения задачи в большинстве практических ситуаций.
болтливый он, однако
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
кнопки могут быть на разных портах. а еще некоторые датчики дают 1 или 0 при срабатывании. легко прописать как кнопку и так же легко обрабатывать в приведенной мной выше библиотеке, состряпанной из Гайвера.
О чем я и говорю. Скоро вообще думать не надо будет. Библиотеки на все случаи жизни. А если нету, то попросим ИИ - он состряпает. Чисто принцип современной разработки. Взять готовое, быстро допилить под задачу, отчитаться об выполнении. Хомяк, хомяк - и в продакшн. А не хватит флеша или памяти - то надо взять камень потолще и привязать покрепче.
Ivanoff-iv писал(а):
опрашиваем ногу, если 0 {смотрим переменную если не 0 уменьшаем, иначе взводим флаг нажатой кнопки} иначе {смотрим переменную, если не 0xFF приращиваем, иначе сбрасываем флаг нажатой кнопки} (вместо 0xFF может быть другое число) т.е. тупо "перетягивание каната"...
Я об этом методе писала несколько страниц назад... Принцип петли гистерезиса. Один из моих любимых для кнопок.
У меня немного другая задачка: есть энкодер и 2 провода к нему, причём один из них + питания .мк и это не измениь, как передать информацию с энкодера? сейчас просто стоит резистор на энкодере и один контакт замыкает сигнальный провод на плюс напрямую, а второй - через резистор, на МК (тини2313 - без АЦП) одна нога (a) на прямую, а вторая (b) - через делитель на минус и получаем при вращении в одну сторону последовательность: 0|a|ab|0|a|ab|... а при вращении в другую: 0|ab|a|0|ab|a... нога а сидит на прерывании по фронту и при приходе её прерывания для определния направления вращения остаётся проверить ногу b (я отслеживаю только переходы 0->a и 0->ab). Но в этом методе есть недостаток: при покачивании энкодера около положения 0 можно добиться эффекта вращения в ту или другую сторону не вращая энкодер. Кроме того эта конструкция имеет низкую защищенность от помех (и это пожалуй наибольшая проблема...) Может кто подсказать вариант для улучшения ситуации?
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
при покачивании энкодера около положения 0 можно добиться эффекта вращения в ту или другую сторону не вращая энкодер.
было у меня так.. и даже само переключалось, когда энкодер "подвисал".
удалил тут свои художества
Добавлено after 4 minutes 13 seconds: Вобщем если короче то нужно так код организовать, что бы нельзя было вернуться в цикл опроса, если хотябы один канал энкодера замкнут))
в таймерном прерывнии: храним 1 байт данных (обычно несложно регистр выделить под такое. обзавем EcSeq). если младшие 2 бита EcSeq совпадают с 2мя битами входов a,b то выходим из прерывания. иначе -задвигаем новые 2 бита входов a,b в EcSeq выходим из прерываниия (ну или доделываем задачи таймера.)
в коде реакций на события: сравниваем EcSeq с паттернами соответствующим шагом в одну или другую сторону при несовпадении идем дальше иначе сбрасываем EcSeq в 0 и уходим на +1 или -1 реакцию
при этом паттерны могут быть до 8 бит (а можно и до 16 бит если параноически подойти.) скажем 0b00011100 и 0b00111000
говёные энкодеры - это жопа. у меня "осциллограф" есть от минитварей, там 2 энкодера. Один нормальный, а второй генерит море кликов в рандомную сторону. Мне пришлось искать похожие энкодеры и поменять, ибо бороться с дребезгом было нереально. Либо делать "прокладку" между энкодером и основной платой ослика, либо... менять энкодер. Второе оказалось проще.
И борьба с эффектом, как у Ivanoff-iv - тут комплексно надо. 1. по возможности прочистить и смазать энкодер, его контактные пары. По возможности - сменить на нормальный/более новый 2. В программном обработчике игнорировать запрещенные состояния для каждого состояния энкодера. Т.е. кроме отслеживания 0->a и 0->ab еще проверять, что бы после 0->a обязательно было "ab", и после 0->ab обязательно было "а". Иначе игнорировать повторные "a" и "ab"
то нужно так код организовать, что бы нельзя было вернуться в цикл опроса, если хотябы один канал энкодера замкнут))
продолжу свою мысль)) Не нужно возвращаться в цикл опроса. пока энкодер подвисший. Но как тогда быть? Ждать когда он разомкнётся? Тогда кнопки не будут опрашиваться
Поэтому создаём псевдоцикл, например LOOP_a, в котором всё как в основном цикле, но энкодер тестируется только на размыкание контактов. И как только они разомкнулись - переходим в основной цикл.
Тогда нам пофиг будет залип энкодер или нет
Добавлено after 1 minute 27 seconds: При выходе из выполнения проверяем контакты энкодера и прыгаем в плевдоцикл если залипшие))
Just_Fluffy, 1) энкодер ещё не износился, он от старого импортного бумбокса, но до сих пор фронты не дробит. 2) тогда можо качать чуть дальше 0->a->0->ab->0->a... 0->a алгоритм защелкнулся, ждёт ab a->0 пока ждёт 0->ab дождался, сделал шаг вперёд ab->0 исходное состояние энкодера
если при a->0 сбрасывать ожидание, да и вообще при 0 сбрасывать все ожидания... тогда норм Но прерывание уже не получится использовать..., буду использовать свой микродиспетчер потоков и организовывать псевдопараллельное исполнение кода.
Это была моя вторая поделка на МК (если не считать ардуинских вида "собрал - побаловался - разобрал") с тех пор я много нового узнал, перепишу... осталось разобраться с наводками... как никак МК напрямую к сетевой фазе подключен, да импульсный БП и 5 симисторов рядом... плохо, что конденсатор на линию передачи не поставить - он будет фронты сглаживать, нарушая работу детектора энкодера... поэтому придётся программно... может ещё к детектору 0 приурочить, чтобы в наименее шумную часть синусоиды (на спаде) его опрашивать... впринципе 100 раз в секунду для энкодера - не слишком редко...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Ivanoff-iv, shonty, Just_Fluffy, а зачем делать кучи разных проверок по цепочке (некий замысловатый алгоритм проверок), если все идеально сводится к 2м сравнениям с байтами-паттернами задвинутых в виртуальны сдвиговый регистр изменений сэмплов со входов ? как я выше написал.
или в запутанных алгоритмах есть чтото теплое-ламповое, что недоступно скучным любителям булевой алгебры ?
там же любые аномалии в последовательности сэмплов - это просто несоответствие паттерну и все - сразу отсекается 1 сравнением. 1 инструкцией avr! тоесть в расчет берутся только удачные последовательности вроде 0|a|ab|0 (паттерн ну скажем 0b 00 10 11 00, если задвигать пары сэмплов входов a,b со старших к младшим битам) а при вращении в другую: 0|ab|a|0 (паттерн 0b00111000)
Последний раз редактировалось AlexS4 Вт фев 18, 2025 09:35:12, всего редактировалось 2 раз(а).
да так изначально и работало на 2-х сравнениях. Но понадобилось 3-е сравнение перед выходом в основной цикл опроса. Но это из за "особенностей" некоторых энкодеров))
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения