0
Лучшие публикации из всех, что я читал к данному моменту:

www.beyondlogic.org/usbnutshell/usb1.shtml
www.usbmadesimple.co.uk/
  • avatar
  • _YS_
  • 08 апреля 2019, 14:21
0
Твердотельное реле — тот же симистор. :)
  • avatar
  • _YS_
  • 21 ноября 2018, 13:47
0
При таких мощностях фазоимпульсное регулирование использовать, естесственно, не стоит. :) Механические контакты я бы тоже не применял, с учетом того, что стоит задача регулировать мощность (т.е., требуется относительно частая коммутация).

Есть два способа.

Простой способ — взять твердотельное реле с детектором перехода через ноль (обяательно!), и подавать на него медленный-медленный ШИМ, порядка 0.5 — 1 Гц. За счет отсутствия синхронизации ШИМ-сигнала с напряжением сети будет небольшой джиттер момента реальной подачи мощности, но для нагревателя это некритично.

Красивый способ — использовать твердотельное реле без детектора перехода через ноль и использовать регулирование по алгоритму Брезенхема с равномерным распределением полупериодов:

habr.com/post/254719/
trolsoft.ru/ru/articles/bresenham-algo
www.platan.ru/shem/pdf/brezenhem.pdf

Такой способ позволяет максимально равномерно распределить потребление тока во времени.
  • avatar
  • _YS_
  • 21 ноября 2018, 13:47
0
#ifndef STM32_PORTS_H_INCLUDED
#define STM32_PORTS_H_INCLUDED

#define M_IN        0x00
#define M_OUT_2M    0x02
#define M_OUT_10M   0x01
#define M_OUT_50M   0x03

#define IN_ANALOG   0x00
#define IN_FLOATING 0x01
#define IN_PULLED   0x02

#define OUT_GP_PP   0x00
#define OUT_GP_OD   0x01
#define OUT_AF_PP   0x02
#define OUT_AF_OD   0x03

#define SET_CRL(pin_no,mode,conf)           (((mode) | ((conf) << 2)) << (4*(pin_no)))
#define SET_CRH(pin_no,mode,conf)           (((mode) | ((conf) << 2)) << (4*((pin_no)-8)))
#define PIN_MASK(pin_no)                    (1<<(pin_no))

#define PIN_SETMASK(pin_no)                 (1<<(pin_no))
#define PIN_RSTMASK(pin_no)                 (1<<((pin_no)+16))

#endif /* STM32_PORTS_H_INCLUDED */
  • avatar
  • _YS_
  • 31 октября 2018, 22:01
+1
Во-первых: кто такие «вы» и почему «вам» я что-то должен рассказывать?

«Мы» — это уважаемая аудитория сообщества, которая, уверен, как и я, не откажется получить крупицу бесценного знания от умудренного опытом старца, годящегося их родителям в деды или, на худой конец, в отцы.

Я не решил, что вы прозелит Cube. Просто я предположил, что годы плодотворной практики расширили ваш кругозор в числе прочего и до блестящего знания возможностей Cube, которым я не обладаю; а я всегда стремлюсь поучиться у знаюшего человека, потому и задал вопрос. Если в Cube это невозможно — то и такую новость я приму со смирением.

Более того, в вашем понимании, если не портянки, то HAL и никаких других вариантов вы не видите.

Вариантов распихивать битовые маски по регистрам существует множество. Можно и до шаблонов дойти. Это смотрится круто…

Выше я писал только о том, что ко мне приходят люди, запутавшиеся в HAL. Люди, запутавшиеся в шаблонах, ко мне не приходили, вот и все.
  • avatar
  • _YS_
  • 30 октября 2018, 12:52
0
Куда уж мне там до элиты, я скромный инженер, так что «непроизводительный труд» я не стесняюсь автоматизировать скриптованием. Но, конечно, для того, чтобы написать собственный кодогенератор «на случай», надо понимать, как устроена периферия. Это сложнее, чем копировать примеры HAL или тыкать мышкой в Cube. Потому те, кто пишут на HAL, регулярно приходят ко мне (это на работе, из других отделов), чтобы я им объяснил, почему у них что-то не работает.

Полагаю, вы один из тех немногих людей, которые пишут на Ada (если начинали в такие далекие времена, времена богов и героев). Между прочим да, по показателям надежности (главное для встроенных систем) — это лучший язык. По сравнению с ним что C, что C++ ничего не стоят.

Ну и кстати, расскажите же нам, как сделать то, что я описывал в статье, в Cube? Мне самому интересно, а заново ставить Cube лень.
  • avatar
  • _YS_
  • 29 октября 2018, 19:13
0
Добро пожаловать в низкоуровневое программирование — некоторых прикладников оно шокирует, действительно. Особенно тех, которые не догадываются о том, как все работает под капотом привычных им конструкций на Питоне. :)
  • avatar
  • _YS_
  • 29 октября 2018, 18:37
0
другой вопрос, что то, что он генерит никуда не годится.

Это как раз основной вопрос. :)

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

Например, для FMC я писал небольшой кодогенератор на Lua, который генерировал мне макросы для портов.
  • avatar
  • _YS_
  • 29 октября 2018, 17:42
0
Если все будет совсем плохо, то по приходе домой я выложу свой заголовочник stm32_ports.h
  • avatar
  • _YS_
  • 29 октября 2018, 17:39
0
А-а-а. Ну так тут используются мои самописные макросы SET_CRH/SET_CRL. Забыл об этом написать в статье, т.к. давно их использую.

Эти макросы не делают ничего волшебного — просто скрывают битовые сдвиги.

Посмотрите в докуменации, как устроен регистр GPIOx->CRH, я наизусть не помню, где там какие битовые поля.
  • avatar
  • _YS_
  • 29 октября 2018, 17:38
0
Вы только не смейтесь и не обижайтесь — я посоветую Reference Manual. Там правда очень толково все описано, особенно на новые серии. Я и сам не читаю ничего другого по STM32 — просто необходимости нет. Только недавно запускал FMC, сейчас сижу запускаю Ethernet MAC — все по официальной документации.
  • avatar
  • _YS_
  • 29 октября 2018, 15:03
0
Вообще не представляю. Я им не пользуюсь, и вам не советую.
  • avatar
  • _YS_
  • 29 октября 2018, 14:03
0
«Не поймите меня неправильно», разумеется. :D
  • avatar
  • _YS_
  • 08 января 2018, 17:21
+1
Ради интереса, когда (и, если не секрет) для чего вам было необходимо получать произвольный сдвиг между каналами ШИМ? :)

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

Надо сказать, что в STM32 это делается гораздо спокойнее, потому что таймеров там, как правило, больше, и потратить два не так жалко. :)

Вместо SBI/CBI в STM32 есть механизм bit-banding (отображение битов на индивидуальные адреса памяти). Для портов там вообще есть специальные регистры атомарной установки/снятия битов.

Не поймите меня правильно, я не продвигаю STM32 (или какую-то другую) архитектуру как абсолют. Если бы какая-то архитектура была абсолютом, то уже давно осталась бы она одна. Просто мы с вами разговариваем именно о STM32 и AVR, потому и примеры на STM32. С тем же успехом я мог бы приводить примеры на MSP430. Просто мы о них пока не говорим.

Кстати, у MSP430 мне как раз таки очень нравится ассемблер. Писать на нем — одно удовольствие! Вот это супер-архитектура для ассемблерного кода. Попробуйте, не пожалеете. Из них можно многое выжать.

А так, контроллер надо выбирать под задачу. В разных задачах разные архитектуры имеют преимущество. Скажем, в AVR мне нравится АЦП, а в STM32 — таймеры, особенно поддержка инкрементального энкодера.
  • avatar
  • _YS_
  • 08 января 2018, 17:19
0
Отписался в комментарии ниже.
  • avatar
  • _YS_
  • 08 января 2018, 16:44
0
Вы знаете, я еще раз подумал над вашими и Lifelover'а словами про края и серединки. Тут, конечно, надо рисовать, чтобы всем все стало понятно. Но если имеется в виду получение совсем произвольного сдвига между каналами (зачем?), то для этого можно сделать следующее (даже не трогая остальные аппаратные возможности):

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

Таким образом можно получить любой сдвиг.
  • avatar
  • _YS_
  • 08 января 2018, 16:44
0
Интересно, спасибо.
  • avatar
  • _YS_
  • 08 января 2018, 12:44
0
Нутк, без MOE (TIM_BDTR_MOE) действительно ничего не будет работать. :))
  • avatar
  • _YS_
  • 07 января 2018, 17:30
0
Еще одну статью, чтобы показать остальные режимы, кроме PWM1 и PWM2, я писать не буду. ;)
  • avatar
  • _YS_
  • 07 января 2018, 16:33
0
  • avatar
  • _YS_
  • 07 января 2018, 16:14