Ви не увійшли.
https://forum.arduino.ua/img/members/3885/Omron-E6B2_CWZ6C.zip
В цій імплементації зміна стану відбувається лише по одному фронту однієї фази. Такий метод в більшості випадків нормально працює при постійному обертанні вала. Але на граничних умовах - наприклад, покачування вала в обидва боки - будуть хибні спрацювання.
Повноцінний конечний автомат квадратурного енкодера виглядає десь так:
що досить просто реалізується за допомогою таблиці переходів.
2. Енкодер на валу двигуна підраховує кількість імпульсів за заданий інтервал часу.
Який діапазон швидкостей обертання?
на один механічний оберт вала енкодера Omron E6B2-CWZ6C щоразу видає нове значення.
Енкодер не видає значення, енкодер видає сигнали. Як ви їх обробляєте?
Мені ідея з динамічним створенням об'єктів категорично не подобається.
Ми навіть не знаєм, як там той обʼєкт створюється. Код же не показали.
Я взагалі не розумію, навіщо бібліотека заради десятка рядків коду.
Тут і невикористані піни бажано конфігурувати в детермінований стан чи вимикати digital input. Це одна з перших речей, з якою знайомляться при навчанні програмуванню МК. Але культура ардуіно цього не виховує.
Немає жодних активних та пасивних елементів – є тільки кабелі. На малюнку зрізаний приклад з'єднань: А0 - А1 це приклад робочого ланцюга, в момент виміру ємності цей ланцюг розірваний перемикачем
Щось все одно не дуже ясно. Бачу три перемикачі 4P1T і один 2P1T. Але 4P мають ще одне положення, у якому повзунок "висить у повітрі"?
і вимір (у цьому випадку) виконується між А0 - А2 і А1 - А2
Тобто при такому положенні перемикачів як на малюнку:
вимір №1: outPin=A0, inPin=A2 (ємність між повзунками верхнього і нижнього перемикачів)
вимір №2: outPin=A1, inPin=A2 (ємність між провідником від A1, що йде до одного з контактів верхнього перемикача, і повзунком нижнього перемикача)
?
(другий кінець від А2, в момент виміру теж нікуди не підключений).
По малюнку він підключений до повзунка перемикача. Повзунок може мати помітний ємносний звʼязок з контактами, в залежності від конструкції.
І якщо замір першої пари відповідає, то на другій парі – рандом.
А якщо потім знову перша пара?
Після деструкції обʼєкта CapacitorLite перед створенням нового ви переводите outPin у його початковий стан - floating input?
Спробуйте перед аимірюванням перевести всі піни в output і вивести на них 0.
В конструкторі CapacitorLite вони уже переводяться в output з низьким рівнем. Але при створенні нового обʼєкта з іншим значенням outPin, попередній залишається в output. inPin, наскільки розумію, в даному випадку залишається тим же.
Автор стверджує, що при першому вимірі наче все ок, а після якихось там перекомутацій стає не ок. Спочатку треба зрозуміти, що там куди комутується, щоб пояснити таку поведінку. А потім уже можна думати, як позбутись небажаних ефектів.
[телепат mode on]
Якщо там залишається якась заряджена ємность, то розряджати примусово. Але якщо там паразитне живлення через діод всередині корпуса компонента, чи якісь інші напівпровідники, то такий метод виміру взагалі не працюватиме. Таку лінію потрібно вимірювати напругою до 100 мВ, як це робиться у внутрішньосхемних тестерах ємності. А якщо там якісь конденсатори MLCC, то у них мало того що ємність змінюється в кілька разів в залежності від напруги, так і ефект памʼяті може проявлятись.
[телепат mode off]
Взагалі, виглядає як проблема XY.
Вимірюється ємність того, що підключено до вивода на момент виміру. Це кабелі різних типів, які запитані тільки з плати, до якої підключені.
Покажіть схему, бо за словесним описом нічого не зрозуміло. І вкажіть, в якому порядку що комутується при вимірах.
Уточню ще той аспект, що в момент вимірювання кабель з одного боку підключений до виведення плати, а з іншого боку - висить у повітрі.
Якщо поряд з провідником є інші провідники, то звісно, і вони самі впливають на результат, і те, що до них підключене.
до платы, через перемикачи пiд'єднано багато кабелiв, рiзного типу (що мають рiзну ємкiсть). Плата надсилає мiкросикунднi 0 та считує цi iмпульси (при пiдтянутiй 1)
1-wire?
Показником сicтеми є ємкiсть у окремий вiдлiк часу.
Так ємність чого ви вимірюєте? Ємність шини, разом з пристроями, що з неї і живляться?
Але якщо цей блок з'єднань був задіяний в інших режимах роботи плати
Що за блок? З чого він складається, як підʼєднаний, що на нього подається в "інших режимах"?
Цей метод виміру ємності базується на тому факті, що напруга на конденсаторі прямо пропорційна заряду і обернено пропорційна його ємності. Так як послідовно зʼєднані конденсатори отримують однаковий заряд, то знаючи ємність одного можна обчислити ємність другого. В ролі конденсатора з відомою ємністю виступає розподілена ємність. Ніяких блоків у цьому методі не передбачено.
Менi потрiбна можливiсть приведення будьяких з'єднань до загального рiвня, незалежно вiд початкового стану к схемi.
Калібрування. Це ж було вже.
Як перед вимiром нівелювати різноспрямовані заряди ємностей, щоб отримати адекватний показник (пропорцiйний)?
Там перед вимірюванням обидва піни сконфігуровані на вихід з низьким рівнем. Заряд між піном і землею - нуль, між піном і живленням - напруга живлення, помножена на розподілену ємність ємність шини живлення, яку для джерела напруги можна вважати нескінченною. При перемиканні піна у високий рівень в будь-якому разі буде заряджатись як вимірювана ємність, так і розподілена.
Прошу тих, хто у темі, дати пояснення: які плюси має такий підхід?
Плюси: одночасний доступ до декількох бітів у межах однієї GPIO банки; на деяких контролерах можливіть атомарного toggle; зазвичай трохи швидше, трохи менше розмір коду.
Мінуси: не кросплатформно.
На скільки швидше виконується операція?
На якому контроллері, з яким фреймворком?
Реалізуйте обидва варіанти, заміряйте швидкість або проаналізуйте асемблерний код.
І чи варто взагалі використати такий підхід?
Іноді варто, іноді ні. Залежить від задачі.
Який є простий спосіб "скидання" всіляких зарядів до заданого виводу (виводам), щоб вимірювана величина ємності відповідала дійсності?
Щоб вимірювана величина відповідала дійсності, проводять калібровку, і враховують паразитні ємності при обчисленні актуального значення з виміряних величин.
Є декілька методів вимірювання ємності. Ви який збираєтесь використовувати?
https://forum.arduino.ua/img/members/4196/123.rar скетч
Це код, згенерований FLProg. Він не призначений для читання та редагування людиною. Змінювати потрібно в оригінальному .flp файлі, а не в генерованому проміжному коді.
А враховуючи географію розташування видавця того FLProg, сто раз подумайте, чи варто ним користуватись.
Звісно, якщо у когось багато вільного часу та натхнення, можна реверс-інженерити і розібратись, які змінні там за що відповідають. Але куди простіше написати таку ж функціональність з нуля.
посилання та скетч прикріпив
Це посилання на відео. Покажіть сам скетч, щоб не доводилось колупатись в якихось незрозумілих архівах на гугл драйв з корявим кодуванням імен файлів.
Несколько библиотек найдено для "Control_Surface.h"
Используется: C:UsersSDadminDocumentsArduinolibrariesControl_Surface
Не используется: C:UsersSDadminDocumentsArduinolibrariesControl-Surface-main
Як сказано вище, у вас чомусь дві бібліотеки, що надають Control_Surface.h. Що таке Control-Surface-main?
Як ви встановлювали Control_Surface? Яку версію?
Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"
Увімкніть цю опцію. Покажіть повний лог збірки, з командами, які виконуються. Бажано збережіть у файл та завантажте сюди чи на який-небудь pastebin, бо форум вирізає бекслеші у повідомленнях і робить логи погано читабельними.
Помилка можливо пов"язана з тим що компілятор С++ старий. Візьміть свіжу Arduino IDE.
Та наче і Legacy IDE, і 2.x IDE використовують один і той же тулчейн з gcc 7.3.0.
Щойно перевірив: в Arduino IDE 1.8.19 приклад "3. MIDI Interfaces/USBMIDI-Adapter" з Control_Surface версії 2.1.0 компілюється успішно для UNO, якщо замінити "midi_ser {Serial1}" на "midi_ser {Serial}". Але це ніяк не повʼязано з помилкою, що вилазить у автора.
Припускаю, що автор багато років не оновлював тулчейн, і там ще якийсь 5.x. Але це не точно. Потрібно бачити лог компіляції.
До речі, в кожному радіокерованому дроні є esp8265/esp8266/esp32. Таке життя..
Ну, не прям в кожному, різні бувають. А там де є - то не від хорошого життя, а за принципом "краще так, ніж ніяк".
Причем пишут, что эта часть работает на ядре 0, то если свою прошивку запустить на втором ядре, всё равно когда никогда может тормозок проскочить.
Ну, блоби фірмварі зараз багато де завантажуються: на GPU, на аудіочіпах, на мережевих адаптерах. Але що в ESP32 воно прямо на одному з ядер виконується, не знав. Не розумію таких рішень.
Так что, для управления ядерным реактором, я больше бы доверился стм, а не этой китайской фигне.
100%
Вот мне и стало интересно, каким образом нынче можно проверить безотказность действия электронной приблуды, если даже программист не знает как работает та ОС, если исходники закрыты и хрен его знает что она там вытворит.
В теорії, має бути специфікація інтерфейсів такої ОС. Якщо програма користується інтерфейсами коректно, згідно специфікації, то все ок. Для того такі мови як C та C++ стандартизовані по ISO. А наскільки довіряти самій такій закритій ОС - нехай уже менеджмент вирішує і бере на себе відповідальність, а не програміст.
Те ж саме і з залізом.
когда появились есп (а там без freertos никак) ... видимо та ос что-то себе там придумала поработать...
Хіба там якась закрита ОС? Я глибоко не копав, але наскільки знаю, там похідна від FreeRTOS чи щось подібне, і збирається з ісходніків. То сама архітектура Xtensa наче б то пропрієтарна. А останні сімейства ESP32 на ядрі Risc-V взагалі.
Случайно, не Вы ли мне ТАУ в КПИ преподавали? )))
Ні, не памʼятаю такого в своїй біографії)
Помница на ютубе видел передачку, где аппарат лучевой терапии, из-за глюка в программе убил несколько пациентов. А ведь наверняка такой аппарат проходил все проверки.
Therac-25? Якраз після того інциденту вимоги до сертифікації в мед.індустрії були переглянуті та суттєво посилені.
Представляю как сейчас такое можно показать, например, на есп32 со встроенной закрытой операционкой.
Із теорії надійності, система може вважатись надійною лише коли доведена коректність взаємодії між її складовими компонентами, і кожний компонент системи є також надійним (рекурсивно).
Проприєтарні технології - то взагалі окрема тема.
я не про бытовые безделушки, а там, где глюк в программе может стоить человеку здоровья или жизни.
Такі проекти мають проходити незалежний аудит і сертифікацію.
Чет у автора через полдня нифига не запрацювало... или это другое?
Яка там у автора мотивація використовувати STM32 і RTOS для цієї задачі - то не моя справа) Я про загальну тенденцію в індустрії, де "не влазить в STM32F103 - візми STM32F411", бо так виходить дешевше.
лет двадцать назад такие проекты умудрялись в тини13 впихивать, а нынче стм с 32кб не хватает.
Зараз теж ніхто не заважає впихнути. Але критерії змінились. Зараз цінується, щоб без занурення в тему і через півдня якось запрацювало. Ресурси на розробку (час × кваліфікація) дорожчі за елементну базу.
Походу тут дилема.
В розробці так завжди
За виграш в одному доводиться платити чимось іншим.
І лібу знайти можна під що завгодно.
Можна відмовитись від ардуіно фреймворка і збирати прямо з FreeRTOS. Звісно, бібліотеки, що використовують ардуіно-специфічні API, доведеться або адаптувати, або замінити, або реалізувати самому.
Але жирне.
Жирне воно буде в будь-якому разі. 32 кілобайта на 32-бітній архітектурі - це не ті ж 32 кілобайта на 8-бітній.
Як мінімум для дисплея з i2c ліба під cmsis існує
Доречі, хіба у 1602 дисплея рідний інтерфейс - I2C? Там же мабуть HD44780 і екстендер типу PCF8574. Якщо підключити через рідний інтерфейс, то не потрібно ні Wire, ні I2C HAL. Датчик MAX6675 на SPI же наче б то.
Зручніше ніж ардуїнівський суперцикл - окремі ізольовані таски. ... Але розмір не радує.
А ще окремий стек в RAM для кожної задачі. Та й цикл воно, наскільки бачу, все одно крутить, тільки пустий.
Логіку ізолювати можна і без RTOS. То якщо задачам пріорітети потрібні, тоді має сенс. Ну то таке.
Правда цілочисленний PID регулятор може спрацювати не так як хочеться
Fixed point? Для вашої задачі, думаю, точності має вистачити.
Походу так. І походу притягнув її дисплей з i2c.
Якщо в самому HAL так інтерфейс до I2C реалізовано, то воно і напряму, без Wire, буде здорове. Я би пошукав альтернативні імплементації, щоб без slave mode. Якщо нема, то можна й HAL'івську імплементацію трохи порізати. Але там окрім I2C іншого болота теж вистачає.
Також можна спробувати зібрати з LTO (build_flags = -flto). Але не факт, що успішно злінкується без танців з бубном.
Що у вас за конфігурація platformio?
Які саме ліби використовуєте?
Для термостата що там потрібно? Регулятор та примітивний UI. Не дуже розумію, навіщо там RTOS.
взяв тулзовину puncover, дивлюсь куди ділось 32к флешки.
А objdump що показує? Окрім .text є ще секції .data та .rodata.
Наприклад, дисплей хоч і символьний, але бібліотека може тягнути кастомні бітмапи для завантаження в CGRAM.
Я так розумію, дуже багато місця зайняла float математика, яку притягнула з собою ліба термометра (_adddf3, __aeabi_dmul і тому подібне).
Їх може і який-небудь snprintf() притягнути.
Але абсолютний рекордсмен - HAL (HAL_I2C_EV_IRQHandler, HAL_RCC_OscConfig,HAL_UART_IRQHandler).
Так це мабуть ардуінівська Wire. Вона дурна.
UPD: сама по собі HAL_I2C_EV_IRQHandler() в stm32f1xx_hal_i2c.c монструозна. Не розумію, навіщо імплементувати і master, і slave mode в одному місці одночасно.
Теж не працює на arduino nano, на іншій платі процює
На якій іншій? Подивіться, чим ті плати відрізняються. Може це підкаже де проблема.
Яка версія прошивки, 1.5, чи 1.4, чи ще якась?
DEBUG_UART ставив в 1, нічого не змінилось
Навіть "start" на UART не зʼявляється після ресету?
При включенні помпа одразу працює, sw енкодера як інвертовано працює.
Там в якості вимикача живлення навіщось цілий драйвер двигунів використовується. У вас такий же драйвер? Що на D3 при включенні?