Авторизация
Регистрация

Напомнить пароль

Контроллер нижнего подогревателя печатных плат на PY32F002A

В прошлой статье я описывал свои попытки разобраться с почти самым дешевым из достойных или почти самым достойным из дешевых — микроконтроллером PY32F002A за цену около 10 центов на Али.

Комментарии были самые разные — зачем все это, когда 21 век на дворе? Зачем тратить время на ерунду, мое время такое дорогое? Ага, такое дорогое, что не ем и в туалет не хожу, чтобы его напрасно не тратить.

Тем не менее я продолжаю тему. И идя на встречу пожеланиям трудящихся — все выложено на GitHub. Я не берусь прогнозировать, когда к нему закроют доступ, но пусть все будет, как вы хотели.

Будем делать контроллер нагревателя нижнего подогрева на базе PTC нагревателей, которых на Али пруд пруди. Но они рассчитаны на определенную температуру, которую держат весьма нестабильно.

Не то, чтобы мне нужен был подогреватель — их у меня штук 5 или больше самых разных.

Но — вы увидите много примеров, как программировать разные периферийные блоки этого микроконтроллера. Да, порог вхождения повыше, чем у ардуино — но если пенсионер смог сделать систему программирования этого контроллера, то молодым и здоровым это тем более по плечу.

SDK для Keil uVision можно найти на прямо на сайте Puya или Keil  при желании, но проект все-таки любительский и будем пользоваться бесплатным GCC ARM toolchain (arm-none-eabi-gcc). Прошивку будем заливать через последовательный интерфейс, утилиту на Python я разработал на базе найденной на GitHub, но по какой-то причине она мне не понравилась.

Все определения использованы от PY32F030, он от отличается только корпусом и спецификацией, где занижены размер памяти, убрано упоминание о имеющихся в наличии периферийных устройствах.

Редактировать очень удобно в Visual Studio Code с установленным плагином Platformio — все плюшки для контроля кода в вашем распоряжении.

 Ну а компиляция — кондовым make. Думаю, напечатать 4 буквы пальцы не отвалятся.

Итак, используем нагреватель на 400 Вт 230 Вольт, сам по себе он отключается при температуре 260 градусов. Регулировать мощность на нем будем схемой на симисторе — у меня завалялся такой модуль, который определяет момент пересечение фазой нуля и там же симистор с опторазвязкой.

 Для серьезного регулирования желательно иметь регулятор с более-менее линейной зависимостью выходной мощности от управляющего сигнала. Посему понадобится немножко математики — пишем скрипт, который построит массив углов равной мощности. Как ни странно, готового массива я не нашел. А тот единственный, что нашелся, был так далеко от идеала, что это было видно невооруженным взглядом. Этот скрипт вы найдете в проекте среди прочих питоновских файлов.

С измерением температуры тоже не все тривиально. Можно было конечно вычислять по готовой формуле каждый раз прямо в программе — но ресурсов это бы отъело немало. Проще и почти не требует ресурсов, если взять таблицу, в ней в соответствие температуре с шагом 5 градусов поставить код АЦП. А все промежуточные значения вычислять линейной аппроксимацией. Ну и куда тут без Питона — скриптик позволит подобрать к тому NTC, что у вас оказался под рукой, подтягивающий резистор и линеаризовать принципиально нелинейный NTC. Но без автомата — подставляете сопротивление своего резистора в исходный код и смотрите, что получилось.

Когда все заработало, надо подобрать коэффициенты для ПИД-регулятора. Наверно, это жлобство, готовых программ отображения графиков в реальном времени хватает, но тем не менее соответствующий скрипт в проекте вы найдете.

 

Дисплей я описывал давным-давно — тоже за копейки когда-то купил пучок алфавитно-цифровых дисплеев 4 строки по десять символов, их используют в Сименсовских контроллерах «LOGO!». Из особенностей программного обеспечения — 2 и 3-я строки используются для отображения больших цифр из пользовательских символов. 

И кнопки там есть готовые — резинки-нажималки для них можно вырезать из любого пульта дистанционного управления, который вы забыли вовремя выбросить. Если ставить по диагонали — там шаг как раз 10 мм, очень распространенный. Мне одного такого пульта хватило на 3 самоделки с такими дисплеями.

Корпус какой-никакой тоже не помешает, OpenScad файлы тоже найдете в проекте.

Но вот вроде и все, писать особо нечего — все лежит на GitHub, пользуйтесь на доброе здоровье.

 

Следующая безумная идея — расковырять дешевый китайский bluetooth/zigbee контроллер, готовая плата с которым продается в районе доллара — PHY6252. Получится или нет — не знаю. Прельстил он поддержкой Bluetooth Angle of Arrival (AoA) — по крайней мере для передачи. А мне как раз не помешало бы десяток маяков, чтобы поиграться с позиционирование внутри помещений. Вернее, снаружи, для газонокосилки. Хотя никто и не документирует, но похоже в газонокосилке Ecovacs Goat (то бишь коза) именно такая система используется для навигации. Только за маяк просят больше сотни баксов. Готовых проектов-самоделок пока не видно, маяк передатчик-то сделать не особо сложно, а вот приемник…

Там нужна прецизионная антенная решетка, высокочастотные переключатели — героев осилить такое  пока не наблюдается. Но они не могут не появиться — идея-то явно интересная и стоящая. А может, герои и есть, но широкой публике не видны, если я что-то пропустил — подскажите.

 

Добавить в избранное
+91 +117
свернутьразвернуть
Комментарии (72)
RSS
+
avatar
+2
Я тоже думал об навигации для газонокосилки. :)
+
avatar
0
Я, конечно, люблю смотреть, как паяют Spectrum, но в 2025 уже можно использовать и что-то посовременнее
Плата разработки ESP32-C3 Плата разработки ESP32 SuperMini Плата разработки ESP32 WiFi Bluetooth
https://aliexpress.com/item/1005006241076128.html 132 рэ с доставкой (в мобильном еще дешевле).
Ammo1 в феврале разбирал их у себя в блоге:
Процессор: 160 МГц, 32-битный RISC-V, 1 ядро;
Память: 400 КБ SRAM, 4 МБ Flash;
Беспроводные коммуникации: Wi-Fi 2.4 ГГц 802.11b/g/n/mc (до 150 Мбит/c), Bluetooth 5;
До 13 цифровых Входов/выходов и до 6 аналоговых входов (цифровые и аналоговые сигналы могут подключаться к одним и тем же выводам платы);
Аппаратные протоколы: UART, SPI, I2C, I2S, BLE, Wi-Fi;
Питание: 3.3V (встроенный стабилизатор с питанием от Type C);
Размер: 24x18 мм. (с ноготок мизинца)
Синий светодиод подключен к GPIO8, кнопка BOOT к GPIO9, соответственно и светодиод и кнопку можно использовать в своих проектах.
+
avatar
0
А вот и сравнение в лоб:
Дополнительная информация
Что PY32F002A ESP32-C3
Архитектура ядра Arm Cortex-M0+ RISC-V 32-bit (RV32IMC)
Тактовая частота До 48 МГц До 160 МГц
ОЗУ (SRAM) 2 КБ 400 КБ
Flash 16 КБ 4 МБ (внешняя, обычно SPI Flash)
Беспроводные интерфейсы Нет Wi-Fi 2.4 ГГц, Bluetooth 5.0 LE
Проводные интерфейсы UART, I2C, SPI, GPIO UART, I2C, SPI, PWM, ADC, GPIO
Потребление в спящем режиме < 1 мкА (STOP mode) ~5 мкА (deep sleep)
Питание (VDD) 1.8–3.6 В 3.0–3.6 В
Корпуса SOP8, TSSOP20 QFN, модуль
Стоимость MCU ~$0.10–0.20 ~$1.20–2.00
Разработка / SDK Keil, IAR, bare-metal ESP-IDF, Arduino, PlatformIO, Zephyr
Назначение Ультра-дешёвые логические контроллеры Умные IoT-устройства с беспроводной связью
Примеры применения Кнопки, светодиоды, питание, простые таймеры Умные розетки, датчики, устройства управления по Wi-Fi
Документация и сообщество Минимальные ресурсы, слабо известен Огромное коммьюнити, отличная документация
+
avatar
+8
Вообще-то на этом сайте про эту платочку у меня есть статья — mysku.club/blog/diy/102333.html
Чай тоже не лаптем щи хлебаем.
+
avatar
+2
  • Lafani
  • 23 июля 2025, 18:15
А не проще купить https://aliexpress.ru/item/1005005526080388.html
+
avatar
+1
Да, я на таком и делал.
mysku.club/blog/china-stores/87263.html
Но тут работа была сделана ради удовольствия
+
avatar
0
  • Lafani
  • 24 июля 2025, 13:34
Что то подобное, но 1000вт, 250мм*200мм
+
avatar
+1
  • xNIXx
  • 23 июля 2025, 21:01
Проще, но надо иметь в виду, что рех100 это прям очень разный результат в зависимости от производителя. Т.е. их фигачат сотни производств и все немного разные.
+
avatar
0
  • elilitko
  • 02 августа 2025, 11:30
Проще! Покупайте!
+
avatar
+5
Без контроллера.

+
avatar
+1
под нагревателем деревяшка? Я правильно понял?
+
avatar
+2
плитка керамическая, спалить хату в планы не входит
+
avatar
+1
не, я автора картинки выше спросил :)
+
avatar
0
Да, деревяшка.
+
avatar
-2
да, деревяшка
не стремно такое оставлять без присмотра?
+
avatar
+4
Ответственную пайку без присмотра ни как не оставишь. Потемнеет — заменю на керамику.
+
avatar
0
Ответственную пайку без присмотра ни как не оставишь
Что может быть более ответственное, чем пайка устройства для дипломного проекта.
Я свое дипломное устройство допаивал утром в день защиты. В итоге я только на следующий вечер после защиты увидел, что на табуретке возле моего стола на подставочке стоит себе спокойно включенный паяльник. Больше суток он простоял после ответственной пайки).
Удивительно как его за это время кошка на ковер не свалила.
+
avatar
+2
Зависимость мощности от угла, это для постоянного сопротивления нагрузки, а у вас нагрузка какая?
+
avatar
+1
Нагрузка, конечно, нелинейная. С зависимостью сопротивления от температуры. Но не реактивная.
+
avatar
+1
  • _mic
  • 23 июля 2025, 20:08
Молодец, а я лопух не подумал… конечно ПТС нагреватель нелинейный, но от температуры, а не от мощьности (т.е. еще и от времени разогрева при постоянной мощьности), так что у автора почти нет шансов выпрямить зависимость, надо менять нгреватель на обычный. Но если автору хочется убить время долгими зимними вечерами, то почему бы нет.
+
avatar
0
у автора почти нет шансов выпрямить зависимость, надо менять нгреватель на обычный. Но если автору хочется убить время долгими зимними вечерами, то почему бы нет.
В принципе при желании можно выпрямить зависимость, введя в подсчет данные о температуре. Но это особо и не требуется с ПИД регулятором.
+
avatar
+1
И кроме того — а зачем все это? С такой тепловой инерцией в пределах полупериода все будет линейно. А этого достаточно.
+
avatar
0
  • _mic
  • 24 июля 2025, 08:46
Да наверное, но тогда данные о температуре будут использоваться два раза в контуре регулирования и это может усложнить оптимизаццию коэфицентов.
+
avatar
-1
Годнота. Спасибо. На каком принтере печатали корпус?
+
avatar
0
Конкретно это — на Anet ET4(X).
+
avatar
0
кстати, на алихе есть очень адекватные нижние подогреватели. С регулятором, держателем плат. Цена на порядок ниже фирменных
+
avatar
+3
Да у меня они в избытке, я просто не нашел другого проекта, где можно было с микроконтроллером поиграться. А совсем просто так — не интересно.
+
avatar
0
  • xNIXx
  • 23 июля 2025, 21:03
А пид самопальный или какая-то стандартная библиотека?
+
avatar
0
а что там особенного — пид он и в Африке пид. Немного модернизирован — когда при регулировании всегда есть какая-то мощность — это одно, а когда надо полностью все выключить — стандартный ведет себя не очень хорошо. Такую ситуацию я немного поправил.
+
avatar
+1
  • xNIXx
  • 23 июля 2025, 21:41
Ну дык. Есть немало тонкостей в реализации. Собственно я не слежу, было интересно может есть какая-то готовая хорошая библиотека.
+
avatar
+7
github для исходников — это, в любом случае, правильно. Только удалите из репозитория объектные файлы.
+
avatar
+6
спасибо, зевнул. Как говорится — «не надо делать тарапица»
+
avatar
0
Rex-C100 чем не устраивает?
+
avatar
0
Монструозностью? Для него отдельный язик нужен…
+
avatar
0
Он не больше того, что в обзоре напечатан.
+
avatar
0
да, только в обзоре он такой сделан по сути потому что так проще. а вообще можно сделать под нагревателем базу и в нее вмонировать контроллер. а в с100 к тому же в торец смотреть надо и тоже корпус нужен.
+
avatar
0
  • Vit_r
  • 24 июля 2025, 05:36
Да вы батенька тролль :)
Да, порог вхождения повыше, чем у ардуино — но если пенсионер смог сделать систему программирования этого контроллера, то молодым и здоровым это тем более по плечу.
А так, проект интересный. Всегда приятно сделать что-то самому даже если можно купить. От покупки навыки не растут и нет чувства удовлетворения. Хотя и без покупок тоже никуда.
+
avatar
0
  • vovans
  • 24 июля 2025, 08:58
И снова Platformio :(
+
avatar
0
к счастью platformio. а не богомерзкий ардуино
+
avatar
+1
  • vovans
  • 25 июля 2025, 00:07
Ну, Ардуино вообще дно. Но сильно ли лучше Platformio?
+
avatar
0
ну как блокнот и почти полноценная IDE. их вообще нельзя сравнивать.
+
avatar
0
  • st1373
  • 26 июля 2025, 08:33
А почему не Emacs, не PyCharm, зачем эти богомерзкие поделки мелкософта под свой же софт, можно в конце концов взять штатные средства разработки? Мне вот как-то всё равно в чем пишут код хоть в FAR, хоть в MCEDIT хоть в VIM, да и notebook пойдет и как его компилят (не ожиданно на 99% gcc наверное) и как заливают (неожиданно наверное averdude), да штатного загрузчика ардуина не использую так как мне он не нужен, за какой-то 1-2$ можно купить спецсредство для заливки прошивки сразу в мозг для atiny13-atmega8-328 для rp2040 и этого не надо. Софт ардуино — удобно — спецкомбайн, ну тормоз бывает, идеология упрощения вместо чтения тех документации на 500 листов, а сделайте лучше, Хард ардуино — готовый проц с обвязкой, бери и делай, умеешь в ардуино — делай, умеешь круче — делай как умеешь
+
avatar
0
А когда emacs стал user-friendly и стал поддерживать дебаг arduino? Впрочем как и pycharm поддерживать c++?
Vscode вполне нормальная среда для ардуиноподобной фигни. Можно отлаживать. А если сравнить с родной средой, то они отличаютя как небо и земля. Вы же предлагаете писать в текстовых редакторах. Мне так неудобно.
+
avatar
+2
  • Leoniv
  • 24 июля 2025, 10:26
но если пенсионер смог сделать систему программирования этого контроллера, то молодым и здоровым это тем более по плечу
Это огромная ошибка — считать, что все люди одинаково умные. В реальности умственные способности у всех сильно различаются. Сделать такой проект могут считанные люди, и пенсия здесь ни при чем.

Зачем тратить время на ерунду, мое время такое дорогое? Ага, такое дорогое, что не ем и в туалет не хожу, чтобы его напрасно не тратить.
Не убедительно. Даже если время ничего не стоит в денежном выражении, то все равно его не имеет смысла тратить на изучение ненужных микроконтроллеров. Если можно взять любой знакомый, а время потратить на творчество, придумывание чего-то своего. Другое дело, если просто хочется. Но данное желание весьма странное.

у меня завалялся такой модуль, который определяет момент пересечение фазой нуля
Если с детектором перехода через ноль, значит нагревателем можно управлять только в режиме on/off. В этом случае будет неприятно мигать свет в квартире в такт с включением. Проходил это при изготовлении управления феном. Пришлось перейти на фазовое управление и использовать MOC3021 без привязки к нулю.

массив углов равной мощности. Как ни странно, готового массива я не нашел
Это так называемая "формула диммера". Не так много попадалось информации на эту тему. Насколько я понимаю, аналитическую зависимость угла от мощности найти нельзя, можно лишь находить таблично.

позволит подобрать к тому NTC, что у вас оказался под рукой, подтягивающий резистор и линеаризовать принципиально нелинейный NTC
Действительно, при очень нелинейной зависимости сопротивления NTC от температуры, можно подобрать второй резистор в делителе так, что в интересующем диапазоне температур напряжение на делителе будет меняться практически линейно. Только не всегда это согласуется с диапазоном входных напряжений АЦП.
+
avatar
+2
Если с детектором перехода через ноль, значит нагревателем можно управлять только в режиме on/off. В этом случае будет неприятно мигать свет в квартире в такт с включением. Проходил это при изготовлении управления феном. Пришлось перейти на фазовое управление и использовать MOC3021 без привязки к нулю.
Вы неправильно поняли, посмотрите схему.
+
avatar
-1
  • Leoniv
  • 24 июля 2025, 12:52
Да, я неправильно понял. Здесь детектор нуля отдельно, оптосимистор — отдельно. Примененный оптосимистор HTM-302x или HTM-305x — это random phase, поэтому позволят реализовать фазовое управление.

Схема детектора нуля — тоже узел, в который можно вкладывать много мыслей. Чтобы получить минимальную зависимость угла срабатывания от колебаний сетевого напряжения.

Еще одна точка приложения мозговых усилий — это реализация собственно фазового управления. Самый тупой метод — по прерыванию от детектора перехода через ноль запускать таймер и отсчитывать постоянную задержку для заданной мощности. Но частота сети немного гуляет, но самое главное, сетевое напряжение имеет кучу помех. Поэтому возможны ложные срабатывания детектора. Делал цифровую PLL, когда один из таймеров был привязан к сетевому напряжению с точностью до фазы, один из каналов стравнения использовался для управления симистором, а на вход захвата поступали импульсы с детектора. Но не скажу, что остался полностью доволен. Сетевая частота довольно низкая, чтобы эффективно фильтровать помехи, приходится увеличивать постоянную времени петлевого фильтра. А тогда недопустимо долго происходит захват. Надо делать что-то адаптивное.

Смотрю исходник, тут тоже фазовое управление реализовано нетривиально, использованы целых 3 таймера и внешнее прерывание. И в этом жирный минус обзору: про самое интересное, программные алгоритмы — ни слова.
+
avatar
+5
'
тут тоже фазовое управление реализовано нетривиально, использованы целых 3 таймера и внешнее прерывание. И в этом жирный минус обзору: про самое интересное, программные алгоритмы — ни слова.
Это вам интересно, а большинству — фиолетово. Статья и так перегружена для такого сайта — сами посмотрите, у каких статей больше рейтинг.
А кому хочется — тот и в исходники заглянет, я вас уверяю — там достаточно интересного. Хотя меня интересовал только сам микроконтроллер и как его программировать, остальное — вторично.
Я первично — у меня котейка тяжело болела и за день до публикации этой статьи умерла. Так что мне было абсолютно не до технических деталей.
+
avatar
+2
  • Leoniv
  • 24 июля 2025, 14:01
А кому хочется — тот и в исходники заглянет, я вас уверяю — там достаточно интересного.
Так я и вижу, что там много интересного. Обидно, что все это не описано в обзоре. Разобраться в чужом коде довольно сложно, не все задумки можно понять. Было бы описание хотя бы вкратце, как взаимодействуют таймеры для фазового управления, ну и прочее, было бы намного лучше. А плодить ради рейтинга обзоры со всякой ерундой, типа печати коробочек — сомнительное удовольствие.
+
avatar
-1
  • Leoniv
  • 24 июля 2025, 20:24
Сижу, разбираюсь с программой. В модуле pwm.c что именно хотели сделать, там используются 4 канала сравнения? Какие действия происходят при pid is_overheating = 1? В этой ситуации уменьшаете накопленный интеграл в 2 раза, но при этом PID calculation не делается, загрузка power тоже не делается. Почему predicted_temp = current_temp + temp_rise_rate * DT * 5.0f (почему именно 5)?

Но самый трэш в модуле scr_power.c, это самая сложная реализация диммера, которую доводилось видеть. Понял слабо, без пояснений не обойтись. Как мне показалось, по спаду Zero Cross Detector возникает EXTI2, в обработчике дальнейшие EXTI запрещаются, читается TIM16 и вычисляется период возникновения прерываний. Обнуляется TIM17, загружается в него период 0.7 мс и разрешается его прерывание. Потом вычисляется период для TIM1 — если измеренный период вписывается в рамки MIN и MAX, то он добавляется в массив для медианной фильтрации. Затем идет FIR-фильтр с коэффициентом 0.25, затем новое значение используется для вычисления нужной задержки импульса и грузится в TIM1.

Через 0.7 мс произойдет прерывание TIM17, где обнуляется TIM1 (с этого момента он начинает отсчет задержки выходного импульса), а в TIM17 загружается задержка 2.3 мс. Через 2.3 мс возникет второе прерывание, где снова разрешаются EXTI, а дальнейшие прерывания TIM17 запрещаются. Не совсем понял, почему выбраны такие времена.

Допустим, появилась помеха, ZCD сработал где попало. При этом измеренный период не впишется в MIN и MAX, пересчета периода TIM1 не будет. Но ведь TIM17 запустится, и он в прерывании сбросит TIM1 в непонятно какой момент, выходной импульс сформируется в ответ на это ложное срабатывание ZCD. Это так?
+
avatar
0
А вот вопрос. Для регулировки температуры устройства с подобной довольно большой тепловой инерцией, простое полное отключение (на несколько пулу-периодов) и включение было бы достаточно?
+
avatar
+1
  • Leoniv
  • 25 июля 2025, 09:30
Было бы достаточно. Но я отказался от такого, так как при включении/выключении мощного нагревателя мигает свет в квартире.
+
avatar
0
Может у вас слишком длинные периоды отключения? Я имел ввиду пропуск одного-двух полупериодов. Ну до 10, скажем.
А в случае если так как тут, включать на определенных углах фазы, не мигает свет?
+
avatar
-1
  • Leoniv
  • 25 июля 2025, 10:37
А как можно регулировать мощность в широких пределах, пропуская всего один-два полупериода? Если хотим регулировать с шагом 1%, то последовательность должна состоять из 100 полупериодов (или даже периодов, чтобы не нарушать симметрию сети). А это очень низкая частота. Конечно, можно использовать не простой ШИМ, а Delta-Sigma модулятор, он будет выравнивать заполнение внутри интервала. Именно так я и делал, но все равно на практике свет мигает. А при фазовом управлении частота коммутации нагревателя 100 Гц, свет не мигает.
+
avatar
0
Спасибо! Думал, что дискретности до 10 пропусков более чем достаточно — можно же не 1%, а 10% обойтись. Видимо, сильно зависит от того, что регулируем (мощность, инерция). При фазовом управлении помех в окружающую сеть должно быть больше. Но зато свет не мигает, так лучше.
+
avatar
0
  • Leoniv
  • 25 июля 2025, 12:01
Необходимая дискретность регулировки зависит от многих факторов: точности поддержания температуры, отношения мощности нагревателя к мощности потерь и т.д. Обычно только во время начального разогрева мощность нагревателя близка к максимальной. А при поддержании температуроы она может составлять 10% от максимума, тогда дискретность 10% будет совершенно недостаточна. Что касается помех — фазовое управление их создает больше, но обычно это незаметно. В данном случае нагрузка чисто активная, не так страшно с помехами.
+
avatar
0
  • xNIXx
  • 01 августа 2025, 23:19
Так и делают по-нормальному, т.е. включают на Х периодов, потом на Y выключают. А если части периодов резать помехи огого.
+
avatar
+1
pwm.c оставлен как пример программирования, он вообще не используется
scr_power.c — на самом деле прост и туп. Один таймер — коррекция времени перехода через нуль, импульс приходит раньше, чем фактический переход.
Кроме того, система не кварцована, а разброс частоты внутреннего генератора довольно большой, еще один таймер подстраивается под эту частоту.
Нормальной фазовой подстройки нет, В принципе ложное срабатывание возможно. В электровозах на переменном токе такое не пройдет :) — там при рекуперации от синусоиды остается только воспоминание.
в pid куча настроек на превышение температуры, когда нужно полностью выключить нагрев. Терморезистор приклеен сбоку, и прогревается не моментально. Законы остывания и нагрева сильно отличаются, приходится сбрасывать интеграл. По началу у меня при целевой температуре 140 градусов происходили перегревы на 50 градусов. Линеаризация малых мощностей сильно помогла, возможно, сейчас и без всего этого будет работать. Коэффициент — от балды, он не нужен, но коэффициенты ПИД становятся какими-то сильно маленькими.
+
avatar
+1
  • Leoniv
  • 25 июля 2025, 10:30
pwm.c оставлен как пример программирования, он вообще не используется
Вижу что не используется, но зачем он выложен на GitHub? Наверное, как пример какого-то необычного решения, там используются сразу 4 канала сравнения с разным заполнением ШИМ, никак не смог разгадать, для чего. Поэтому и спрашиваю.

scr_power.c — на самом деле прост и туп.
Со вторым согласен, а вот с первым не соглашусь. Использовать столько таймеров — зачем? Если один из таймеров подстраивается под сеть, то захват этого таймера по ZCD сразу даст текущую ошибку фазы. А канал сравнения этого таймера сможет сформировать выходной импульс. Необходимую коррекцию задержки ZCD можно добавить к коду сравнения, коррекция возможна как в плюс, так и в минус. В итоге — всего 1 таймер, никаких внешних прерываний, лишь одно прерывание по захвату, где делается подстройка таймера и загрузка нового кода сравнения.

В принципе ложное срабатывание возможно.
Раз есть таймер, который подстроен к сети, он может давать правильный выходной импульс, даже когда импульса ZCD нет, или он пришел не вовремя. В такой ситуации таймер не подстраивается, это реализовано. Но зачем всё испорчено тем, что даже при плохом измеренном периоде TIM1 сбрасывается?

в pid куча настроек на превышение температуры, когда нужно полностью выключить нагрев.
Не могу понять алгоритма. Когда устанавливается флаг перегрева, PID не выполняется. Для чего тогда снижение интеграла, как это используется?

Коэффициент — от балды, он не нужен, но коэффициенты ПИД становятся какими-то сильно маленькими.
Какое отношение имеет коэффициент для расчета предсказанной температуры к коэффициентам PID? Вы точно автор программы?
+
avatar
0
  • simsun
  • 25 июля 2025, 07:53
Самый тупой метод — по прерыванию от детектора перехода через ноль запускать таймер и отсчитывать постоянную задержку для заданной мощности
Раньше тоже так делал, даже схема ZC была как в статье, но в очередном поделии трансформатор тупо оптрон через резистор и ADC. Т.к. будет попытка плавного старта для мощного компрессора, то по любому буду использовать «вычисленный ноль».
+
avatar
+1
  • Leoniv
  • 25 июля 2025, 09:28
Т.е. будете подавать на вход АЦП некое подобие синуса сетевого напряжения? А дальше какие алгоритмы, как будете вычислять момент перехода через ноль в условиях сетевых помех? Встречали подобные решения? В теории, при оцифровке сетевого синуса имеем больше информации, но на практике не очевидны преимущества перед ZCD с логическим выходом.
+
avatar
0
  • simsun
  • 25 июля 2025, 14:55
Дело в том, что МК я уже впаял и это tsop — туда с большей памятью уже даже не поставить и у меня возникают сомнения, что хватит места под код на всякий такой матан… Хотел поиграться «по взрослому», FFT и всё вот это вот…
А так то идея та-же — за много периодов усреднить и синхронизировать с таймером, благо это не бензогенератор и частота не ускачет. Тем более, что компрессор разгоняется всего за ~15 периодов. От ZC ещё отказался, потому что не хватило ножек на всё. Сначала просто хотел заменить стартовое реле, а в нём отключение идёт по порогу напряжения — оттуда и оптрон с резистором.
+
avatar
+1
  • Leoniv
  • 25 июля 2025, 16:52
Хотел поиграться «по взрослому», FFT и всё вот это вот…
Где-нибудь встречали такую реализацию? Идея вызывает сомнения.

А так то идея та-же — за много периодов усреднить и синхронизировать с таймером
Это можно сделать с помощью цифровой петли PLL. Только вопрос с петлевым фильтром. С одной стороны, хочется подольше усреднять для более стабильной работы. С другой — нежелательно иметь долгий процесс захвата. Кроме обычного LPF понадобится еще и нелинейная фильтрация. Учитывая случайный характер помех, мгновенная фаза может иметь большие выбросы, тут к месту будет медианный фильтр, как у donBaton. Еще можно в состоянии захвата реагировать на переход через ноль только в узком окне.
+
avatar
0
  • simsun
  • 25 июля 2025, 17:40
Где-нибудь встречали такую реализацию? Идея вызывает сомнения.
FFT тут вообще мимо, но хотелось приплести куда то:), так то у меня проект медленно чиллил, но вот эта статья и комментарии немного ускорило процесс.
Мне немного стыдно, но спросил у ИИ, он тоже с большим сомнением отнёсся усложнению и тем более FFT — максимум предложил фильтр Калмана или медианный фильтр. Но это я и так по умолчанию почти всегда делаю для ADC благо сигналы медленные.
ps
Дополнительная информация
вспомнил, недавно где то обсуждалось не много ни мало манипулированием током возбуждения турбины Саяно-Шушинской гэс, но до аварии там была очень старая система — не актуально… в общем оффтоп, но замашки остались)
+
avatar
+1
  • Leoniv
  • 25 июля 2025, 22:26
FFT не совсем мимо, его можно рассматривать как гребенку полосовых фильтров. К тому же, можно сразу получить фазу для нужных компонент сигнала. Но чтобы эквивалентная ширина полосы была маленькой, потребуется FFT по большому числу точек, вряд ли это вычислительно выгодно, ведь интересует только одна частота. В случае PLL получить узкую полосу гораздо проще. Петлевой фильтр (а это обычный LPF, частоту среза которого можно сделать сколь угодно низкой) эквивалентен полосовому фильтру на частоте несущей. Думаю, это самый оптимальный путь. Плюс добавить нелинейную фильтрацию (медианную, или что-то подобное). Похожую задачу решают в частотных преобразователях при нахождении положения ротора. Там этот узел называется Angle Tracking Observer, существует масса вариантов реализации, можно глянуть. Тема оптимального алгоритма для фазового регулятора весьма интересна, хотелось бы ее обсудить, но donBaton ушел в несознанку, а другие знающие люди в ветку не подтягиваются.
+
avatar
0
  • simsun
  • 29 июля 2025, 16:58
Вспомнил откуда FFT:)
Оффтоп, но раз уж начал…
замедление компрессора..
На другом ресурсе у меня была долгая беседа на тему замедлить обороты компрессора на кондее. Такой типа отдалённый аналог инвертора. По уму то там надо частотник, но свои сложности. Замедлять понятно дело тоже не диммером (шум, износ, нагрев), но это к теме не относится
В процессе обсуждение возник вопрос — как ловить обороты. Двигатель асинхронный, с фазосдвигающей. И вот тут производя измерения потребляемого тока — заметил на осциллографе подключенному к трансформатору тока помимо 50Hz ещё и некие девиации с частотой сильно меньшей. На вскидку это результат «скольжения асинхронника» что можно интерпретировать как обороты. Для этого и FFT.
+
avatar
0
Насколько я понял, хитромудрый линеаризатор нелинейного нагревателя на 260 градусов нужен, чтобы обеспечить очень плавное и точное регулирование температуры вблизи (ниже, понятно) этих самых 260 градусов. Всё это не требуется. У такого нагревателя большая инерционность. Просто поставьте включатель-выключатель (реле), завязанный на термодатчик, с примитивной регулировкой температуры и это будет работать без микропроцессоров.

Хотя для учебных целей в программировании-реализации такого рода устройств материал интересный.
+
avatar
0
  • xNIXx
  • 24 июля 2025, 11:23
Ну да, у него там прям графики есть в статье как это «не нужно». Если вас +-10 градусов синусойда вокруг уставки устраивает, то не нужно… А при случае и больше получите и гораздо.
+
avatar
0
Ну вообще, это же не паяльник с регулировкой жала (хотя и там точность в градус, думается, избыточна), +-10 градусов около выставленного значения вполне нормальна. Интересно было бы уточнить инерционность этого столика, как быстро он остынет на эти самые 10 градусов. Если 10-20 сек, то реле+простейший регулятор с термопарой было бы идеальным простым решением.
+
avatar
0
  • sfs
  • 31 июля 2025, 15:01
Это было бы самое рациональное решение для данного объекта. Но у автора другие цели в этом проекте. А у Leoniv в таком режиме свет в квартире мигает. Не менять же проводку, в самом деле)
+
avatar
0
  • ator
  • 31 июля 2025, 16:32
реле+простейший регулятор с термопарой было бы идеальным простым решением.
Да. Только где бы подходящий компактный терморегулятор на температуру до 300 градусов найти?
+
avatar
0
  • xNIXx
  • 01 августа 2025, 23:22
Рекс 100 же…
+
avatar
0
  • ator
  • 08 августа 2025, 17:02
Слишком большой для нагрузки 300 вт. Компактнее раза в три-четыре хотелось бы.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.