Проблема с энкодером???
-
Andreyfff
Проблема с энкодером???
Доброго времени суток всем. История: недавно заметил, что каретка при печати стала чуть дальше заходить на парковки при сплевывании чернил, появился звук ударов об парковки. Утром следующего дня (т.е. сегодня) включил принтер, отправил на печать файл и ПРОБЛЕМА: появились звуки похожие на удары, задергалась каретка, печатать начал как будто идет в разнос бидирекшен (видно что печать уходит вправо), каретка стала возвращаться еще правее пока не въехала в стену…принтер выдал ошибку и попросил выключить питание. Прочитал много тем на форуме и:
1. Снял и протер ленту энкодера- не помогло
2.Перевернул ленту-печать начала уходит влево, все те же удары, печатает вразнос. Ждать пока ударится в левый борт не стал, выключил.
3.Снял опт.датчик протер-без изменений.
4.Перевернул ленту обратно-без изменений.
5.Добрался до движка-он в норме.
Почему то складывается впечатление, что неисправен опт.датчик. Из сервис меню пробовал запустить тест линейного энкодера-выдет remоve the sheet. Кто нибудь знает что это означает?
-
Две Головы
Сообщение Две Головы » 26 май 2010 18:39
трос не меняли в последнее время? я когда поменял такое было. Что помогло не знаю, делал вроде тоже, что и Вы. датчик протирал, ленту протирал. Трос ослабил слегка…
-
Vadim_S
Сообщение Vadim_S » 27 май 2010 08:52
Трос не меняли (это я вчера писал). Сегодня утром включил и при замере материала он на обратном пути останавился с ошибкой. Цать раз пробовал, каждый раз останавливается как только движение обратно начинает. Как опт датчик проверить?
-
Vadim_S
Сообщение Vadim_S » 27 май 2010 13:12
Что нет ни у кого никаких соображений? Иль времени ни у кого нет? Господа ЗЕНОНовцы, откликнитесь пжлста! Если посоветовать нечего, то кинте хотя б цены датчика и ленты на почту иль в личку.
-
Igrek
- Старожил

- Сообщения: 2524
- Зарегистрирован: 16 мар 2006 16:28
- Последний визит: 26 янв 2023 17:27
- Изменить репутацию:
Репутация:
Голосов: 58 - Откуда: Ярославль
Сообщение Igrek » 27 май 2010 15:22
Установите в меню что материал прозрачный. Он измерять материал не будет. Но у вас скорее всего проблема с креплением тросика к каретке голов. проверьте. если оно ослабло, то может такое выдавать как у вас.
-
Vadim_S
Сообщение Vadim_S » 27 май 2010 15:47
Крепление троса к каретке сразу проверил — нормально было и еще подтянул. Не измерять материал не выход- печать разбегается, принтер в стену головой бьется. Подскажите кто нить как проверить опт датчик? Где инженеры ЗЕНОНА? Сегодня звонил, так и не ответили. Хоть напишите что нить. Кстати станочег у ВАС брали.
-
Vadim_S
Сообщение Vadim_S » 27 май 2010 18:39
При отключенном датчике замера материала катаем каретку кнопками < > принтера — движок ведет себя нормально, даже если нагрузить его пытаясь остановить каретку рукой.Нет ни проскоков ни сбоев в работе движка.Но только жмем кнопку SETUP, чтоб он ушел домой, каретка резкими рывками долетает до стенки и ошибка. ????? Опт датчик сняли, при включенном принтере он светится (значит работает?), на него приходит 5V. Закрывали приемник картоном, но изменений на выходе никаких (сдох приемник?). Дозвонились до ЗЕНОНа, там сказали ,что вряд ли опт датчик, скорее движок.(звонил шеф, возможно вышеизложенного ребятам из ЗЕНОНа не говорил, поэтому и грешат на движку??).
В общем если есть какие мысли — пишите! Станок пока разобран, мона поэксперементировать! ![]()
-
Igrek
- Старожил

- Сообщения: 2524
- Зарегистрирован: 16 мар 2006 16:28
- Последний визит: 26 янв 2023 17:27
- Изменить репутацию:
Репутация:
Голосов: 58 - Откуда: Ярославль
Сообщение Igrek » 27 май 2010 21:21
В двигателе есть свой оптический энкодер. Это круг с насечками и датчиком. Он отвечает за движение каретки вправо-влево. Крепится снизу двигателя. В принципе можно снять крышку и посмотреть. Бывает, что болт ослабевает и он начинает касаться датчика.Происходит сбой. Снять его не удастся. При откручивании болта кружок трескается. В общем надо посмотреть есть ли зазор между кружком и стенками датчика.
-
Vadim_S
Сообщение Vadim_S » 28 май 2010 11:19
С энкодером двигателя все норм, сразу это проверили.
-
Александр Романов
- Старожил

- Сообщения: 9211
- Зарегистрирован: 14 фев 2005 10:21
- Последний визит: 30 ноя 2022 13:22
- Изменить репутацию:
Репутация:
Голосов: 65 - Откуда: Москва
Сообщение Александр Романов » 28 май 2010 20:11
Vadim_S
Проблема — пишем на форум
Из вышеописанного следует, что проблема с энкодером: либо встроенном в двигатель (как заметил уважаемый Igrek), либо с линейным, как предположили Вы. Поскольку по прошествии двух дней точно причину установить не удалось с помощью тех средств, что были у Вас, остается идти методом исключения и последовательно менять все звенья цепи, начиная с самого дешевого, т.е. с датчика линейного энкодера.
Мое мнение, все же движок.
-
Гнедой Виталий
- Завсегдатай

- Сообщения: 962
- Зарегистрирован: 17 июл 2007 12:43
- Последний визит: 28 янв 2023 12:06
- Изменить репутацию:
Репутация:
Голосов: 42 - Откуда: г. Орел
Сообщение Гнедой Виталий » 29 май 2010 10:17
2Vadim_S
Ну чтож, начнем ![]()
1. Для проверки датчика энкодера в системном меню есть пункт,
Andreyfff писал(а): (→)Из сервис меню пробовал запустить тест линейного энкодера-выдет remоve the sheet. Кто нибудь знает что это означает?
Вы делали все правильно, а фраза обозначает «уберите лист», просто в принтере 2 датчика наличия бумаги задний и передний, откройте их. Но подозреваю что дело не в энкодере и его датчике. Прежде чем проверять датчик энкодера читаем п.2
2. Проведите процедуру «Limit position», для этого при выключенном принтере (главный тумблер включен), удерживая влево,вверх,вправо нажмите вкл. При этом бумаги не должно быть, блок голов должен стоять на парковке но не до упора вправо. После того как нажмете энтер блок чутка пошоркается и попросит вручную передвинуть до упора влево, двигаете рукой (без фанатизма) пока отрезной нож не опуститься, нажимаете энтер. Блок возвращается на парковку чуть-чуть двигается влево-вправо, на дисплее высвечивается комплит.
Проверяйте, результат пишите.
«Есть две бесконечности — Вселенная и глупость. Впрочем, я не уверен насчет Вселенной.» (с)
(Альберт Эйнштейн)
-
Vadim_S
Сообщение Vadim_S » 30 май 2010 11:51
Спасибо за советы, но не получается. То, что «remove tne sheet» переводится как «уберите лист» я знал. Я убираю материал, но принтер все равно пишет мне эту фразу. Передний датчик я вижу, а где находится второй? Сзади его не видно.
-
Vadim_S
Сообщение Vadim_S » 31 май 2010 07:57
С датчиками разобрались, задний был просто заклеен пленкой (чтоб печатать до самого края пленки). Лимит позишн провели- каретку отодвинули до конца влево, обратно он доехал и написал что ИНИЦИАЛИЗАЦИЯ ЗАВЕРШЕНА.(КОМПЛИТ). Провели тест ЛИНЕЙНОГО ЭНКОДЕРА: поехал влево и глюканул (без ошибки выключился).
-
Vadim_S
Сообщение Vadim_S » 31 май 2010 11:01
В общем ситуация такая: датчик замера вынял почистил, первый этап теста показал напряжение 2,6В — опустил до 0,6(по инструкции) запустил следующий этап. На нем каретка уехала влево периодически выдавая двойной сигнал, а на обратном пути рывки и выключился принтер(опять без ошибки).
Дальше попробовал AGING>FEED тут все ОК, а при проверке СКАН каретка опять влево уехала, а обратно только тронулась -рывки — выкл принтера без ошибки.
Добавлено спустя 2 минуты 11 секунд:
Когда проблема только появилась принтер выдавал ошибку мотора, а потом (через день) перестал её выдавать и стал просто выключаться.
Вернуться в «ZEONJET ST-600»
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей
Энкодер неисправности.
На многих сервомоторах установлен датчик положения ротора энкодер.

На производственном оборудовании очень часто встречается неисправности по энкодеру (датчику положения ротора).
Энкодер неисправности:
1) Одна из самых частых проблем, это неисправность разъема энкодера.
а) В разъеме может быть неконтакт,
б) Неисправность штекере разъема,
в) Разъем энкодера может быть залит жидкостью, Важно чтобы залитие жидкостью не произошло при включенном питании, так как это приведет к выходу из строя датчика, при данной неисправности энкодер может быть неремонтопригодным.
г) Короткое замыкание в разъеме датчика положения ротора. При коротком замыкании разъема энкодера, это приведет к выходу из строя датчика, при данной неисправности энкодер может быть неремонтопригодным.
2) Вторая ходовая проблема по датчику положения ротора, это кабель энкодера. Кабель может быть перегнутым или отдавленным или оторванным. Важно чтобы не произошло замыкание кабеля при включенном питании, так как замыкание кабеля приведет к выходу из строя датчика, при данной неисправности энкодер может быть неремонтопригодным.
3) Третья проблема энкодера, сбиты юстировочное положение датчика. При данной проблеме требуется настройка (юстировка) энкодера относительно вала сервомотора.
4) Четвертая проблема энкодера это залитый жидкостью «ДПР». Важно чтобы залитие жидкостью не произошло при включенном питании, так как это приведет к выходу из строя датчика, при данной неисправности энкодер может быть неремонтопригодным.
5) Пятая проблема это короткое замыкание энкодера. При коротком замыкании энкодер выходит из строя, при данной неисправности он может быть неремонтопригодным.
6) Треснуто стекло (диск) энкодера. Даже микротрещина на стекле (диске) датчика положения ротора приведет к неремонтопригодности энкодера.
7) Механическое повреждение энкодера. При механическом повреждении датчиека может выйти из строя стекло, (диск) энкодера. При данной неисправности энкодер может быть неремонтопригодным.
Выход из строя печатной платы энкодера. По данной неисправности производится поэлементный ремонт датчика положения ротора.
9) Выход из строя процессорной микросхемы на печатной плате, при данной неисправности энкодер может быть неремонтопригодным.
10) Выход из строя прошивки энкодера на микросхеме, на печатной плате датчика. При данной неисправности требуется перепрошивка микросхемы энкодера.
По любым проблемам с энкодером ( датчиком положения ротора электромотора) мы рекомендуем не заниматься ремонтом самостоятельно, а рекомендуем обращаться в специализированный сервисный центр. Наш Сервисный центр «Кернел» сможет произвести диагностику энкодера сервомотора за 1 день. А есть проблемы, которые можно решить за 1 день. Если ваш датчик положения ротора окажется неремонтопригодным, то у нас в на складе есть много ходовых энкодеров. Звоните к нам по телефону +78482797854, +79171215301 и высылайте заявку на электронную почту 89171215301@mail.ru
Энкодеры и резольверы
NVIDIA NVENC — это функция видеокарт NVIDIA, которая позволяет выполнять некоторые задачи, включая кодирование видео, но некоторые пользователи OBS Studio сообщают об ошибках NVENC.
Благодаря этой функции он переносит ресурсоемкую задачу с ЦП на определенную часть графического процессора.
Кроме того, полезно знать, что многие программы для прямой трансляции и записи, например vMix, Wirecast, Open Broadcaster и Bandicam, поддерживают кодировщик.
Кроме того, NVIDIA Encoder позволяет вам записывать свои игры и делиться ими. Это включено в программное обеспечение NVIDIA GeForce Experience.
В этой статье мы объясним, как вы можете решить все ошибки OBS Studio NVENC, с которыми вы можете столкнуться при использовании OBS.
Как включить аппаратное кодирование (NVENC) в OBS?
- Запустите OBS, нажмите «Файлы», затем выберите «Настройки».

- Затем выберите «Вывод» (расположен в боковом меню).

- Наконец, щелкните NVENC H.264 в окне, которое открывается в раскрывающемся списке кодировщика, чтобы включить аппаратное кодирование.
Если вы спрашиваете, что такое кодек NVENC, это инструмент для аппаратного кодирования, доступный в версиях OBS для Mac и Windows.
Но для лучшего результата разработчики рекомендуют использовать кодировку на компьютерах под управлением Windows.
Кроме того, его лучше всего использовать с графическими процессорами NVIDIA. Аппаратное кодирование доступно на картах NVIDIA с начала 2012 года.
Как я могу исправить ошибки OBS NVENC?
1. Исправить ошибку OBS Studio NVENC неподдерживаемое устройство
- Сначала откройте программу OBS.
- Нажмите «Файл» и перейдите в «Настройки».

- Перейдите на вкладку «Вывод».

- Затем найдите потоковую коробку.
- Нажмите на кодировщик и измените его на Quicksync (QSV) или x264 вместо NVENC.

- Наконец, выберите ОК.
2. Исправьте ошибку OBS NVENC: слишком много одновременных сеансов.

Ошибка OBS NVENC, которая говорит, что у вас слишком много одновременных сеансов, означает, что у вас больше одновременных сеансов кодирования, чем поддерживает ваш графический процессор.
Современные драйверы графического процессора могут поддерживать до трех сеансов, в то время как старые драйверы ограничиваются двумя сеансами. Если вы считаете, что у вас не так много одновременных сеансов, перезагрузите компьютер.
3. Исправить ошибку OBS NVENC не удалось: 8

Полное сообщение об ошибке для этой проблемы сопровождается спецификацией NV_ENC_ERR_INVALID_PARAM.
Причина этой ошибки в том, что NVENC не поддерживает разрешения выше 4096 по самой большой стороне и не может ничего захватить или показать.
Вы должны установить выходное разрешение ниже 4096 по наибольшей стороне. Базовое (холстовое) разрешение может быть больше, чем выходное (масштабированное), если вам это нужно.
4. Исправить ошибку инициализации кодировщика OBS NVENC.
- Щелкните правой кнопкой мыши кнопку «Пуск» и выберите «Диспетчер устройств» из списка.

- Разверните раздел «Видеоадаптеры», щелкните правой кнопкой мыши драйвер NVIDIA и выберите «Обновить драйвер».

- Нажмите «Автоматический поиск драйверов», и система выполнит поиск лучшего драйвера.

Чтобы исправить ошибку кодировщика Init, вам необходимо обновить драйвер NVIDIA до последней версии.
Если приведенного выше решения недостаточно, посетите раздел загрузки драйверов NVIDIA и получите последнюю версию драйвера с их веб-сайта.
Обязательно получите соответствующую версию для вашего оборудования. В противном случае вы рискуете получить другие графические ошибки и системные проблемы, такие как BSoD.
Чтобы избежать этого, используйте такой инструмент, как DriverFix, который определяет используемое вами оборудование и автоматически загружает соответствующие драйверы.
Кроме того, замена nvEncodeAPI.dll, расположенной в следующем каталоге, предыдущими версиями этого DLL-файла может помочь исправить ошибки OBS Studio NVENC:C:WindowsSysWow64
Для этого вам нужно загрузиться в безопасном режиме. Предыдущие версии nvEncodeAPI.dll можно найти по следующему адресу:C:WindowsSystem32DriverStoreFileRepositorynv_disp.inf_amd64_neutral_
5. Исправьте неверный параметр ошибки OBS NVENC.
Максимальное разрешение, к которому вы можете стремиться в NVENC h.264, составляет 4096 × 4096. Однако NVENC h.265 поддерживает разрешение до 8192×8192 пикселей.
Дело в том, что стриминговые сервисы не поддерживают h.265. Вы можете использовать его только с выходом FFmpeg OBS. Итак, вы собираетесь пойти на 4096 в основном.
6. Исправлен кодек OBS NVENC: функция не реализована
- Перейдите в значок «Файл» и нажмите «Настройки», чтобы открыть его.

- На вашем экране откроется окно настроек; теперь выберите вкладку «Вывод».

- После этого найдите потоковую коробку.

- Нажмите на Encoder и измените его на Software вместо NVENC.
- Теперь нажмите ОК.
Как я могу исправить перегрузку кодирования OBS NVENC?
Одним из решений, которое может исправить эту ошибку OBS NVENC, является снижение частоты кадров. Если вы снимаете с высокой частотой кадров (от 48 до 60), могут возникать задержки.
Это может произойти по ряду причин. Однако основная причина заключается в том, что ваш графический процессор не может отображать как саму игру, так и видео, которое вы транслируете.
- Сначала откройте «Настройки» и нажмите «Видео».

- Есть раздел Common FPS Values. Выберите его и выберите 30 или меньше.

- Затем нажмите «ОК» и закройте OBS. Теперь перезагрузите компьютер и проверьте свой поток, чтобы увидеть, появляется ли ошибка снова.
Если вы не обновили свои драйверы в OBS NVENC после открытия NVIDIA GEFORCE EXPERIENCE, щелкните драйверы и обновите их. Не забудьте после этого перезагрузить компьютер.
Вы также можете использовать ICQ в качестве контроля скорости и установить значение качества ICQ от 20 (лучшее качество, файлы большего размера) до 23 (ухудшенное качество, файлы меньшего размера).
Помните, что OBS использует потрясающую библиотеку кодирования видео с открытым исходным кодом — x264. Вы можете установить предустановку кодировщика x264 на сверхбыструю, чтобы снизить нагрузку на ЦП.
Сообщите нам, какое решение вы использовали для успешного устранения проблем OBS Studio NVENC в разделе комментариев ниже.
Не работает регулятор громкости
Ремонт энкодера автомагнитолы

Валкодер на панели управления автомагнитолы
В практике ремонта автомагнитол бывают случаи, когда устранение неисправности решается простой чисткой.
При длительной эксплуатации автомагнитол возникают неполадки, связанные с механическими элементами прибора. Поскольку всё управление автомагнитолой происходит через переднюю съёмную панель, то и поломке подвергаются те элементы, которые на ней установлены. Обычно это всевозможные кнопки, реже миниатюрные лампы подсветки дисплея (у более старых автомагнитол), регуляторы громкости, многоконтактный разъём, соединяющий съёмную панель с основной частью автомагнитолы.
Вы наверняка видели, что у многих автомагнитол роль регулятора громкости выполняет не набор кнопок, а валкодер. В официальной документации валкодер, как отдельную радиодеталь, принято называть энкодером, хотя по сути это одно и то же. Кроме этого данное чудо техники называют шаттлом. Но слово шаттл означает уже встроенный в прибор элемент управления, а не отдельную радиодеталь.

Так выглядит энкодер
Чем удобен валкодер?
Важно понять, что валкодер является частью цифровой электроники и служит он для ввода информации посредством поворота ручки регулятора. Всё управление происходит посредством изменения угла поворота ручки валкодера. Сам валкодер внешне очень похож на обычный переменный резистор, который ранее применялся в полуцифровых и аналоговых автомагнитолах для регулировки громкости.
Но если с помощью переменного резистора выполнялась лишь одна функция – регулировка звука, то с помощью валкодера возможна регулировка громкости звука, установка параметров низких и высоких частот, навигация по меню и многое, многое другое. Естественно, такая широкая функциональность возможна лишь с применением цифровой электроники.

Энкодеры можно встретить в любой технике, где применяется цифровое управление функциями.
Всё бы хорошо, валкодер вне всяких сомнений является очень удобным, компактным и многофункциональным. Но поскольку он имеет механические части конструкции, то рано или поздно он выходит из строя.
Так, при неисправности валкодера, наиболее часто имеет место следующая неисправность у автомагнитол:
При повороте ручки валкодера звук регулируется хаотично. Показания уровня громкости на дисплее также хаотично изменяются. При этом точная установка уровня громкости очень сложна и доставляет массу неудобств.
Что делать в случае, когда неисправен энкодер?
Заменять неисправный энкодер лучше новым, но что делать, если его нет в наличии или его трудно достать? В таком случае можно починить неисправный, правда, для устранения поломки потребуется разборка энкодера.
Устройство энкодера напоминает конструкцию обычного переменного резистора. Как уже говорилось, даже по внешнему виду они очень схожи.

Внешне энкодер очень похож на обычный переменный резистор
Обычно в энкодеры, которые применяются в цифровых автомагнитолах, встраивают микрокнопку, которая служит неким аналогом кнопки ENTER (ввода или подтверждения выбора). Эта кнопка расположена под валом регулятора (см. фото). У валкодера три вывода. Вместе с выводами от микрокнопки – 5. Также для жёсткой установки на плату предусмотрены два широких вывода от верхней планки корпуса. Они запаиваются в плату.

Энкодер в разобранном виде
Перед тем, как приступить к разборке валкодера и его чистке необходимо выпаять его из печатной платы передней панели. На первый взгляд операция простая, но на практике процесс осложняется тем, что рядом с энкодером обычно находятся мелкие SMD элементы и есть вероятность при выпайке валкодера их повредить.
Поэтому для демонтажа энкодера с печатной платы лучше воспользоваться специальным инструментом для выпайки многовыводных деталей. Подробнее об этом читайте здесь.
Разбирать валкодер стоит аккуратно без применения излишней силы. Главная задача – добраться до внутренних контактов и почистить их от грязи и окислов. Можно слегка отогнуть подвижные контакты, чтобы они лучше контактировали с фиксированными контактами при скольжении.
Чистку контактов лучше производить специальными средствами. Для этого можно использовать, например, спрей-очиститель DEGREASER. Он легко наноситься на поверхность, быстро испаряется не оставляя следов, хорошо очищает от застывшей канифоли, окислов, грязи и мелкодисперсной пыли. Спрей лучше нанести на зубную щётку в небольшом количестве и затем аккуратно почистить поверхность внутренних контактов валкодера. После этого проводим сборку валкодера и впаиваем в печатную плату.
Обычно, после проведения такой чистки валкодер работает стабильно и неисправность с хаотичной регулировкой громкости больше не проявляется.
Главная » Секреты ремонта автомагнитол » Текущая страница
Также Вам будет интересно узнать:
-
Что делать, если останавливается воспроизведение с диска? Ремонт CD/MP3-проигрывателя.
-
Старый добрый… Walkman! Анатомия легенды.
Энкодер — непонятки с библиотекой
Offline
Зарегистрирован: 22.12.2015
Исходник устраивает на 95%, взял тут https://www.youtube.com/watch?v=1SgcjxacGlQ
Недостатков у него два: английские коменты и библиотека «rotary», сама библиотека из двух файлов rotary.h и rotary.CPP. Файлы упаковал в ZIP архив и добавил в редактор. Только при проверке орхографии скеча библиотека не опознается(две другие подсвечивает другим цветом), соответственно ошибка при компиляции.
На такую же библиотеку наткнулся в теме:http://arduino.ru/forum/programmirovanie/problema-s-kompilyatsiei-0#comment-form
Сам скеч:
/*
Main code by Richard Visokey AD7C - www.ad7c.com
Revision 2.0 - November 6th, 2013
*/
// Include the library code
#include <LiquidCrystal.h>
#include <rotary.h>
#include <EEPROM.h>
//Setup some items
#define W_CLK 8 // Pin 8 - connect to AD9850 module word load clock pin (CLK)
#define FQ_UD 9 // Pin 9 - connect to freq update pin (FQ)
#define DATA 11 // Pin 11 - connect to serial data load pin (DATA)
#define RESET 10 // Pin 10 - connect to reset pin (RST)
#define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); }
Rotary r = Rotary(2,3); // sets the pins the rotary encoder uses. Must be interrupt pins.
LiquidCrystal lcd(12, 13, 7, 6, 5, 4); // I used an odd pin combination because I need pin 2 and 3 for the interrupts.
int_fast32_t rx=0000000; // Base (starting) frequency of VFO. This only loads once. To force load again see ForceFreq variable below.
int_fast32_t rx2=1; // variable to hold the updated frequency
int_fast32_t increment = 10; // starting VFO update increment in HZ.
int_fast32_t iffreq = 0000000; // Intermedite Frequency - Amount to subtract (-) from base frequency. ********************************************
int buttonstate = 0;
int buttonstate2 = 0;
int GoIF = 1;
String hertz = "10 Hz";
int hertzPosition = 5;
byte ones,tens,hundreds,thousands,tenthousands,hundredthousands,millions ; //Placeholders
String freq; // string to hold the frequency
int_fast32_t timepassed = millis(); // int to hold the arduino miilis since startup
int memstatus = 1; // value to notify if memory is current or old. 0=old, 1=current.
int ForceFreq = 1; // Change this to 0 after you upload and run a working sketch to activate the EEPROM memory. YOU MUST PUT THIS BACK TO 0 AND UPLOAD THE SKETCH AGAIN AFTER STARTING FREQUENCY IS SET!
void setup() {
pinMode(A0,INPUT); // Connect to a button that goes to GND on push
pinMode(A5,INPUT); // IF sense **********************************************
digitalWrite(A0,HIGH);
digitalWrite(A5,HIGH);
lcd.begin(16, 2);
PCICR |= (1 << PCIE2);
PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
sei();
pinMode(FQ_UD, OUTPUT);
pinMode(W_CLK, OUTPUT);
pinMode(DATA, OUTPUT);
pinMode(RESET, OUTPUT);
pulseHigh(RESET);
pulseHigh(W_CLK);
pulseHigh(FQ_UD); // this pulse enables serial mode on the AD9850 - Datasheet page 12.
lcd.setCursor(hertzPosition,1);
lcd.print(hertz);
// Load the stored frequency
if (ForceFreq == 0) {
freq = String(EEPROM.read(0))+String(EEPROM.read(1))+String(EEPROM.read(2))+String(EEPROM.read(3))+String(EEPROM.read(4))+String(EEPROM.read(5))+String(EEPROM.read(6));
rx = freq.toInt();
}
}
void loop() {
// Update the display and frequency if the new Freq NEQ the old Freq
if (rx != rx2){
showFreq();
sendFrequency(rx);
rx2 = rx;
}
// Rotate through the rate of tuning as you hold down the button
buttonstate = digitalRead(A0);
if(buttonstate == LOW) {
setincrement();
};
// Check for PIN low to drive IF offset Freq
buttonstate = digitalRead(A5);
if (buttonstate != buttonstate2){
if(buttonstate == LOW) {
lcd.setCursor(15,1);
lcd.print(".");
GoIF = 0;
buttonstate2 = buttonstate;
sendFrequency(rx);
}
else{
lcd.setCursor(15,1);
lcd.print(" ");
GoIF = 1;
buttonstate2 = buttonstate;
sendFrequency(rx);
};
};
// Write the frequency to memory if not stored and 2 seconds have passed since the last frequency change.
if(memstatus == 0){
if(timepassed+2000 < millis()){
storeMEM();
}
}
}
// Interrupt routine to catch the rotary encoder
ISR(PCINT2_vect) {
unsigned char result = r.process();
if (result) {
if (result == DIR_CW){rx=rx+increment;}
else {rx=rx-increment;};
if (rx >=30000000){rx=rx2;}; // UPPER VFO LIMIT
if (rx <=0000000){rx=rx2;}; // LOWER VFO LIMIT
}
}
// frequency calc from datasheet page 8 = <sys clock> * <frequency tuning word>/2^32
void sendFrequency(double frequency) {
if (GoIF == 1){frequency=frequency-iffreq;}; //If pin = low, subtract the IF frequency.
int32_t freq = frequency * 4294967295/125000000; // note 125 MHz clock on 9850. You can make 'slight' tuning variations here by adjusting the clock frequency.
for (int b=0; b<4; b++, freq>>=8) {
tfr_byte(freq & 0xFF);
}
tfr_byte(0x000); // Final control byte, all 0 for 9850 chip
pulseHigh(FQ_UD); // Done! Should see output
}
// transfers a byte, a bit at a time, LSB first to the 9850 via serial DATA line
void tfr_byte(byte data)
{
for (int i=0; i<8; i++, data>>=1) {
digitalWrite(DATA, data & 0x01);
pulseHigh(W_CLK); //after each bit sent, CLK is pulsed high
}
}
void setincrement(){
if(increment == 10){increment = 50; hertz = "50 Hz"; hertzPosition=5;}
else if (increment == 50){increment = 100; hertz = "100 Hz"; hertzPosition=4;}
else if (increment == 100){increment = 500; hertz="500 Hz"; hertzPosition=4;}
else if (increment == 500){increment = 1000; hertz="1 Khz"; hertzPosition=6;}
else if (increment == 1000){increment = 2500; hertz="2.5 Khz"; hertzPosition=4;}
else if (increment == 2500){increment = 5000; hertz="5 Khz"; hertzPosition=6;}
else if (increment == 5000){increment = 10000; hertz="10 Khz"; hertzPosition=5;}
else if (increment == 10000){increment = 100000; hertz="100 Khz"; hertzPosition=4;}
else if (increment == 100000){increment = 1000000; hertz="1 Mhz"; hertzPosition=6;}
else{increment = 10; hertz = "10 Hz"; hertzPosition=5;};
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(hertzPosition,1);
lcd.print(hertz);
delay(250); // Adjust this delay to speed up/slow down the button menu scroll speed.
};
void showFreq(){
millions = int(rx/1000000);
hundredthousands = ((rx/100000)%10);
tenthousands = ((rx/10000)%10);
thousands = ((rx/1000)%10);
hundreds = ((rx/100)%10);
tens = ((rx/10)%10);
ones = ((rx/1)%10);
lcd.setCursor(0,0);
lcd.print(" ");
if (millions > 9){lcd.setCursor(1,0);}
else{lcd.setCursor(2,0);}
lcd.print(millions);
lcd.print(".");
lcd.print(hundredthousands);
lcd.print(tenthousands);
lcd.print(thousands);
lcd.print(".");
lcd.print(hundreds);
lcd.print(tens);
lcd.print(ones);
lcd.print(" Mhz ");
timepassed = millis();
memstatus = 0; // Trigger memory write
};
void storeMEM(){
//Write each frequency section to a EPROM slot. Yes, it's cheating but it works!
EEPROM.write(0,millions);
EEPROM.write(1,hundredthousands);
EEPROM.write(2,tenthousands);
EEPROM.write(3,thousands);
EEPROM.write(4,hundreds);
EEPROM.write(5,tens);
EEPROM.write(6,ones);
memstatus = 1; // Let program know memory has been written
};
Есть подозрение что неработоспособность библиотеки вызванна тем что библиотека «rotary.h» ссылается на другую библиотеку «Arduino». Подробности по второй ссылке.
Если в коде скеча я еще как то разбираюсь, то с библиотеками полный НОЛЬ.
Подскажите пожайлуста как справится с библиотекой, у меня пока из идей только выдрать кусок кода опроса Энкодера и загонять результаты в переменную — int_fast32_t rx2=1; // variable to hold the updated frequency.
Arkel Elektrik Elektronik San. ve Tic. A.Ş.
01- Couldn’t read parameters. Checksum wrong:
error. Try to restart system. If it doesn’t solve, get contact to Arkel support.
02-Couldn’t write parameters. Verify error:
gives this error. Try to restart system. If it doesn’t solve, get contact to Arkel support.
03-Parameters were written with a newer version. Some parameters will be lost:
updated to an older version, and if the functions in new version don’t exist in the updated version, the values in the first
version (before update) is cleared.
04- No connection with ENCA board:
second, it gives this error.
— When this error is received, encoder links must be controlled. Encoder link can be wrong or there may be a problem
with encoder feed.
— The flat cable between Arcode and ENCA should be checked.
— Encoder type and motor type parameters should be checked.
05-DIP-switch configuration wrong or could not be read:
it gives this error.
— You can get contact to Arkel support.
06- One of encoder channels disconnected:
second.
— The flat cable between Arcode and ENCA, and encoder connections should be checked.
07- Current was over driver limit:
gives this error.
— Arcode capacity should be suitable with motor.
— The car shoes may be too tight or the motor brake may not open fully.
— For geared machine ‘nominal slip frequency’ parameter might be entered wrong.
— ‘Noload current’ parameter should be checked.
08-Current was near driver limit continuously:
IPM modüle for 6 seconds, it gives this error.
— Be sure that load balance is completed correctly.
— Check the machine brake is being opened completely.
— Check the ‘nominal slip frequency’ and ‘noload current’ parameters in asynchronous machines.
ARKEL
If Eeprom is empty or checksum is faulty, it gives this
If it couldn’t write the parameters or statistics to Eeprom, it
If ARCODE can not communicate with ENCA board more than 1
This error occurs when there is no info from ENCA board for 1
If the motor current exceeds over 200% of max.current of IPM module, it
If the motor current exceeds over 250% of max.current of
62
www.arkel.com.tr
When dipswitches are adjusted in a wrong way,
If the system is
ARCODE
Подключение энкодера к Ардуино и полнофункциональный код обработки для него
Энкодер — это устройство преобразования механического перемещения или угловых изменений положения в цифровой сигнал. В статье рассматривается самый популярный в DIY сообществе инкрементальный энкодер EC11 с кнопкой. При его вращении на выходах A и B формируются TTL сигналы в виде импульсов сдвинутые между собой по фазе на 90 градусов. Таким образом с его помощью, можно определить направление и скорость вращения, а так же рассчитать угол поворота. В отличие от потенциометров, энкодер KY-040 гораздо надежней и долговечный.

Немного подробностей
Собирая один из проектов с использованием encoder. Я не смог найти код для Ардуино выполняющий все мои условия. Так как для проекта нужно обрабатывать следующие команды: «Вращение без нажатия», «Вращение с нажатием», «Нажатие» и «Длинное нажатие», а так же требуется стабильная работа энкодера. Скетчи использующие один пин с прерыванием INT0 или INT1, работают отвратительно и при вращении вала энкодера вылетает очень много ошибок. Код без использования прерываний работает стабильно, но он не работает в фоновом режиме, его нужно встраивать в тело основной программы, что в свою очередь приводит к не своевременному срабатыванию обработчика и пропускам при вращении энкодера. Еще хуже обстоят дела с обработкой нажатия с вращением вала энкодера и обычным с нажатием. Пришлось написать свой код обработки, который исключает описанные выше проблемы. С дребезгом контактов я не стал бороться программно, так как это приводит к задержкам обработки. Проще и надежней использовать керамические конденсаторы.
Схема подключения энкодера к Ардуино
Для считывания сигналов с выходов EC-11, нужно использовать три цифровых входа Arduino. В схеме подключения я использовал редко используемые мной в своих проектах выводы Arduino(A1, A2 и A3). Внешние подтягивающие резисторы отсутствуют, так как я использовал внутреннюю подтяжку микроконтроллера. Конденсаторы нужны для гашения импульсов дребезга контактов. Если у вас новый и хороший энкодер, то можно обойтись и без них. Но на кнопку в любом случае потребуется конденсатор, так как ее дребезг неизбежен.
Используемые в схеме компоненты:
Arduino nano — 1 шт.
Энкодер EC11 -1 шт.
Соединительные повода — 4 шт.
Керамические конденсаторы 0,1 мкФ — 3 шт.

Скетч для Ардуино
Для того что бы отслеживать изменение положения энкодера в фоновом режиме, я использую прерывание PCINT1. Обработка всех функций происходит в прерывании, обработчик в зависимости от произошедшего действия изменяет переменную enc_state. Если значение переменной enc_state=0 — ничего не произошло, enc_state=1 — экодер вращался без нажатия, enc_state=2 — экодер вращался с нажатием, enc_state=3 — было нажатие на кнопку, enc_state=4 — было длинное нажатие на кнопку, Прерывание будет срабатывать каждый раз по изменению состояния входов, как с высокого уровня на низкий, так и наоборот. То есть при одном щелчке энкодера прерывание сработает 4 раза. Или по 2 раза для каждого из входов. Но обработчик выдаст сигнал поворота только 1 раз на все 4 прерывания.
Код обработчика при каждом срабатывании записывает в переменную lastcomb состояние входов, к которым подключен энкодер. И ждет состояние когда выходы A и B будут замкнуты на GND, это гарантированный сигнал того, что энкодер вращается. После того как этот сигнал получен, обработчик проверяет в какую сторону было вращение. Для этого он сравнивает его предыдущее значение из переменной lastcomb и в зависимости от фазы сдвига определит в какую сторону был поворот ротора. Как я писал ранее, сложнее всего отслеживать нажатие кнопки.
Так как использовать определенные тайминги я не планировал, потому, что они неизбежно приводят длительным задержкам работы обработчика и основной программы, или требуют использование таймера, которых в микроконтроллере всего 3 шт. их, как правило никогда не хватает. Собственно проблема состояла в том, чтобы разделить «нажатие с последующим вращением» от простого нажатия. В итоге как вы уже можете убедиться, я решил эту задачу. Оптимизацией кода я не стал заниматься, потому как все работает и меня все устраивает. Для наглядности в коде все действия с энкодером, отображаются в Serial мониторе программы Adruino IDE.
/*
При публичном размещении кода ссылка на первоисточник обязательна.
*/
#define btn_long_push 1000 // Длительность долинного нажатия кнопки
volatile uint8_t lastcomb=7, enc_state, btn_push=0;
volatile int enc_rotation=0, btn_enc_rotate=0;
volatile boolean btn_press=0;
volatile uint32_t timer;
//********************************
void setup()
{
pinMode(A1,INPUT_PULLUP); // ENC-A
pinMode(A2,INPUT_PULLUP); // ENC-B
pinMode(A3,INPUT_PULLUP); // BUTTON
PCICR = 0b00000010; // PCICR |= (1<<PCIE1); Включить прерывание PCINT1
PCMSK1 = 0b00001110; // Разрешить прерывание для A1, A2, A3
Serial.begin(115200);
}
//****************************************
void loop()
{
switch (enc_state)
{
case 1: {
Serial.print("Вращение без нажатия ");
Serial.println(enc_rotation);
}
break;
case 2: {
Serial.print("Вращение с нажатием ");
Serial.println(btn_enc_rotate);
}
break;
case 3: Serial.println("Нажатие кнопки ");
break;
case 4: Serial.println("Длинное нажатие кнопки ");
break;
}
enc_state=0; //обнуляем статус энкодера
}
//****************************************
ISR (PCINT1_vect) //Обработчик прерывания от пинов A1, A2, A3
{
uint8_t comb = bitRead(PINC, 3) << 2 | bitRead( PINC, 2)<<1 | bitRead(PINC, 1); //считываем состояние пинов энкодера и кнопки
if (comb == 3 && lastcomb == 7) btn_press=1; //Если было нажатие кнопки, то меняем статус
if (comb == 4) //Если было промежуточное положение энкодера, то проверяем его предыдущее состояние
{
if (lastcomb == 5) --enc_rotation; //вращение по часовой стрелке
if (lastcomb == 6) ++enc_rotation; //вращение против часовой
enc_state=1; // был поворот энкодера
btn_enc_rotate=0; //обнулить показания вращения с нажатием
}
if (comb == 0) //Если было промежуточное положение энкодера и нажатие, то проверяем его предыдущее состояние
{
if (lastcomb == 1) --btn_enc_rotate; //вращение по часовой стрелке
if (lastcomb == 2) ++btn_enc_rotate; //вращение против частовой
enc_state=2; // был поворот энкодера с нажатием
enc_rotation=0; //обнулить показания вращения без нажатия
btn_press=0; //обнулить показания кнопки
}
if (comb == 7 && lastcomb == 3 && btn_press) //Если было отпускание кнопки, то проверяем ее предыдущее состояние
{
if (millis() - timer > btn_long_push) // проверяем сколько прошло миллисекунд
{
enc_state=4; // было длинное нажатие
} else {
enc_state=3; // было нажатие
}
btn_press=0; //обнулить статус кнопки
}
timer = millis(); //сброс таймера
lastcomb = comb; //сохраняем текущее состояние энкодера
}
Заключение
Результат работы кода меня порадовал и теперь я могу продолжить работу над своим новым проектом, который скоро здесь выложу. Надеюсь эта короткая статья вам понравилась и вы сможете воспользоваться моей наработкой в своих самоделках.
Если у Вас остались вопросы и замечания, пишите их в комментариях. Я с удовольствием на них отвечу.
ОБНОВЛЕНИЯ
- v4.7: Исправлен случайный нажатый поворот в BINARY_ALGORITHM
- v4.8: увеличена производительность для AVR Arduino
- v4.9: быстрый поворот отключен если кнопка удерживается
ТЕОРИЯ
Энкодер (от англ. encode – преобразовывать) – это устройство для преобразования угловых положений или линейных перемещений в цифровой сигнал, т.е. энкодер – это датчик угла или линейного перемещения, соответственно есть крутильные и линейные энкодеры. Принцип работы энкодера заключается в преобразовании механического перемещения в электрические сигналы, у обычного инкрементального энкодера, который мы будем рассматривать, этот сигнал представляет собой два квадратных сигнала (при равномерном вращении), сдвинутых по фазе на 90 градусов.

Самым хорошим модулем с энкодером на Aliexpress является вот такой, на круглой плате:

Энкодер aliexpress, aliexpress, искать
ПОДКЛЮЧЕНИЕ
Подключается модуль энкодера очень просто: питание на питание (GND и VCC), логические пины CLK, DT (тактовые выводы энкодера) и SW (вывод кнопки) на любые пины Arduino (D или A). У круглых модулей выводы энкодера подписаны как S1 и S2, а вывод кнопки как Key, подключаются точно так же. От порядка подключения тактовых выводов энкодера зависит “направление” его работы, но это можно поправить в программе.
У модулей энкодера тактовые выводы подтянуты к питанию и дают низкий сигнал при срабатывании, также на них стоят RC цепи для гашения дребезга. Вывод кнопки никуда не подтянут! Промышленный энкодер подключается точно так же, чёрный и красный провода у него питание, остальные – тактовые выходы.
У модулей энкодеров тактовые выходы и кнопка подтянуты к питанию, у круглого модуля также стоят RC цепи для аппаратного подавления дребезга контактов, у KY-40 (прямоугольный) распаяна только подтяжка. Если нужно подключить “голый” энкодер к плате – в целом можно подключить напрямую без обвязки, как на схеме ниже, моя библиотека отработает и подтяжку средствами микроконтроллера (INPUT_PULLUP), и программный антидребезг. Но рекомендуется всё-таки делать RC цепи для кнопки и для тактовых выходов энкодера.
Бывает два типа энкодеров, я назвал их одноимпульсные и двухимпульсные, тип энкодера можно определить по внешнему виду самого энкодера:

Чем отличаются энкодеры на практике: если опрашивать одноимпульсный энкодер как двухимпульсный, то для отработки одного тика нужно повернуть рукоятку на два тика. Если опрашивать двухимпульсный как одноимпульсный, то для отработки одного тика нужно повернуть рукоятку на два тика. То есть при неправильном использовании причина сразу видна.
КОД
Если вам важна не функциональность библиотеки, а максимальная скорость работы с энкодером и минимальное время его опроса, предлагаю следующий код. Здесь используется аппаратное прерывание (одно на один энкодер), для увеличения скорости выполнения прерывания используется функция bitRead вместо digitalRead (скорость выполнения разнится в десятки раз). Также в этом коде предусмотрен выбор типа энкодера соответствующей настройкой. Отработка энкодера идёт параллельно выполнению скетча, переменная encCounter меняет своё значение при повороте рукоятки и выводится через порт.
/*
Максимально быстрый универсальный код для обработки энкодера
Работает на перывании (используется одно)
Тут код построен на bitRead(PIND..) - только для Arduino NANO!
*/
#define ENC_A 2 // пин энкодера
#define ENC_B 4 // пин энкодера
#define ENC_TYPE 1 // тип энкодера, 0 или 1
volatile int encCounter;
volatile boolean state0, lastState, turnFlag;
void setup() {
Serial.begin(9600);
attachInterrupt(0, int0, CHANGE);
}
void int0() {
state0 = bitRead(PIND, ENC_A);
if (state0 != lastState) {
#if (ENC_TYPE == 1)
turnFlag = !turnFlag;
if (turnFlag)
encCounter += (bitRead(PIND, ENC_B) != lastState) ? -1 : 1;
#else
encCounter += (bitRead(PIND, ENC_B) != lastState) ? -1 : 1;
#endif
lastState = state0;
}
}
void loop() {
Serial.println(encCounter);
delay(100);
}
/*
Максимально быстрый универсальный код для обработки энкодера
Работает на перывании (используется одно)
Тут код построен на digitalRead, что делает его универсальным для всех плат Arduino
*/
#define ENC_A 2 // пин энкодера
#define ENC_B 4 // пин энкодера
#define ENC_TYPE 1 // тип энкодера, 0 или 1
volatile int encCounter;
volatile boolean state0, lastState, turnFlag;
void setup() {
Serial.begin(9600);
attachInterrupt(0, int0, CHANGE);
}
void int0() {
state0 = digitalRead(ENC_A);
if (state0 != lastState) {
#if (ENC_TYPE == 1)
turnFlag = !turnFlag;
if (turnFlag)
encCounter += (digitalRead(ENC_B) != lastState) ? -1 : 1;
#else
encCounter += (digitalRead(ENC_B) != lastState) ? -1 : 1;
#endif
lastState = state0;
}
}
void loop() {
Serial.println(encCounter);
delay(100);
}
// алгоритм с "таблицей", позволяющий увеличить точность энкодера
// в 4 раза, работает максимально чётко даже с плохими энкодерами.
// Для увеличения скорости опроса используйте PCINT и чтение из PINn
#define CLK 3
#define DT 2
long pos = 0;
byte lastState = 0;
const int8_t increment[16] = {0, -1, 1, 0, 1, 0, 0, -1, -1, 0, 0, 1, 0, 1, -1, 0};
void setup() {
Serial.begin(9600);
}
void loop() {
byte state = digitalRead(CLK) | (digitalRead(DT) << 1);
if (state != lastState) {
pos += increment[state | (lastState << 2)];
lastState = state;
Serial.println(pos);
}
}
#define ENC_A 2 // пин энкодера
#define ENC_B 3 // пин энкодера
volatile int encCounter;
volatile boolean flag, resetFlag;
volatile byte curState, prevState;
void setup() {
Serial.begin(115200);
attachInterrupt(0, int0, CHANGE);
attachInterrupt(1, int0, CHANGE);
}
void int0() {
encTick();
}
// алгоритм со сбросом от Ярослава Куруса
void encTick() {
curState = digitalRead(ENC_A) | digitalRead(ENC_B) << 1; // digitalRead хорошо бы заменить чем-нибудь более быстрым
if (resetFlag && curState == 0b11) {
if (prevState == 0b10) encCounter++;
if (prevState == 0b01) encCounter--;
resetFlag = 0;
flag = true;
}
if (curState == 0b00) resetFlag = 1;
prevState = curState;
}
void loop() {
if (flag) {
Serial.println(encCounter);
flag = 0;
}
}
volatile int counter = 0; // счётчик
volatile bool encFlag = 0; // флаг поворота
void setup() {
Serial.begin(9600);
attachInterrupt(0, encIsr, CHANGE);
attachInterrupt(1, encIsr, CHANGE);
}
void loop() {
if (encFlag) {
Serial.println(counter);
encFlag = 0;
}
}
volatile byte reset = 0, last = 0;
void encIsr() {
byte state = (PIND & 0b1100) >> 2; // D2 + D3
if (reset && state == 0b11) {
int prevCount = counter;
if (last == 0b10) counter++;
else if (last == 0b01) counter--;
if (prevCount != counter) encFlag = 1;
reset = 0;
}
if (!state) reset = 1;
last = state;
}
БИБЛИОТЕКА
Внимание, библиотека устарела!
Я разработал новую библиотеку — EncButton, она гораздо легче и быстрее этой, но практически полностью с ней совместима. Скачать и ознакомиться можно на GitHub.
GyverEncoder v4.9
Я не нашёл в интернете нормальных библиотек для энкодера с хорошей функциональностью, поэтому написал свою, GyverEncoder. Что умеет:
- Отработка поворота рукоятки энкодера
- Обычный поворот
- “Нажатый поворот”
- “Быстрый” поворот
- Три алгоритма опроса энкодера
- Быстрый – но не справляется с люфтами
- Бинарный – медленнее, лучше справляется с люфтами
- Высокоточный – ещё медленнее, но работает даже с убитым энкодером
- Возможность работы с “виртуальным” энкодером – через расширитель пинов или ещё как
- Работа с двумя типами энкодеров (тип 1 и 2, см. выше)
- Работа с кнопкой энкодера:
- Отработка нажатия
- Клика
- Двойного клика
- Удержания
- Антидребезг контактов
- Возможность полностью убрать код кнопки для быстродействия
Поддерживаемые платформы: все Arduino (используются стандартные Wiring-функции)
УСТАНОВКА
- Библиотеку можно найти и установить через менеджер библиотек по названию GyverEncoder в:
- Arduino IDE (Инструменты/Управлять библиотеками)
- Arduino IDE v2 (вкладка “Library Manager”)
- PlatformIO (PIO Home, вкладка “Libraries”)
- Про ручную установку читай здесь
ДОКУМЕНТАЦИЯ
Инициализация
Объект энкодера может быть создан несколькими способами:
Encoder enc; // не привязан к пину (для виртуального энкодера, см. пример) Encoder enc(пин CLK, пин DT); // энкодер без кнопки (ускоренный опрос) Encoder enc(пин CLK, пин DT, пин SW); // энкодер с кнопкой Encoder enc(пин CLK, пин DT, пин SW, тип); // энкодер с кнопкой и указанием типа Encoder enc(пин CLK, пин DT, ENC_NO_BUTTON, тип); // энкодер без кнопки и с указанием типа
Опрос
Опрос энкодера происходит в методе .tick(), после чего можно узнать состояние энкодера из методов is*. Сам .tick() должен вызываться как можно чаще:
- В
loop()— у вас должен быть «прозрачный»loop()без задержек - В прерывании таймера — достаточно опрашивать энкодер каждые 5 мс (зависит от скорости поворота)
- В аппаратном прерывании (достаточно завести одну таковую ногу энкодера)
Для «расшифровки» состояния энкодера используются следующие методы:
isTurn();// возвращает true при любом повороте, сама сбрасывается в falseisRight();// возвращает true при повороте направо, сама сбрасывается в falseisLeft();// возвращает true при повороте налево, сама сбрасывается в falseisRightH();// возвращает true при удержании кнопки и повороте направо, сама сбрасывается в falseisLeftH();// возвращает true при удержании кнопки и повороте налево, сама сбрасывается в falseisFastR();// возвращает true при быстром поворотеisFastL();// возвращает true при быстром повороте
Для кнопки энкодера:
isPress();// возвращает true при нажатии кнопки, сама сбрасывается в falseisRelease();// возвращает true при отпускании кнопки, сама сбрасывается в falseisClick();// возвращает true при нажатии и отпускании кнопки, сама сбрасывается в falseisHolded();// возвращает true при удержании кнопки, сама сбрасывается в falseisHold();// возвращает true при удержании кнопки, НЕ СБРАСЫВАЕТСЯisSingle();// возвращает true при одиночном клике (после таймаута), сама сбрасывается в falseisDouble();// возвращает true при двойном клике, сама сбрасывается в false
Примечание: isClick() возвращает true сразу же после отпускания кнопки, в то время как isSingle() возвращает true после таймаута, во время которого можно сделать второй клик и поймать уже двойной клик при помощи isDouble().
В версии 4.4 появился метод resetStates(), который принудительно сбрасывает все флаги is-методов
Настройки в скетче
Некоторые параметры работы энкодера можно настроить из программы:
setType(type);// тип энкодераTYPE1одношаговый,TYPE2двухшаговый. Если ваш энкодер работает странно, смените типsetTickMode(tickMode);//MANUAL/AUTO— ручной или автоматический опрос энкодера функциейtick()(по умолчанию ручной)setDirection(direction);//NORM/REVERSE— направление вращения энкодераsetFastTimeout(timeout);// установка таймаута быстрого поворотаsetPinMode(mode);// тип подключения пинов энкодера, подтяжкаHIGH_PULL(внутренняя) илиLOW_PULL(внешняя на GND)setBtnPinMode(mode);// тип подключения кнопки, подтяжкаHIGH_PULL(внутренняя) илиLOW_PULL(внешняя на GND)
Настройки в библиотеке
В заголовочном файле библиотеки (GyverEncoder.h) есть несколько дополнительных настроек:
Время:
ENC_DEBOUNCE_TURN 1// время антидребезга для энкодера, миллисекундENC_DEBOUNCE_BUTTON 80// время антидребезга для кнопки, миллисекундENC_HOLD_TIMEOUT 700// таймаут удержания кнопки, миллисекундENC_DOUBLE_TIMEOUT 300// таймаут двойного клика
Использование кнопки:
#define ENC_WITH_BUTTON// если закомментировать данную строку, опрос кнопки будет полностью «убран» из кода, что сделает его легче и чуть быстрее
Логика подключения:
#define DEFAULT_ENC_PULL LOW_PULL// тип подключения энкодера по умолчанию (LOW_PULL или HIGH_PULL)#define DEFAULT_BTN_PULL HIGH_PULL// тип подключения кнопки энкодера по умолчанию (LOW_PULL или HIGH_PULL)
Алгоритмы опроса энкодера
Алгоритм работы библиотеки можно выбрать в заголовочном файле библиотеки (GyverEncoder.h), для этого нужно раскомментировать одну из строк с дефайнами алгоритмов:
#define FAST_ALGORITHM// быстрый, не справляется с люфтами#define BINARY_ALGORITHM// медленнее, лучше справляется с люфтами#define PRECISE_ALGORITHM// медленнее, но работает даже с убитым энкодером (по мотивам https://github.com/mathertel/RotaryEncoder)
Работа с «виртуальным» энкодером
Версия библиотеки 4+ поддерживает работу с виртуальным энкодером, т.е. алгоритм опрашивает не напрямую цифровой пин микроконтроллера, а логическую величину, которую ему передадут. Таким образом можно попробовать опрашивать несколько энкодеров, подключенных через расширитель пинов. Для работы с таким энкодером нужно инициализировать энкодер без указания пина:
Encoder enc; // не привязан к пину
Работа с таким энкодером ничем не отличается от обычного, кроме метода tick() — в него нужно передать состояния тактовых пинов энкодера (CLK и DT), а также пина кнопки (опционально):
enc1.tick(stateCLK, stateDT, stateSW); // с кнопкой enc1.tick(stateCLK, stateDT); // без кнопки
Смотрите пример external_enc в папке с примерами
Encoder(); // для непривязанного к пинам энкодера Encoder(uint8_t clk, uint8_t dt, int8_t sw = -1, bool type = false); // CLK, DT, SW, тип (TYPE1 / TYPE2) TYPE1 одношаговый, TYPE2 двухшаговый. Если ваш энкодер работает странно, смените тип // Варианты инициализации: // Encoder enc; // не привязан к пину // Encoder enc(пин CLK, пин DT); // энкодер без кнопки (ускоренный опрос) // Encoder enc(пин CLK, пин DT, пин SW); // энкодер с кнопкой // Encoder enc(пин CLK, пин DT, пин SW, тип); // энкодер с кнопкой и указанием типа // Encoder enc(пин CLK, пин DT, ENC_NO_BUTTON, тип); // энкодер без кнопкой и с указанием типа void tick(); // опрос энкодера, нужно вызывать постоянно или в прерывании void setType(boolean type); // TYPE1 / TYPE2 - тип энкодера TYPE1 одношаговый, TYPE2 двухшаговый. Если ваш энкодер работает странно, смените тип void setTickMode(boolean tickMode); // MANUAL / AUTO - ручной или автоматический опрос энкодера функцией tick(). (по умолчанию ручной) void setDirection(boolean direction); // NORM / REVERSE - направление вращения энкодера void setFastTimeout(int timeout); // установка таймаута быстрого поворота void setPinMode(bool mode); // тип подключения энкодера, подтяжка HIGH_PULL (внутренняя) или LOW_PULL (внешняя на GND) void setBtnPinMode(bool mode); // тип подключения кнопки, подтяжка HIGH_PULL (внутренняя) или LOW_PULL (внешняя на GND) boolean isTurn(); // возвращает true при любом повороте, сама сбрасывается в false boolean isRight(); // возвращает true при повороте направо, сама сбрасывается в false boolean isLeft(); // возвращает true при повороте налево, сама сбрасывается в false boolean isRightH(); // возвращает true при удержании кнопки и повороте направо, сама сбрасывается в false boolean isLeftH(); // возвращает true при удержании кнопки и повороте налево, сама сбрасывается в false boolean isFastR(); // возвращает true при быстром повороте boolean isFastL(); // возвращает true при быстром повороте boolean isPress(); // возвращает true при нажатии кнопки, сама сбрасывается в false boolean isRelease(); // возвращает true при отпускании кнопки, сама сбрасывается в false boolean isClick(); // возвращает true при нажатии и отпускании кнопки, сама сбрасывается в false boolean isHolded(); // возвращает true при удержании кнопки, сама сбрасывается в false boolean isHold(); // возвращает true при удержании кнопки, НЕ СБРАСЫВАЕТСЯ boolean isSingle(); // возвращает true при одиночном клике (после таймаута), сама сбрасывается в false boolean isDouble(); // возвращает true при двойном клике, сама сбрасывается в false void resetStates(); // сбрасывает все is-флаги
ПРИМЕРЫ
Остальные примеры смотри в папке examples библиотеки, также примеры можно открыть из Arduino IDE/Файл/Примеры
Все возможности библиотеки
#define CLK 2
#define DT 3
#define SW 4
#include "GyverEncoder.h"
//Encoder enc1(CLK, DT); // для работы без кнопки
Encoder enc1(CLK, DT, SW); // для работы c кнопкой
//Encoder enc1(CLK, DT, SW, TYPE2); // для работы c кнопкой и сразу выбираем тип
//Encoder enc1(CLK, DT, ENC_NO_BUTTON, TYPE2); // для работы без кнопки и сразу выбираем тип
// Варианты инициализации:
// Encoder enc; // не привязан к пину
// Encoder enc(пин CLK, пин DT); // энкодер без кнопки (ускоренный опрос)
// Encoder enc(пин CLK, пин DT, пин SW); // энкодер с кнопкой
// Encoder enc(пин CLK, пин DT, пин SW, тип); // энкодер с кнопкой и указанием типа
// Encoder enc(пин CLK, пин DT, ENC_NO_BUTTON, тип); // энкодер без кнопкой и с указанием типа
void setup() {
Serial.begin(9600);
enc1.setType(TYPE2);
}
void loop() {
// обязательная функция отработки. Должна постоянно опрашиваться
enc1.tick();
if (enc1.isTurn()) { // если был совершён поворот (индикатор поворота в любую сторону)
// ваш код
}
if (enc1.isRight()) Serial.println("Right"); // если был поворот
if (enc1.isLeft()) Serial.println("Left");
if (enc1.isRightH()) Serial.println("Right holded"); // если было удержание + поворот
if (enc1.isLeftH()) Serial.println("Left holded");
if (enc1.isPress()) Serial.println("Press"); // нажатие на кнопку (+ дебаунс)
if (enc1.isClick()) Serial.println("Click"); // отпускание кнопки (+ дебаунс)
//if (enc1.isRelease()) Serial.println("Release"); // то же самое, что isClick
if (enc1.isHolded()) Serial.println("Holded"); // если была удержана и энк не поворачивался
//if (enc1.isHold()) Serial.println("Hold"); // возвращает состояние кнопки
}
Меняем величину с разным шагом
#define CLK 7
#define DT 8
#define SW 9
#include "GyverEncoder.h"
Encoder enc1(CLK, DT, SW);
int value = 0;
void setup() {
Serial.begin(9600);
enc1.setType(TYPE2); // тип энкодера TYPE1 одношаговый, TYPE2 двухшаговый. Если ваш энкодер работает странно, смените тип
}
void loop() {
// обязательная функция отработки. Должна постоянно опрашиваться
enc1.tick();
if (enc1.isRight()) value++; // если был поворот направо, увеличиваем на 1
if (enc1.isLeft()) value--; // если был поворот налево, уменьшаем на 1
if (enc1.isRightH()) value += 5; // если было удержание + поворот направо, увеличиваем на 5
if (enc1.isLeftH()) value -= 5; // если было удержание + поворот налево, уменьшаем на 5
if (enc1.isTurn()) { // если был совершён поворот (индикатор поворота в любую сторону)
Serial.println(value); // выводим значение при повороте
}
}
#define CLK 2
#define DT 3
#define SW 4
#include "GyverEncoder.h"
Encoder enc1(CLK, DT, SW);
int value = 0;
void setup() {
Serial.begin(9600);
enc1.setType(TYPE1); // тип энкодера TYPE1 одношаговый, TYPE2 двухшаговый. Если ваш энкодер работает странно, смените тип=
enc1.setFastTimeout(40); // таймаут на скорость isFastR. По умолч. 50
}
void loop() {
// обязательная функция отработки. Должна постоянно опрашиваться
enc1.tick();
if (enc1.isRight()) value++; // если был поворот направо, увеличиваем на 1
if (enc1.isLeft()) value--; // если был поворот налево, уменьшаем на 1
if (enc1.isRightH()) value += 5; // если было удержание + поворот направо, увеличиваем на 5
if (enc1.isLeftH()) value -= 5; // если было удержание + поворот налево, уменьшаем на 5
if (enc1.isFastR()) value += 10; // если был быстрый поворот направо, увеличиваем на 10
if (enc1.isFastL()) value -= 10; // если был быстрый поворот налево, уменьшаем на 10
if (enc1.isTurn()) { // если был совершён поворот (индикатор поворота в любую сторону)
Serial.println(value); // выводим значение при повороте
}
}
// два энкодера
#include "GyverEncoder.h"
Encoder enc1(4, 3, 2);
Encoder enc2(7, 6, 5);
void setup() {
Serial.begin(9600);
}
void loop() {
// обязательная функция отработки. Должна постоянно опрашиваться
enc1.tick();
enc2.tick();
if (enc1.isLeft()) Serial.println("enc 1 left");
if (enc1.isRight()) Serial.println("enc 1 right");
if (enc2.isLeft()) Serial.println("enc 2 left");
if (enc2.isRight()) Serial.println("enc 2 right");
}
// два энкодера
#include "GyverEncoder.h"
Encoder enc1(4, 3, 2);
Encoder enc2(7, 6, 5);
void setup() {
Serial.begin(9600);
}
void loop() {
// обязательная функция отработки. Должна постоянно опрашиваться
enc1.tick();
enc2.tick();
if (enc1.isLeft()) Serial.println("enc 1 left");
if (enc1.isRight()) Serial.println("enc 1 right");
if (enc2.isLeft()) Serial.println("enc 2 left");
if (enc2.isRight()) Serial.println("enc 2 right");
}
Настройка энкодера в другой тип
/*
В последнее время китайцы стали делать одинаковые модули (ку 40)
с разными типами энкодеров - полный период и полпериода.
Если ваш энкодер ведёт себя странно (один тик считает за два поворота),
то смените тип энкодера
*/
#define CLK 4
#define DT 3
#define SW 2
#include "GyverEncoder.h"
Encoder enc1(CLK, DT, SW);
void setup() {
Serial.begin(9600);
enc1.setType(TYPE2); // тип энкодера TYPE1 одношаговый, TYPE2 двухшаговый. Если ваш энкодер работает странно, смените тип
}
void loop() {
// обязательная функция отработки. Должна постоянно опрашиваться
enc1.tick();
if (enc1.isRight()) Serial.println("Right"); // если был поворот
if (enc1.isLeft()) Serial.println("Left");
if (enc1.isRightH()) Serial.println("Right holded"); // если было удержание + поворот
if (enc1.isLeftH()) Serial.println("Left holded");
}
#define CLK 6
#define DT 5
#define SW 4
#include "GyverEncoder.h"
Encoder enc1(CLK, DT, SW);
void setup() {
Serial.begin(9600);
enc1.setTickMode(AUTO);
}
void loop() {
// enc1.tick(); // не нужна, в этом режиме (AUTO) она входит в каждую функцию!
if (enc1.isTurn()) { // если был совершён поворот (индикатор поворота в любую сторону)
// ваш код
}
if (enc1.isRight()) Serial.println("Right"); // если был поворот
if (enc1.isLeft()) Serial.println("Left");
if (enc1.isRightH()) Serial.println("Right holded"); // если было удержание + поворот
if (enc1.isLeftH()) Serial.println("Left holded");
if (enc1.isPress()) Serial.println("Press"); // нажатие на кнопку (+ дебаунс)
if (enc1.isRelease()) Serial.println("Release"); // отпускание кнопки (+ дебаунс)
if (enc1.isHolded()) Serial.println("Holded"); // если была удержана и энк не поворачивался
//if (enc1.isHold()) Serial.println("Hold"); // возвращает состояние кнопки
}
/*
Пример работы с энкодером с прерыванием. Максимальная чёткость работы
в любом быдлокоде!
*/
#define CLK 2
#define DT 3
#define SW 4
#include "GyverEncoder.h"
Encoder enc1(CLK, DT, SW);
void setup() {
Serial.begin(9600);
attachInterrupt(0, isr, CHANGE); // прерывание на 2 пине! CLK у энка
}
void isr() {
enc1.tick(); // отработка в прерывании
}
void loop() {
enc1.tick(); // отработка
if (enc1.isRight()) Serial.println("Right"); // если был поворот
if (enc1.isLeft()) Serial.println("Left");
if (enc1.isRightH()) Serial.println("Right holded"); // если было удержание + поворот
if (enc1.isLeftH()) Serial.println("Left holded");
}
Отработка с прерыванием по таймеру
/*
* Отработка по прерыванию таймера
*/
#define CLK 7
#define DT 8
#define SW 9
#include "GyverEncoder.h"
#include "TimerOne.h"
Encoder enc1(CLK, DT, SW);
void setup() {
Serial.begin(9600);
enc1.setType(TYPE2); // тип энкодера TYPE1 одношаговый, TYPE2 двухшаговый. Если ваш энкодер работает странно, смените тип
Timer1.initialize(1000); // установка таймера на каждые 1000 микросекунд (= 1 мс)
Timer1.attachInterrupt(timerIsr); // запуск таймера
}
void timerIsr() { // прерывание таймера
enc1.tick(); // отработка теперь находится здесь
}
void loop() {
if (enc1.isRight()) Serial.println("Right"); // если был поворот
if (enc1.isLeft()) Serial.println("Left");
if (enc1.isRightH()) Serial.println("Right holded"); // если было удержание + поворот
if (enc1.isLeftH()) Serial.println("Left holded");
}
ВИДЕО
ПОДДЕРЖАТЬ
Вы можете поддержать меня за создание доступных проектов с открытым исходным кодом, полный список реквизитов есть вот здесь.
Ошибка NVENC — одна из тех ошибок, с которыми сталкиваются пользователи программного обеспечения Open Broadcaster (OBS) при потоковой передаче или записи видеоконтента. Ошибка вызвана рядом факторов, включая аппаратную и программную несовместимость, аппаратные ограничения и неправильные настройки OBS.
В этой статье больше внимания будет уделено OBS-ошибке NVENC, ее первопричинам и способам ее устранения. Мы также рассмотрим различные способы устранения этой распространенной проблемы и дадим советы по улучшению скорости и качества потокового видео.
Содержание
- Что такое OBS NVENC Encoder?
- Что вызывает ошибку OBS NVENC?
- Как исправить ошибку OBS NVENC?
- Решение 1. перезагрузите компьютер
- Решение 2. обновите драйвер графического процессора
- Решение 3. уменьшить разрешение вывода в OBS
- Решение 4. отключение внутриигрового наложения (NVIDIA и Discord)
- 4A. Отключите настройки наложения в Nvidia Experience
- 4B. Отключите настройки наложения в Discord
- Решение 5. Переключитесь на быструю синхронизацию, чтобы использовать аппаратное кодирование
- Решение 6. Переключитесь на программное обеспечение (x264) для использования программного кодирования
- Решение 7. переустановите распространяемые файлы Microsoft C ++
- Рекомендуемое решение — исправить различные проблемы и ошибки ПК
- Заключение
Что такое OBS NVENC Encoder?
NVENC encoder OBS, или NVIDIA Encoder OBS, представляет собой технологию кодирования видео, разработанную NVIDIA, которая позволяет пользователям передавать или записывать высококачественное видео на свой компьютер без ущерба для производительности или частоты кадров. Он используется многими стримерами, геймерами и создателями видеоконтента для захвата и трансляции своего контента.
NVENC encoder OBS доступен как в бесплатной, так и в платной версиях. Бесплатная версия позволяет пользователям кодировать видео до 1080p со скоростью 60 кадров в секунду (FPS), в то время как платная версия поддерживает видео до 4K со скоростью 120 кадров в секунду. Платная версия также предлагает дополнительные функции, такие как пользовательские профили и расширенные настройки.
Что вызывает ошибку OBS NVENC?
Это одна из самых распространенных ошибок, с которыми сталкиваются геймеры и стримеры при использовании программного обеспечения для открытого вещания (OBS). Обычно она появляется при попытке потоковой передачи или записи с помощью OBS и вызвана проблемой с аппаратным или программным обеспечением вашего компьютера.
- Наиболее распространенной причиной ошибки NVENC является устаревшая версия вашего графического диска
- Другой потенциальной причиной проблемы OBS NVENC является конфликт между приложением OBS и другими приложениями или службами, запущенными на вашем компьютере.
- Любые настройки наложения и конфликтующие компоненты Microsoft Visual C ++ также приводят к обсуждаемой ошибке.
- Наконец, ошибка может быть вызвана неисправной или устаревшей версией библиотеки NVIDIA Encoder library, которая используется OBS для аппаратного ускорения кодирования видео.
Как исправить ошибку OBS NVENC?
Прежде чем приступить к решению проблемы с методами устранения неполадок, вы должны открыть диспетчер задач и завершить все задачи, которые не связаны с OBS. Кроме того, вам следует отключить любое антивирусное или брандмауэрное программное обеспечение, установленное на вашем компьютере, поскольку они могут мешать работе OBS.
Кроме того, чтобы устранить эту проблему, вы должны убедиться, что ваше оборудование соответствует минимальным системным требованиям для запуска OBS. Вы можете найти эти требования на веб-сайте OBS.
Тем не менее, если вы столкнулись с той же ошибкой, воспользуйтесь приведенными ниже решениями.
Решение 1. перезагрузите компьютер
Перезагрузка компьютера может помочь сбросить любые неправильно настроенные настройки или сбои в системе. Это не только очистит память, используемую приложениями и процессами, но также обновит службы и драйверы, которые могут вызывать ошибку NVENC в OBS. Если вы столкнулись с этой проблемой с функцией OBS NVENC, рекомендуется полностью отключить компьютер, а не переводить его в режим ожидания или гибернации.
- Нажмите клавиши Windows + D, чтобы перейти на рабочий стол. Затем нажмите клавиши Alt + F4 и выберите перезапуск
- Затем нажмите OK.
Решение 2. обновите драйвер графического процессора
Обновление драйверов может помочь обеспечить бесперебойную и эффективную работу всех компонентов вашего компьютера. Но перед обновлением убедитесь, что драйверы других компонентов, таких как звуковые карты и мониторы, также обновлены, чтобы все работало правильно.
- Нажмите клавишу Windows и введите Диспетчер устройств. Нажмите «Открыть«.
- Дважды щелкните на адаптерах дисплея, чтобы развернуть драйвер.
- Щелкните правой кнопкой мыши графический драйвер и выберите опцию Обновить драйвер.
- Теперь нажмите на автоматический поиск для опции обновленного программного обеспечения драйвера.
- Следуйте инструкциям на экране, чтобы завершить процесс обновления, выйти из окна и перезагрузить компьютер после установки последних версий драйверов.
Кроме того, вы также можете автоматически обновлять драйвер с помощью инструмента Driver Easy. Это продвинутый инструмент, который одним сканированием обновляет все системные драйверы.
Решение 3. уменьшить разрешение вывода в OBS
Уменьшение выходного разрешения снижает объем данных, необходимых для обработки вашим оборудованием, обеспечивая более стабильную производительность с минимальными перерывами. Это также помогает экономить пропускную способность при потоковой передаче прямых трансляций, уменьшая задержку во время воспроизведения. Вот несколько инструкций по уменьшению разрешения в OBS, чтобы исправить ошибку при открытии кодека NVENC на вашем ПК.
- Перейдите в приложение OBS Studio и нажмите на кнопку Настройки в правом нижнем углу экрана.
- Перейдите на левую панель, перейдите на вкладку Видео и прокрутите правую панель вниз, нажмите на выходное (масштабированное) разрешение
- Теперь выберите любые более низкие значения разрешения из выпадающего списка.
Примечание: Эти изменения не изменят макет закодированных видеороликов.
- Нажмите на кнопки Применить и ОК, чтобы недавние изменения вступили в силу.
Перезапустите приложение сейчас, оно не выдаст никакой ошибки.
Решение 4. отключение внутриигрового наложения (NVIDIA и Discord)
Когда OBS не удалось начать запись, возникает ошибка NVENC, скорее всего, из-за включения наложения в игре. Эта функция может вступать в конфликт со способностью OBS записывать с помощью NVENC, что приводит к описанной ошибке NVENC.
Если внутриигровое наложение уже отключено, следующим шагом будет проверка, включено ли какое-либо другое наложение. Некоторые игры или приложения могут иметь несколько наложений, поэтому важно убедиться, что все они отключены.
Если ваш компьютер использует Discord или NVIDIA experience, следуйте приведенным ниже вспомогательным инструкциям, чтобы устранить проблему.
4A. Отключите настройки наложения в Nvidia Experience
- Перейдите на рабочий стол и наведите курсор мыши на панель задач. Нажмите на значок со стрелкой, чтобы запустить скрытые значки.
- Теперь щелкните правой кнопкой мыши на значке NVIDIA и выберите опцию Nvidia GeForce Experience из доступного списка.
- Теперь в приложении Nvidia GeForce Experience найдите значок шестеренки в строке меню и нажмите на него, чтобы открыть настройки.
- Перейдите в меню ОБЩИХ настроек, перейдите на правый экран и нажмите на внутриигровой ОВЕРЛЕЙ, если вы видите рядом с ним зеленый переключатель, нажмите на него, чтобы отключить его.
- Наконец, настройки наложения отключены в NVIDIA. Запустите приложение OBS сейчас и убедитесь, что вы не столкнулись с ошибкой сейчас.
4B. Отключите настройки наложения в Discord
- Перейдите в Discord
- Теперь нажмите на значок шестеренки на главном экране Discord, чтобы запустить пользовательские настройки платформы.
- На левом экране перейдите к настройкам приложения и нажмите на него.
- Теперь нажмите на наложение.
- Теперь отключите включение наложения в игре, этот параметр будет выделен серым цветом, как только вы его отключите.
- Перезапустите OBS сейчас и проверьте, можете ли вы использовать его без каких-либо ошибок.
Решение 5. Переключитесь на быструю синхронизацию, чтобы использовать аппаратное кодирование
Если вы являетесь пользователем видеопотока, вы знаете, что наличие надежного решения для потоковой передачи видео крайне важно. К сожалению, кодировка OBS NVENC иногда может быть ненадежной, что приводит к пропущенным кадрам, заикающимся видео и другим проблемам. К счастью, есть простое решение: переключитесь на QuickSync!
QuickSync — это технология кодирования с аппаратным ускорением Intel. Он более надежен, чем NVENC, а также использует меньше ресурсов процессора, что означает, что ваш компьютер сможет обрабатывать больше задач без сбоев или пропуска кадров.
Примечание: Первым шагом при переключении на QuickSync является проверка соответствия вашего компьютера системным требованиям. Для быстрой синхронизации требуется процессор Intel Core i3, i5 или i7 с Intel HD Graphics 4000 или выше. Если ваш компьютер не соответствует этим требованиям, вы не сможете использовать QuickSync.
- Запустите приложение OBS и нажмите «Файл»> «Настройки«.
- Теперь перейдите на вкладку «Вывод» и нажмите QuickSync H.264 в кодировщике
Примечание: Если вы не видите вышеупомянутые настройки, вы должны убедиться, что вы находитесь в режиме расширенного вывода или нет.
- Сохраните самые последние изменения, нажав кнопки Применить> ОК, и приложение OBS теперь будет работать без каких-либо ошибок.
Решение 6. Переключитесь на программное обеспечение (x264) для использования программного кодирования
Чтобы исправить ошибку NVENC, переключитесь на программную кодировку. Это метод кодирования, который использует процессор, а не аппаратное кодирование. Программное кодирование более надежное и обеспечивает лучшие результаты, чем аппаратное кодирование, поскольку оно не страдает от тех же проблем с производительностью.
Во-первых, убедитесь, что у вас достаточно мощный компьютер для обработки программного кодирования. Если ваш компьютер работает слишком медленно, процесс кодирования может занять много времени, и вы можете столкнуться с низким качеством видео. Во-вторых, убедитесь, что у вас установлена последняя версия OBS. Затем следуйте приведенным ниже инструкциям, чтобы переключиться на программное кодирование.
- Снова перейдите к настройкам OBS> вкладка «Вывод» на левой панели. Когда вы это сделаете, на правой панели появится раздел потоковой передачи.
- Измените настройки кодировщика на программное обеспечение (x264) и убедитесь, что вы выбрали параметр Enforce streaming service encoder settings, как показано.
- Нажмите «Применить» и «ОК«, чтобы сохранить изменения.
- Перезагрузите компьютер, снова запустите приложение OBS и проверьте, устранена ли ошибка OBS NVENC для вас.
Решение 7. переустановите распространяемые файлы Microsoft C ++
Переустановка распространяемых файлов Microsoft C ++ — это быстрый и простой способ исправить ошибку NVENC в OBC. Поскольку компилятор Microsoft Visual C ++ используется для написания многих программ и приложений в OBS, важно убедиться, что установлена последняя версия распространяемых файлов Microsoft C ++.
- Перейдите в меню поиска и введите Приложения и функции. Теперь нажмите Открыть.
- Теперь введите и выполните поиск Microsoft Visual C ++
- Нажмите на любой пакет за раз и нажмите «Удалить«.
- Выполните следующие действия для всех пакетов в вашей системе и продолжайте с последующими запросами на их удаление.
- Когда вы обнаружите, что пакеты успешно удалены, нажмите клавишу «Пуск» и введите командную строку.
- Нажмите «Запуск от имени администратора«, чтобы запустить командное окно.
- Затем введите следующие команды и нажмите Enter
- Dism.exe /онлайн /Очистка-Изображение /StartComponentCleanup
- Дождитесь завершения сканирования DISM и перезагрузите компьютер с Windows.
- Теперь перейдите в свой браузер и перейдите на официальный веб-сайт Microsoft.
- Прокрутите экран вниз и загрузите последние распространяемые файлы Visual C ++ для Visual Studio 2015, 2017 и 2019.
- Подождите, пока все распространяемые файлы Visual C ++ не будут успешно загружены на ваш компьютер.
- Установите все пакеты из моих загрузок, следуя инструкциям на экране.
- Наконец, перезагрузите компьютер
После перезагрузки компьютера снова запустите приложение OBS. Теперь это не выдаст вам никакой ошибки.
Рекомендуемое решение — исправить различные проблемы и ошибки ПК
Если система вашего ПК / ноутбука с Windows работает медленно или показывает различные проблемы и ошибки, просканируйте вашу систему с помощью средства восстановления ПК. Это мощное средство восстановления, которое всего лишь одним сканированием обнаруживает и устраняет различные проблемы и ошибки Windows.
Инструмент исправляет распространенные ошибки ПК, такие как повреждение системных файлов, и защищает от потери файлов, вредоносных программ, аппаратных сбоев, ошибок BSOD и многого другого.
Что ж, это не только исправляет ошибки, но и повышает производительность ПК с Windows.
Заключение
Итак, это все об ошибке OBS NVENC.
Здесь мы перечислили все возможные способы устранения неполадок, чтобы исправить ошибку и начать потоковую передачу или запись видеоконтента.
Предполагается, что приведенные исправления помогут вам полностью устранить ошибку, внимательно следуйте исправлениям, приведенным одно за другим.
NVIDIA NVENC — это функция видеокарт NVIDIA, которая позволяет выполнять некоторые задачи, включая кодирование видео, но некоторые пользователи OBS Studio сообщают об ошибках NVENC.
Благодаря этой функции он переносит ресурсоемкую задачу с ЦП на определенную часть графического процессора.
Кроме того, полезно знать, что многие программы для прямой трансляции и записи, например vMix, Wirecast, Open Broadcaster и Bandicam, поддерживают кодировщик.
Кроме того, NVIDIA Encoder позволяет вам записывать свои игры и делиться ими. Это включено в программное обеспечение NVIDIA GeForce Experience.
В этой статье мы объясним, как вы можете решить все ошибки OBS Studio NVENC, с которыми вы можете столкнуться при использовании OBS.
Как включить аппаратное кодирование (NVENC) в OBS?
- Запустите OBS, нажмите «Файлы», затем выберите «Настройки».

- Затем выберите «Вывод» (расположен в боковом меню).

- Наконец, щелкните NVENC H.264 в окне, которое открывается в раскрывающемся списке кодировщика, чтобы включить аппаратное кодирование.
Если вы спрашиваете, что такое кодек NVENC, это инструмент для аппаратного кодирования, доступный в версиях OBS для Mac и Windows.
Но для лучшего результата разработчики рекомендуют использовать кодировку на компьютерах под управлением Windows.
Кроме того, его лучше всего использовать с графическими процессорами NVIDIA. Аппаратное кодирование доступно на картах NVIDIA с начала 2012 года.
Как я могу исправить ошибки OBS NVENC?
1. Исправить ошибку OBS Studio NVENC неподдерживаемое устройство
- Сначала откройте программу OBS.
- Нажмите «Файл» и перейдите в «Настройки».

- Перейдите на вкладку «Вывод».

- Затем найдите потоковую коробку.
- Нажмите на кодировщик и измените его на Quicksync (QSV) или x264 вместо NVENC.

- Наконец, выберите ОК.
2. Исправьте ошибку OBS NVENC: слишком много одновременных сеансов.

Ошибка OBS NVENC, которая говорит, что у вас слишком много одновременных сеансов, означает, что у вас больше одновременных сеансов кодирования, чем поддерживает ваш графический процессор.
Современные драйверы графического процессора могут поддерживать до трех сеансов, в то время как старые драйверы ограничиваются двумя сеансами. Если вы считаете, что у вас не так много одновременных сеансов, перезагрузите компьютер.
3. Исправить ошибку OBS NVENC не удалось: 8

Полное сообщение об ошибке для этой проблемы сопровождается спецификацией NV_ENC_ERR_INVALID_PARAM.
Причина этой ошибки в том, что NVENC не поддерживает разрешения выше 4096 по самой большой стороне и не может ничего захватить или показать.
Вы должны установить выходное разрешение ниже 4096 по наибольшей стороне. Базовое (холстовое) разрешение может быть больше, чем выходное (масштабированное), если вам это нужно.
4. Исправить ошибку инициализации кодировщика OBS NVENC.
- Щелкните правой кнопкой мыши кнопку «Пуск» и выберите «Диспетчер устройств» из списка.

- Разверните раздел «Видеоадаптеры», щелкните правой кнопкой мыши драйвер NVIDIA и выберите «Обновить драйвер».

- Нажмите «Автоматический поиск драйверов», и система выполнит поиск лучшего драйвера.

Чтобы исправить ошибку кодировщика Init, вам необходимо обновить драйвер NVIDIA до последней версии.
Если приведенного выше решения недостаточно, посетите раздел загрузки драйверов NVIDIA и получите последнюю версию драйвера с их веб-сайта.
Обязательно получите соответствующую версию для вашего оборудования. В противном случае вы рискуете получить другие графические ошибки и системные проблемы, такие как BSoD.
Чтобы избежать этого, используйте такой инструмент, как DriverFix, который определяет используемое вами оборудование и автоматически загружает соответствующие драйверы.
Кроме того, замена nvEncodeAPI.dll, расположенной в следующем каталоге, предыдущими версиями этого DLL-файла может помочь исправить ошибки OBS Studio NVENC:C:WindowsSysWow64
Для этого вам нужно загрузиться в безопасном режиме. Предыдущие версии nvEncodeAPI.dll можно найти по следующему адресу:C:WindowsSystem32DriverStoreFileRepositorynv_disp.inf_amd64_neutral_
5. Исправьте неверный параметр ошибки OBS NVENC.
Максимальное разрешение, к которому вы можете стремиться в NVENC h.264, составляет 4096 × 4096. Однако NVENC h.265 поддерживает разрешение до 8192×8192 пикселей.
Дело в том, что стриминговые сервисы не поддерживают h.265. Вы можете использовать его только с выходом FFmpeg OBS. Итак, вы собираетесь пойти на 4096 в основном.
6. Исправлен кодек OBS NVENC: функция не реализована
- Перейдите в значок «Файл» и нажмите «Настройки», чтобы открыть его.

- На вашем экране откроется окно настроек; теперь выберите вкладку «Вывод».

- После этого найдите потоковую коробку.

- Нажмите на Encoder и измените его на Software вместо NVENC.
- Теперь нажмите ОК.
Как я могу исправить перегрузку кодирования OBS NVENC?
Одним из решений, которое может исправить эту ошибку OBS NVENC, является снижение частоты кадров. Если вы снимаете с высокой частотой кадров (от 48 до 60), могут возникать задержки.
Это может произойти по ряду причин. Однако основная причина заключается в том, что ваш графический процессор не может отображать как саму игру, так и видео, которое вы транслируете.
- Сначала откройте «Настройки» и нажмите «Видео».

- Есть раздел Common FPS Values. Выберите его и выберите 30 или меньше.

- Затем нажмите «ОК» и закройте OBS. Теперь перезагрузите компьютер и проверьте свой поток, чтобы увидеть, появляется ли ошибка снова.
Если вы не обновили свои драйверы в OBS NVENC после открытия NVIDIA GEFORCE EXPERIENCE, щелкните драйверы и обновите их. Не забудьте после этого перезагрузить компьютер.
Вы также можете использовать ICQ в качестве контроля скорости и установить значение качества ICQ от 20 (лучшее качество, файлы большего размера) до 23 (ухудшенное качество, файлы меньшего размера).
Помните, что OBS использует потрясающую библиотеку кодирования видео с открытым исходным кодом — x264. Вы можете установить предустановку кодировщика x264 на сверхбыструю, чтобы снизить нагрузку на ЦП.
Сообщите нам, какое решение вы использовали для успешного устранения проблем OBS Studio NVENC в разделе комментариев ниже.
-
#4
Same issue. Using «Simple» mode with 1080p base and output resolutions. Works perfectly on 28.0.X, nor streaming not recording works on 28.1.2.
-
#5
Seems to be, found the solution — in Advanced mode there is «multipass encoding» tab and the middle line chosen from the three by default (double pass with quarter resolution etc) — to solve the issue, we need to choose any from other two — either single (top) or double (with full resolution) — both solved the issue for me.
I am using 2.0 bugfix downloaded on June 19th on a RUMBA board with the REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
Description
If I set ENCODER_PULSES_PER_STEP 2 (or 3 or 4…) I get some flashing interference (about 1Hz) on the LCD, it appears that some pixels from characters or graphics are shifting left by approx 16 pixels
If I set ENCODER_PULSES_PER_STEP 1 the LCD is perfectly stable.
Steps to Reproduce
In configuration.h set set ENCODER_PULSES_PER_STEP 2
See above
Expected behavior: [What you expect to happen]
A stable LCD screen regardless of the ENCODER_PULSES_PER_STEP setting
Actual behavior: [What actually happens]
See above
