Ви не увійшли.
Вот это самый главный неиследованный вопрос. Почему должно что-то не то записаться? Если, например, подключить к выводу XTAL генератор импульсов и подавать по одному импульсу хоть раз в день, от этого программа не будет выполняться?
З даташита Atmega328P:
When applying an external clock, it is required to avoid sudden changes in the applied clock frequency to ensure stable operation of the MCU. A variation in frequency of more than 2% from one clock cycle to the next can lead to unpredictable behavior. If changes of more than 2% is required, ensure that the MCU is kept in reset during the changes.
Це якщо сконфігуровано для External Clock. Якщо сконфігуровано для кварца, то таке взагалі не передбачається.
Чисто теоретично, в повністю статичному МК (без DRAM, такому як AVR), якщо імпульси з правильними фронтами (з одного боку достатній slew rate, з іншого вищі гармоніки на допустимому рівні), то має працювати (ще питання по роботі АЦП та записі в EEPROM).
Але які там будуть імпульси, коли генерація ще не стабілізувалась? От перевищить амплітуда поріг на декілька наносекунд, один блок МК сприйме це за тактовий імпульс, а інший його пропустить, і все.
В деяких схемах ставлять D-тригер для поділу частоти кварца навпіл, це дещо підвищує стабільність, але не у всіх випадках.
Согласен, в авр для этого даже фьюзы специальные есть. (65 мс максимум, если память не подводит). Только речь же была, что программа "херовила", т.е. тактирование, какое-никакое, но всё же было. Или я не понял вопрос.
Ну ось іде нормальне тактування, програма виконується. Тут приходить імпульс, який зриває генерацію, кварц починає "розкачуватись" заново. Ядро замість стабільних 16 МГц отримує хто зна шо в якому спектрі. При цьому відбувається читання/запис регістрів чи SRAM. Прочитатись чи записатись може зовсім не те, що мало би при нормальній роботі.
зы. Да и то, что выручил внешний генератор тоже такое...
Автор же про внутрішній RC писав. Релаксаційний осцилятор сам по собі набагато стабільніший, тим більше на кристалі самого МК.
Что-то странно. Кварц может "плыть" только от перепадов температуры
Мова не про стабільність частоти, а про зрив генерації. Кварцу потрібен деякий час, щоб коливання стабілізувались та вийшли на потрібну амплітуду. А якщо в МК використовується PLL, то ще й час на захоплення фази.
Ще коли по живленню йде дзвін, близький до однієї з гармонік, кварц може намагатись заводитись не на тій гармоніці, на якій потрібно.
В мене були проблеми на avr, пов'язані з кварцем. При зовніх завадах чіп починав поводити себе хаотично. Це було не часто, але було. Точного вимірювання часу було не потрібно, тому проблема повністю була вирішена шляхом переходу на внутрішній генератор. Я більш всього не хочу щоб таке трапилось з esp32, тоб то не ребут або резет по вачдогу а саме раптова хаотична поведінка
Отож. Внутрішній RC-осцилятор надійніше, але чи буде на ESP32 з ним працювати вайфай? В цю тему не заглиблювався, припускаю, що тільки з зовнішнім кварцем. Треба дивитись в документацію, як там підсистема тактування реалізована, але мені зараз лінь шукати.
Може спеціалісти по ESP32 підкажуть, чи можна у ESP32 тактувати ядро внутрішнім осцилятором, а вайфай зовнішнім кварцем.
Там же ще низькочастотний RTC осцилятор є.
Якщо збираєтесь використовувати екранований модуль, то і кварц буде під екраном, так що з точки зору електромагнітних перешкод має бути ок. Якщо по живленню чи з периферії нічого не пролізе.
З кварцем проблеми в основному через механіку, температуру, або плату погано помили. Але у разі збою ядро з Clock Failure Detector автоматично перемкнеться на внутрішній осцилятор, і як мінімум дасть можливість сигналізувати про збій.
Також не зашкодить увімкнути бортовий ватчдог, або навіть поставити зовнішній.
Щодо можливостей самих контролерів по забезпеченню надійності, то потрібно дивитись, які можливості вам потрібні. Звісно, абсолютну надійнісь забезпечити неможливо, але потрібно намагатись, щоб у разі збою поведінка системи була принаймні детермінованою.
Наприклад, у STM32 та деяких AVR є апаратний механізм Clock Failure Detection. У ESP32 такого не зустрічав. Може тому що розробники вирішили, що збій осциляції не є проблемою у сценаріях застосування ESP32, а може тому що стабільність забезпечуєься якимись іншими внутрішніми механізмами.
Brownout Detector наче б то є у всіх.
Електромагнітна сумісність визначається для пристроя в цілому, а не для окремого компонента, такого як МК.
Результат залежить від реалізації схеми живлення, способу підключення датчиків та виконавчих пристроїв, розводки плати, екранування і т.д.
"Шумне" середовище - теж розпливчате поняття, у шума є певний спектр, інтенсивність.
Навряд чи на ваше питання "чи можна так зробити" можна відповісти без практичних випробовувань конкретного пристроя в конкретних умовах.
github.com/BruceDevices/firmware/issues - тут уже дивились?
причем младший нибл, интересненько.
А саме 3-й біт, 0x08.
Флеш посипалась, усьо.
Воно-то може полежати і після стирання ще почати програмуватись, але я б на це не розраховував і цьому чіпу не довіряв.
а от з флеш щось не зрозуміле
Зітріть флешку, зчитайте її. Якщо там не 8 кілобайт FF'ок, то хана флешці. Якщо після стирання все ок, запишіть 8 кілобайт нулів, зчитайте знову. Якщо зчитуються не всі нулі, то теж хана.
Хоча якщо комірки "розхитані", то буває зразу читається нормально, а через тиждень чи місяць уже сиплеться.
вручну я вказував не всі змінні, що присутні в розрахунках. інші були реальними.
Якщо у вас, наприклад, було щось типу
float v = readVoltage();
float i = readCurrent();
float r = v / i;і ви замінили на
float v = readVoltage();
float i = 0.0001;
float r = v / i;то це може бути зовсім різний код із різною поведінкою при одних і тих же значеннях v та i.
Щоб реалізувати ділення без потенційного UB потрібно знати, які там типи операндів, граничні значення, в яких одиницях величини і т.д.
Взагалі, логіку та обчислення, якщо вони не зовсім елементарні, потрібно відлагоджувати окремо, а не прямо в програмі на залізі.
Сам по себе чип avr довольно таки тугой, ни разу не слышал чтобы была битая флеш или озу
Буває, особливо якщо чіп з аліекспреса ![]()
Спостерігав дещо схожі симптоми (з флешки читається не те що записане) на якомусь із attiny після спроби покрокового виконання в avr-gdb через debugWire. Там gdb перезаписує флеш для кожного брекпоінта, так що не дивно. Вилікувалось за допомогою chip erase. Але це не схоже на випадок у автора.
вручну присвоював перемінним вольтаж і ампераж і дивився чи правильно рахує.
Присвоювали прямо в тексті програми? Ви ж розумієте, що при діленні на відому під час компіляції константу і при діленні на отримане під час виконання значення результуючий код і поведінка можуть бути зовсім різними? Практичного сенсу в такому тестуванні немає.
схоже на запис данних за межами масиву.
Так може у вас і відбувається запис за межі масиву? Це також undefined behavior.
Показуйте код.
Увімкніть в IDE відображення попереджень при компіляції та аплоаді: "Show verbose output during: ✓ compile ✓ upload"
Також увімкніть "Compiler warnings: All".
але повторна перепрошивка не допомагала.
Якщо в самій програмі баг, то повторна перепрошивка нічим не допоможе.
чи це якісь данні записались десь в памяті і не стираються і впливають на код, чи просто співпало і вийшов зладу чип.
В IDE увімкнено " ✓ Verify code after upload"? Якщо ні, то теж увімкніть.
При появі незрозумілих глюків корисно підключитись програматором, зчитати флешку та фʼюзи, і проаналізувати їх вміст.
Іноді при залипанні бітів у non-volatile памʼяті допомагає повний chip erase з наступним перезаписом бутлоадера і фʼюзів. Але якщо біти вже почали залипати, то з великою ймовірністю це буде продовжуватись і надалі.
Про яке залізо йде мова? Який мікроконтролер, плата?
в тих формулах що я перевіряв було ділення, і звичайно інколи відбувалося ділення на нуль, виводились великі значення.
Якою мовою написана програма де відбувалось ділення на нуль? В C та C++ ділення на нуль - undefined behavior, може відбутись що завгодно. Щоб "пошкодити чіп" - дуже малоймовірно, але теоретично можливо.
деякі показники почали відображати якісь рандомні значення.
Відображати на чому?
і при зміні коду (видаленні чи при добавлянні строк) здається відбувається зміщення.
Що саме і в чому "зміщується"? Ви зчитували вміст флеш-памʼяті, порівнювали його з тим що записували?
чи можна якось стерти все як це було з заводу?
На більшості платформ - можна, якщо тільки флеш-памʼять не деградувала незворотньо.
і взагалі що це може бути, щоб не наступати на тіж граблі?
Ну, для відповіді на це питання потрібно знати, що саме і на чому ви робили.
case 2: // зчитуємо решту пакету buf[idx++]=b; if(idx>=8)
Тут би по-хорошому читати байт довжини, а потім buf[2] байтів пакета. Бо якщо дисплей відправить щось не 8-байтове, парсер розсинхронізується.
if(millis()-tUART > 5) { tUART = millis(); readDWIN(); }
Навіщо ці паузи між читаннями? dwin.available() просто повертає 0, якщо даних нема.
Що таке "навантаження на порт" і навіщо його "зменшувати"? SoftwareSerial, наскільки бачу, для прийому використовує PCINT. А передача, на відміну від HardwareSerial, не буферизована: write() не повертається поки не видасть весь байт.
Взагалі я би рекомендував для звʼязку з дисплеєм використовувати апаратний UART, а прошивати програматором. А краще взагалі взяти контролер з двома UART'ами, і не звʼязуватись із SoftwareSerial.
проблема в тому що код читає неправильно данні з порта
Можете показати, які саме дані неправильні? Тобто "дисплей відправив ось таку послідовність, а прочиталась ось така".
Ну если "простой" работает, то надо искать где "сложный" всё ломает.
+1
А якщо дійсно ввімкунути послідовно DC-DC і лінійний стабілізатор?
Тоді для виставлення напруги треба буде дві ручки крутити: на DC-DC та на стабілізаторі. Або ставити здвоєний потенціометр та підбирати розтягуючі резистори. Або врізатись у фідбек DC-DC.
Краще вже одразу взяти AC-DC і лінійний стабілізатор. А з трансформатора того зробити інвертор з "чистим синусом"
.
Якщо використати наприклад реле і перемикати обмотки .. одна одмотка , дві...
Ну тоді при 15 А замість 350-400 Вт потрібно буде розсіювати "лише" 150-200.
Але це ніяк не вирішує проблему пульсацій після моста.
Зробити бва діапазони роботи 0-20В і 20-40В
Якщо вручну перемикати, то можна і без реле. Просто поставити перемикач DPDT на достатній струм.
Якщо автоматично, то компаратор (можна операційник в режимі компаратора), що порівннює напругу на виводі P1 з певним порогом, транзистор і реле.
обмотки на 30В використовувалися для керування. Може теж їх використати для керування операційниками ?
Теоретично можна, але 30 В - це ж RMS, а амплітуда буде десь 42 В. Потрібно або відносно високовольтний операційник (для TL082 максимум - 36 В), або додатково знижувати напругу. А у операційників там двополярне живлення.
При моїх 15 А такий шинт мабуть не підійде?
Які 15 А? Та схема на 3 А розрахована.
При 15 А та малій вихідній напрузі транзистору Q4 доведеться розсіювати до 350-400 Вт. Для 2N3772 максимум - 150 Вт. Який транзистор і з яким охолодженням ви там зібрались використовувати? І декілька біполярних транзисторів в паралель просто так не ставляться.
При 15 А шунт на 0.33 Ом має розсіювати 75 Вт, і на ньому падатиме цілих 5 вольт. Щоби при тому ж дільнику R16/(P2+P3) струм замість 3 А був 15 А, опір шунта потрібно зменшити в 5 разів, тобто до 66 мОм. Тоді на ньому розсіюватиметься 15 Вт.
Щоб Q4 протягував 15 А, IC1B має видавати струм 15 / (hfe(Q2) * hfe(Q4)). Але тут ще в межах, навіть при мінімальних значеннях hfe.
UPD: при 15 А з фільтром 2x4700 мкФ після моста будуть пульсації вольт 15. Потрібно збільшувати ємність C1 відповідно. І мабуть вживати якихось заходів, щоб діоди в мості при цьому не погоріли при увімкненні. Та й під час роботи міст при 15 А теж грітиметься на пару десятків ватт.
А как же тогда миллионы приборов меряют микроамперы без всякой земли?
Підсилюють падіння напруги на шунті? Але ж тут не просто виміряти потрібно, а виявити наявність прямого струму і відсутність зворотнього. Подивіться, наприклад, що показує незаземлений осцилограф, коли тримаєтесь за щуп. А в котлі сам корпус є одним із електродів. Який там на ньому буде потенціал при відсутності примусового заземлення - хто знає.
Думаю, можна було б і без землі обійтись, застосувавши складнішу електроніку. Але в таких системах чим простіше, тим надійніше. Якщо прибор наміряв щось не те - зазвичай нічого страшного, а якщо газ подається, коли нема полумʼя - це вже гірше. І необхідність наявності землі - компроміс, який має сенс.
Хотел узнать принцип работы, что аж за гланды нужен ноль
Стрижень і корпус працюють як діод - випрямляють змінний струм. А струм там - мікроампери, без заземлення датчик нічого хорошого не наміряє.
шунт з зарядного на 75мВ.
75мВ при якому струмі? Який опір шунта?
А можна ардуіно прикрутити до шунта 75мВ щоб виводити струм?
Можна практично все. Але як це оптимальніше реалізувати - залежить від того, яку точність хочете отримати, в якому діапазоні, та яку роздільну здатність у часі.
Там у схемі вже є шунт R7. Простіше за все, мабуть, вимірювати падіння напруги на ньому. Навіщо ще один шунт?
І dc-dc в мене лінійний
DC-DC у вас імпульсний, за топологією "синхронний buck".
то вони не по однаковому принципу працюють?
Так, вони працюють по різним принципам.
Ще на схемі є світлодіод D10. Від показує тільки те що прилад увімкнениний.? Не обмеження по струму чи напрузі?
Має показувати, що працює обмеження по струму. Коли напруга на R7 перевищує заданий поріг, IC1A відкриває Q3, і світлодіод вмикається. Наче так.
Не скажу , бо зараз вийде щой транформатор треба викинути
Таке гріх викидати, тим паче якщо в робочому стані
То можна використовувати таку схему?
Ну, схема класична. Якщо у людей працює, то й у вас має працювати. Особисто я таку не збирав, так що не можу сказати, які там можуть бути підводні камені.
Джерело схеми з описом, наскільки розумію, тут: https://www.paja-trb.cz/konstrukce/zdroj.html (чеською мовою).
Силовий транзистор потрібно ставити на хороший радіатор, мабуть і з вентилятором, бо при низькій вихідній напрузі та максимальному струмі 3 А розсіюватиме 80-90 Вт.
(В сучасних потужних ЛБЖ для покращеня ККД роблять або комутовані відводи від вторинної обмотки, або пре-регуляцію на імпульсному перетворювачі, після якого вже лінійний регулятор. Але це вже складніші схеми).
Ще підкажіть , підстроєчний Р3 250 Ом?
Так, на сторінці джерела згадується PT10V.
"/N" у номіналах P1, P2, наскільки здогадуюсь, означає багатообертові.
Ви пропонуєте зробити схему скажіно на LM317
Я пропоную визначитись, чи ви робите більш-менш універсальний CV/CC блок живлення (ЛБЖ), чи зарядний пристрій для акумуляторів.
ЛБЖ при замиканні вихода накоротко має просто обмежити струм до встановленого, а не розряджати туди всю наявну тисячу мікрофарад, і не уходити в захист, обрізаючи струм до частки міліампера.
ЛБЖ при відʼємному потенціалі на виході (при роботі на індуктивне навантаження, наприклад) має спокійно пропускати струм. А може ви його для якоїсь гальваніки вирішили застосувати, де зворотній потенціал на електродах перед підключенням - нормальне явище.
Звісно, для заряда акумуляторів ЛБЖ також можна використовувати, якщо розуміти процеси.
Захист в ЛБЖ захищає сам блок, а не те, що до нього підключається.
Зарядний пристрій має в першу чергу захищати те, що він заряджає. Якщо струм чи напруга виходять за межі очікуваних на даному етапі заряду для даного акумулятора - має спрацювати захист, поки проблему не буде усунено.
Тут може виникнути думка зробити як ЛБЖ, але з опціональним захистом, який можна вимкнути. Тільки великого сенсу в цьому не бачу: що перевіряти полярність перед підключенням, що перевіряти, чи увімкнений захист - все одно перевіряти. Хіба що тимчасове вимкнення кнопкою без фіксації, щоб не забувати потім увімкнути. Звісно, якщо це буде зручно при ваших застосуваннях.
Також, що у ЛБЖ, що у зарядного мають бути визначені допустимі межі відхилення напруги при тому чи іншому струмі. Додаткова схема захисту може на це також впливати.
В інтернеті купа варіантів з використанням dc-dc тому я і пішов цим шляхом.
Ну, в інтернеті багато чого є, тільки не все воно працює як очікується, а щось працює лише при певних умовах застосування. Які там обмеження при застосуванні - в інтернеті зазвичай не пишуть.
Я наприклад не розумію С2 мабуть не мав бути електроліт?
Все там наче ок, там формується відʼємна напруга для двополярного живлення операційників.
Ще одна проблема в тому, що в якості джерела використовується імпульсний DC-DC зі здоровенною ємністю на виході. Якби там був лінійний регулятор як в ЛБЖ, він би спокійно обмежив пусковий струм на ємносне навантаження. А при переполюсовці струм би йшов через паралельний діод на виході, і тільки тоді спрацьовувала би ота схема на мосфеті з біполярником.
Там можна було би втулити конденсатор між базою та еміттером біполярника, щоб сповільнити спрацювання при ємносному навантаженні, але тоді й реакція на переполюсовку буде з затримкою, яка ще й залежатиме від напруг.
Дивні вимоги потребують дивних рішень ![]()