Ну, применение готовых рецептов без понимания нюансов работы схемы — это уровень любителей, а вы сами выше отметили, что тут сайт для знающих людей. Профессиональный разработчик всегда стремится понимать схему во всей ее полноте, включая основные расчетные соотношения.
Я, например, никогда не закладываю в разработку решение, работу которого не понимаю досконально, даже если оно «хорошо работает и проверено». Такая беспечность может аукнуться отзывом партии, а при достаточном размере партии это может поставить под угрозу финансовые показатели компании. Проще говоря — премию урежут. Не потому даже, что начальство злое, а потому, что если приходится отзывать партию, деньгам взяться неоткуда, особенно если партия 200000 штук, например.
Ну и меня всегда немного передергивает от идеи подбирать параметры компонентов в процессе настройки. На сборочной линии никакой подбор недопустим — это как минимум сильно увеличивает стоимость устройства.
Помнится, еще когда я стажировался, в студенческие годы, мне выпало спасать разработку, автор которой не просчитал все досконально. Там генератор работал на изначальной партии транзисторов — надежно работал, в тысячах устройств. А потом изначальная катушка транзисторов кончилась, купили новую, и генератор перестал работать. Угадайте, почему. Мне вот пришлось догадываться и спасать устройство, ибо его выпуск еще вполне себе шел.
Схема-то правда интересная — нечасто нынче увидишь схему со стабилизацией рабочей точки с помощью ОС по постоянному току. С другой стороны, лично я не люблю, когда мешают в одном каскаде разные функции и предпочел бы, чтобы НЧ и ВЧ части были явно разделены — экономить транзисторы уже давно нет нужды. Тем не менее, схема правда заслуживает внимания.
И да, вы бы в статье уделили побольше внимания теории самостабилизирующихся схем. Хотя бы более-менее детальные расчетные соотношения привели. Это было бы интересно.
Так или иначе, вот целая книга, посвященная построению схем на такой идеологии:
При таких мощностях фазоимпульсное регулирование использовать, естесственно, не стоит. :) Механические контакты я бы тоже не применял, с учетом того, что стоит задача регулировать мощность (т.е., требуется относительно частая коммутация).
Есть два способа.
Простой способ — взять твердотельное реле с детектором перехода через ноль (обяательно!), и подавать на него медленный-медленный ШИМ, порядка 0.5 — 1 Гц. За счет отсутствия синхронизации ШИМ-сигнала с напряжением сети будет небольшой джиттер момента реальной подачи мощности, но для нагревателя это некритично.
Красивый способ — использовать твердотельное реле без детектора перехода через ноль и использовать регулирование по алгоритму Брезенхема с равномерным распределением полупериодов:
Во-первых: кто такие «вы» и почему «вам» я что-то должен рассказывать?
«Мы» — это уважаемая аудитория сообщества, которая, уверен, как и я, не откажется получить крупицу бесценного знания от умудренного опытом старца, годящегося их родителям в деды или, на худой конец, в отцы.
Я не решил, что вы прозелит Cube. Просто я предположил, что годы плодотворной практики расширили ваш кругозор в числе прочего и до блестящего знания возможностей Cube, которым я не обладаю; а я всегда стремлюсь поучиться у знаюшего человека, потому и задал вопрос. Если в Cube это невозможно — то и такую новость я приму со смирением.
Более того, в вашем понимании, если не портянки, то HAL и никаких других вариантов вы не видите.
Вариантов распихивать битовые маски по регистрам существует множество. Можно и до шаблонов дойти. Это смотрится круто…
Выше я писал только о том, что ко мне приходят люди, запутавшиеся в HAL. Люди, запутавшиеся в шаблонах, ко мне не приходили, вот и все.
Куда уж мне там до элиты, я скромный инженер, так что «непроизводительный труд» я не стесняюсь автоматизировать скриптованием. Но, конечно, для того, чтобы написать собственный кодогенератор «на случай», надо понимать, как устроена периферия. Это сложнее, чем копировать примеры HAL или тыкать мышкой в Cube. Потому те, кто пишут на HAL, регулярно приходят ко мне (это на работе, из других отделов), чтобы я им объяснил, почему у них что-то не работает.
Полагаю, вы один из тех немногих людей, которые пишут на Ada (если начинали в такие далекие времена, времена богов и героев). Между прочим да, по показателям надежности (главное для встроенных систем) — это лучший язык. По сравнению с ним что C, что C++ ничего не стоят.
Ну и кстати, расскажите же нам, как сделать то, что я описывал в статье, в Cube? Мне самому интересно, а заново ставить Cube лень.
Добро пожаловать в низкоуровневое программирование — некоторых прикладников оно шокирует, действительно. Особенно тех, которые не догадываются о том, как все работает под капотом привычных им конструкций на Питоне. :)
другой вопрос, что то, что он генерит никуда не годится.
Это как раз основной вопрос. :)
Не надо никаких HAL'ов. Если человек может освоить документацию и имеет небольшие навыки программирования, то ему не составит труда писать с использованием регистров.
Например, для FMC я писал небольшой кодогенератор на Lua, который генерировал мне макросы для портов.
Вы только не смейтесь и не обижайтесь — я посоветую Reference Manual. Там правда очень толково все описано, особенно на новые серии. Я и сам не читаю ничего другого по STM32 — просто необходимости нет. Только недавно запускал FMC, сейчас сижу запускаю Ethernet MAC — все по официальной документации.
Ради интереса, когда (и, если не секрет) для чего вам было необходимо получать произвольный сдвиг между каналами ШИМ? :)
Но это ладно. Я выше писал в предположении, что мы используем один таймер. Если разрешить себе использовать два таймера, то все сводится к конфигурации ШИМ-каналов от разных таймеров и задании разных начальных значений для этих двух таймеров. Дальше все будет происходить само по себе.
Надо сказать, что в STM32 это делается гораздо спокойнее, потому что таймеров там, как правило, больше, и потратить два не так жалко. :)
Вместо SBI/CBI в STM32 есть механизм bit-banding (отображение битов на индивидуальные адреса памяти). Для портов там вообще есть специальные регистры атомарной установки/снятия битов.
Не поймите меня правильно, я не продвигаю STM32 (или какую-то другую) архитектуру как абсолют. Если бы какая-то архитектура была абсолютом, то уже давно осталась бы она одна. Просто мы с вами разговариваем именно о STM32 и AVR, потому и примеры на STM32. С тем же успехом я мог бы приводить примеры на MSP430. Просто мы о них пока не говорим.
Кстати, у MSP430 мне как раз таки очень нравится ассемблер. Писать на нем — одно удовольствие! Вот это супер-архитектура для ассемблерного кода. Попробуйте, не пожалеете. Из них можно многое выжать.
А так, контроллер надо выбирать под задачу. В разных задачах разные архитектуры имеют преимущество. Скажем, в AVR мне нравится АЦП, а в STM32 — таймеры, особенно поддержка инкрементального энкодера.
Вы знаете, я еще раз подумал над вашими и Lifelover'а словами про края и серединки. Тут, конечно, надо рисовать, чтобы всем все стало понятно. Но если имеется в виду получение совсем произвольного сдвига между каналами (зачем?), то для этого можно сделать следующее (даже не трогая остальные аппаратные возможности):
— настроить прерывание по обнулению (при счете вниз) и переполнению (при счете вверх) таймера;
— в этом прерывании при достижении максимального значения таймера прибавлять значение сдвига к основному значению CCR канала, а при счете вниз и достижении нуля — вычитать.
Я, например, никогда не закладываю в разработку решение, работу которого не понимаю досконально, даже если оно «хорошо работает и проверено». Такая беспечность может аукнуться отзывом партии, а при достаточном размере партии это может поставить под угрозу финансовые показатели компании. Проще говоря — премию урежут. Не потому даже, что начальство злое, а потому, что если приходится отзывать партию, деньгам взяться неоткуда, особенно если партия 200000 штук, например.
Ну и меня всегда немного передергивает от идеи подбирать параметры компонентов в процессе настройки. На сборочной линии никакой подбор недопустим — это как минимум сильно увеличивает стоимость устройства.
Помнится, еще когда я стажировался, в студенческие годы, мне выпало спасать разработку, автор которой не просчитал все досконально. Там генератор работал на изначальной партии транзисторов — надежно работал, в тысячах устройств. А потом изначальная катушка транзисторов кончилась, купили новую, и генератор перестал работать. Угадайте, почему. Мне вот пришлось догадываться и спасать устройство, ибо его выпуск еще вполне себе шел.
Схема-то правда интересная — нечасто нынче увидишь схему со стабилизацией рабочей точки с помощью ОС по постоянному току. С другой стороны, лично я не люблю, когда мешают в одном каскаде разные функции и предпочел бы, чтобы НЧ и ВЧ части были явно разделены — экономить транзисторы уже давно нет нужды. Тем не менее, схема правда заслуживает внимания.
И да, вы бы в статье уделили побольше внимания теории самостабилизирующихся схем. Хотя бы более-менее детальные расчетные соотношения привели. Это было бы интересно.
Так или иначе, вот целая книга, посвященная построению схем на такой идеологии:
Гаврилов С.А. — «Полупроводниковые схемы. Секреты разработчика».
www.beyondlogic.org/usbnutshell/usb1.shtml
www.usbmadesimple.co.uk/
Есть два способа.
Простой способ — взять твердотельное реле с детектором перехода через ноль (обяательно!), и подавать на него медленный-медленный ШИМ, порядка 0.5 — 1 Гц. За счет отсутствия синхронизации ШИМ-сигнала с напряжением сети будет небольшой джиттер момента реальной подачи мощности, но для нагревателя это некритично.
Красивый способ — использовать твердотельное реле без детектора перехода через ноль и использовать регулирование по алгоритму Брезенхема с равномерным распределением полупериодов:
habr.com/post/254719/
trolsoft.ru/ru/articles/bresenham-algo
www.platan.ru/shem/pdf/brezenhem.pdf
Такой способ позволяет максимально равномерно распределить потребление тока во времени.
«Мы» — это уважаемая аудитория сообщества, которая, уверен, как и я, не откажется получить крупицу бесценного знания от умудренного опытом старца, годящегося их родителям в деды или, на худой конец, в отцы.
Я не решил, что вы прозелит Cube. Просто я предположил, что годы плодотворной практики расширили ваш кругозор в числе прочего и до блестящего знания возможностей Cube, которым я не обладаю; а я всегда стремлюсь поучиться у знаюшего человека, потому и задал вопрос. Если в Cube это невозможно — то и такую новость я приму со смирением.
Вариантов распихивать битовые маски по регистрам существует множество. Можно и до шаблонов дойти. Это смотрится круто…
Выше я писал только о том, что ко мне приходят люди, запутавшиеся в HAL. Люди, запутавшиеся в шаблонах, ко мне не приходили, вот и все.
Полагаю, вы один из тех немногих людей, которые пишут на Ada (если начинали в такие далекие времена, времена богов и героев). Между прочим да, по показателям надежности (главное для встроенных систем) — это лучший язык. По сравнению с ним что C, что C++ ничего не стоят.
Ну и кстати, расскажите же нам, как сделать то, что я описывал в статье, в Cube? Мне самому интересно, а заново ставить Cube лень.
Это как раз основной вопрос. :)
Не надо никаких HAL'ов. Если человек может освоить документацию и имеет небольшие навыки программирования, то ему не составит труда писать с использованием регистров.
Например, для FMC я писал небольшой кодогенератор на Lua, который генерировал мне макросы для портов.
Эти макросы не делают ничего волшебного — просто скрывают битовые сдвиги.
Посмотрите в докуменации, как устроен регистр GPIOx->CRH, я наизусть не помню, где там какие битовые поля.
Но это ладно. Я выше писал в предположении, что мы используем один таймер. Если разрешить себе использовать два таймера, то все сводится к конфигурации ШИМ-каналов от разных таймеров и задании разных начальных значений для этих двух таймеров. Дальше все будет происходить само по себе.
Надо сказать, что в STM32 это делается гораздо спокойнее, потому что таймеров там, как правило, больше, и потратить два не так жалко. :)
Вместо SBI/CBI в STM32 есть механизм bit-banding (отображение битов на индивидуальные адреса памяти). Для портов там вообще есть специальные регистры атомарной установки/снятия битов.
Не поймите меня правильно, я не продвигаю STM32 (или какую-то другую) архитектуру как абсолют. Если бы какая-то архитектура была абсолютом, то уже давно осталась бы она одна. Просто мы с вами разговариваем именно о STM32 и AVR, потому и примеры на STM32. С тем же успехом я мог бы приводить примеры на MSP430. Просто мы о них пока не говорим.
Кстати, у MSP430 мне как раз таки очень нравится ассемблер. Писать на нем — одно удовольствие! Вот это супер-архитектура для ассемблерного кода. Попробуйте, не пожалеете. Из них можно многое выжать.
А так, контроллер надо выбирать под задачу. В разных задачах разные архитектуры имеют преимущество. Скажем, в AVR мне нравится АЦП, а в STM32 — таймеры, особенно поддержка инкрементального энкодера.
— настроить прерывание по обнулению (при счете вниз) и переполнению (при счете вверх) таймера;
— в этом прерывании при достижении максимального значения таймера прибавлять значение сдвига к основному значению CCR канала, а при счете вниз и достижении нуля — вычитать.
Таким образом можно получить любой сдвиг.