История прожектирования и сборки первого (опытного-лабораторного-экспериментального-универсального)
  работающего экземпляра частотника. (статья в процессе написания)

  (Примечание №1 - при желании получить "нотариально заверенный скриншот" этой статьи на бумаге - было обнаружено что Mozilla FireFox на бумаге А4 в альбомной ориентации с масштабом ~50-70% даёт вполне удобоваримый результат.
Однако по причине кликабельности большинства изображений на полный размер правильнее рассматривать статью в браузёре.)
   (Примечание №2 - надо понимать что копии файлов проекта со ссылками из текста статьи - лишь копии файлов проекта на какой-то определённый момент времени для иллюстрации. В архиве проекта эти файлы могут быть другими.)

Регулярно посещая сайт Микрочип для изучения любопытной темы мелкопроцов - около 13 лет назад наткнулся на AN900 и AN955, PICDEM™ MC Development Board for PIC18FXX31.
Тема 3Ф синтезаторов изучалась для синхронных БК моторов для авиамоделей (в том числе на форуме RCDesign.ru), силовые модули IRAMX и PIC18F4431 были доступны для заказа, но только не в РФ.

Неспешно были куплены парочка IRAMX16UP60A и пяток PIC18F4431 через посредника в штатах для неспешного изучения и программирования. В готовом силовом модуле подкупала простота создания частотника - при удалении гальваноразвязки схема получается предельно простой - несколько десятков проводов, несколько шунтов, 1 корпус компараторов (например LM339), 1 корпус ОУ (например LM324).
Более того - модули IRAM уже содержат на борту токовый шунт и схему защиты от сверхтока в нижних ногах ключей, что ещё более упрощает схему. Но без реального применения/внедрения детальки проекта вяло ждали своей очереди к паяльнику 10+ лет.
   За это время были случайно найдены дешёвые менее $1 1% 5 Вт шунты на digikey.com и набор SMD резисторов размера 0805 на ebay:

  "Надо частотник, коронки горят"

- сказал внезапно хороший приятель в конце февраля 2017 года, и лично я не смог ему отказать.
Заранее были распределены роли нашего тандема - все работы по металлу делал приятель (зарабатывающий на жизнь изготовлением заказных металлоконструкций), моя роль (как зарабатывающего на жизнь "лужу-паяю-компьютерки починяю") - разработка/пайка схемы и написание ПО.
Неоднократно наблюдая за электрическими поделками радиолюбителей, в том числе в интернетах - было заметно широкое распостранение стремления людей нарисовать и вытравить печатку (для неизвестной окончательно схемы опытной конструкции), нарисовать схему в незнакомом ПО и прочие подготовки к серийному производству для однократной поделки.
Лично мне изучение тем фоторезиста/ЛУТ/Sprint-Layout/SPlan или иных пакетов ПО/способов изготовления плат показалось излишним/не нужным для изготовления единственного тестового/отладочного/лабораторного экземпляра частотника. При этом техника пайки навесным/пространственным монтажом - вполне тренированна, много лет, в самых различных поделках "на коленке".
При использовании нейтральных флюсов - пайка даже в условиях конденсации влаги и вибрации показывает весьма высокую надёжность. Ценой отказа от печатки/ЛУТ было приобретение макетной платы за 500 рублей с лужёными отверстиями.

  "Устройство должно работать не в принципе, а в корпусе".

Неоднократно наблюдая на практике слабость и сложность вместить опытную конструёвину в корпус - в этот раз лично я решил злоупотребить щедростью знакомого металлообработчика и зайти с обратной стороны, с учётом того что "в принципе" устройство работает в примерах и демо-платах от МикроЧипа 2003+ года.
Для ускорения процесса был выбран Б/У металлический корпус БП АТХ, было выбрано место на сверлильном станке куда он будет установлен, был выбран мясистый радиатор от S478 с металлолома, примерно соответсвующий максимальному тепловыделению IRAMX16UP60A и диодного моста (~31х6+16*2 Вт).
Похожий радиатор на управляемой нагрузке с принудительным обдувом вентилятором 80х80 мм долговременно рассеивал 350 Вт при разнице с температурой воздуха около 40-50 цельсиев. Первым этапом прожектирования - разместили и закрепили большие и тепловыделяющие силовые компоненты внутри выбранного корпуса (радиатор с силовым модулем, накопители шины, плату экрана, макетную плату, диодный мост, силовые транзисторы гашения рекуперативных избытков на шине и транзисторы корректора мощности, силовой дроссель корректора мощности, токовые шунты 5 Вт 0.01 и 0.05 Ома), обозначились габариты/размеры токарных деталей (стойки и ручки гальваноразвязки).
Заранее приварили к днищу корпуса уши крепления к станку, нашли подходящую по размеру клемную коробку. Вентилятор и клемную коробку пришлось вынести за пределы корпуса - не хватило таланта разместить их внутри. Задним числом понимаю, что размер привариваемой площадки можно было сделать больше для размещения коробки под входное УЗО (=дифф автомат) на номинальный ток мотора рядом с корпусом частотника.

  Выбор экрана 20х4 на HD44780

был обусловлен несколько лет неспешно шлифуемым кодом моей заготовки (обработки строк/кнопок/енкодера/регулировки параметров) для универсального применения. Количество потребляемых ног у такого экрана меньше чем у семисегментного LED индикатора - это дополнительно упрощает пайку и даёт экономию ног но потребляет $20 за экран.
   Однако на металлоломе или барахолках можно найти Б/У экраны например по 140 руб/шт (directlot.ru/lot.php?id=89696) Тетрада/Шина данных обмена ЛЦД мультиплексируется с кнопами и енкодером (2 ряда по 4 кнопки максимум, но енкодер это 2+1 кнопка).
Сложность в том что енкодер в отличие от обычных кнопок имеет долговременно замкнутые контакты, мешающие опросу остальных кнопок без анализа одновременного нажатия.
Вторая сложность в том что единственный бит DB7 "занятость", читаемый из ЛЦД сейчас - желательно не смешивать с енкодером для упрощения подборки величин резистивных делителей, частично разрешающих конфликты замыканий выводов кнопок/енкодера.

Тетрада шины обмена с ЛЦД/Клавой/енкодером, подтянута через 11 КОм на +2.5 вольта:
19 RD0 = 11 LCD_4 	Допустимый	= 11К = +2.5V - от дополнительного
20 RD1 = 12 LCD_5 	выходной	= 11К = +2.5V - делителя 330 Ом + 330 Ом
21 RD2 = 13 LCD_6 	ток HD44780	= 11К = +2.5V - и шунтирующего конденсатора
22 RD3 = 14 LCD_7 	IOL = 1.2 mA 	= 11К = +2.5V - керамика 7 мкФ.
и параллельно шине LCD к ногам 4431 припаяны выходы от строк кнопок/енкодера:
19 RD0 = | = 4К7 =ЕнкВых+кнопы	
20 RD1 = | = 4К7 =Кнопы		
21 RD2 = | = 4К7 =ЕнкВых+кнопы	
22 RD3 = | = 4К7 =Кнопы		
Управление ЛЦД/клавой/енкодером:
29 RD6 = 05 LCD_R/W = K51 = Кнопы 1 строка 
30 RD7 = 04 LCD_R/S = K51 = Кнопы 2 строка = енкодер  вход 

В поделках радиолюбителей можно встретить подключение экрана HD44780/кнопок/енкодера без мультиплексирования с расходом 16 выводов на 16 кнопок, экран и енкодер.
   С мультиплексированием можно ограничиться 7 выводами, но количество кнопок меньше. Если мечтать и ни в чём себе не отказывать - то вполне реально мультиплексировать 8 сегментов LED 4 разряда, LCD 44780 и матрицу кнопок 2х7 на 12 выводах мелкопроца без внешних микросхем, только 4 шт транзистора - пока не реализовано. При этом управление базами транзисторов можно дополнительно мультиплексировать с аналоговыми входами с некоторой потерей точности/диапазона/оперативности АЦП преобразования.
   После некоторых экспериментов был выбран (наверняка не самый лучший но работающий) вариант, подробно описанный в файле LCD_Task.asm после метки KeyboardRead: примерно в 381 строке:

Как видно из кода, вход енкодера присоединён к LCD_RS:
	bsf		LCD_RW	; При опросе клавы 0 на одном из этих выводов 
	bcf		LCD_RS	; указывает строку опроса
а пара выходов присоединены к LCD_Key_Port2 и LCD_Key_Port0:
	movb	LCD_Key_Port2,PortB_Buf,7,ACCESS ; Биты
	movb	LCD_Key_Port0,PortB_Buf,6,ACCESS ; Енкодера
Значения LCD_Key_Port№ назначаются в Define_LCD_Key_Enc.inc в строке примерно 20:
#define LCD_Key_Port	PORTD
#define LCD_Key_Port0	LCD_Key_Port,0,ACCESS
#define LCD_Key_Port1	LCD_Key_Port,1,ACCESS
#define LCD_Key_Port2	LCD_Key_Port,2,ACCESS
#define LCD_Key_Port3	LCD_Key_Port,3,ACCESS

Буфер ПортБ присваивается в LCD_Task.Asm строки примерно 411-469:
Первая строка кнопок, RD7=30 нога 4431=0:
	bcf		LCD_RS	; указывает строку опроса
	movb	LCD_Key_Port2,PortB_Buf,7,ACCESS ; Биты
	movb	LCD_Key_Port0,PortB_Buf,6,ACCESS ; Енкодера
	<>
	movb	LCD_Key_Port3,PortB_Buf,4,ACCESS ; Побитовый
	movb	LCD_Key_Port1,PortB_Buf,5,ACCESS ; клавы
Вторая строка кнопок, RD6=29 нога 4431=0:
	bcf		LCD_RW	; При опросе клавы 0 на одном из этих выводов 
	movb	LCD_Key_Port3,PortB_Buf,3,ACCESS ; Побитовый
	movb	LCD_Key_Port2,PortB_Buf,2,ACCESS ; ввод второй строки
	movb	LCD_Key_Port1,PortB_Buf,1,ACCESS ; клавы
	movb	LCD_Key_Port0,PortB_Buf,0,ACCESS ; в буфер енкодера

Имеется разница в присоединении кнопок в боевой и учебной платах, предметно описана в файле Task_Keys.inc примерно в 20 строке.
 PortB_Buf,1 - кнопа старт/стоп №1  одинакова в боевой и учебной
 PortB_Buf,2 (учебная) или PortB_Buf,4 (боевая) - кнопа старт/стоп №2
 PortB_Buf,3 - кнопа прямо/реверс одинакова в боевой и учебной
 PortB_Buf,5 - кнопа енкодера одинакова в боевой и учебной
Таким образом, три кнопки на лицевой панели - присоединены между выводами 4431:
Старт/стоп/память №1 = 29 х 20 одинаково в обоих платах
Старт/стоп/память №2 = 29 х 21 учебная или  30 х  22 боевая
Реверс = 29 х 22 одинаково в обоих платах
Кнопа енкодера = 30 х 20 одинаково в обоих платах
Датчик енкодера общий вход = 30, парафазные выходы = 19 и 21
В качестве плюсов всех этих сложностей с енкодером в сравнении с переменным резистором - существенно больший простор для приложения мозгов и фантазии программера. Настроенные параметры не сбиваются при переноске изделия, обработчик енкодера может быть более интеллектуальным/с прогрессией (когда много вращения в одну сторону - увеличивается коэфф прибавления на один щелчок) и прочие потенциальные возможности.
   Наличие 20*4 экрана на таком простом изделии как частотник - позволяет оперативно отображать частоту/ток/напряжение/состояние/температуры компонент, более удобно и прозрачно настраивать параметры. При необходимости связывать алгоритмы вращения привода с внешними событиями (например поддержание давления в накопителе компрессора или синхронизация оборотов пары двигателей подъёмника) - потребительская ценность наличия экрана и енкодера в заготовке возрастает, запас заготовки по быстродействию/ОЗУ/ПЗУ/выводам будет израсходован. Дополнительными минусами LCD экрана являются виброНЕстойкость и морозоНЕстойкость, плюсом - разборчивость текста при солнечном освещении.

Компоновка получалась такой, что этажерка плата управления/экран была связана с силовым модулем межблочным кабелем.
Заранее оценивая величины входных сопротивлений логической части схемы и частоты/мощности ЭМИ фронтов силовых импульсов длительностью сотни наносекунд с коммутацией токов более 10 ампер и амплитудой сотни вольт - изготовлению этого соединительного кабеля, непосредственно присоединённому к ногам IRAMX - было уделено повышенное внимание. Каждый из 6 выходов управления ключами - проведён отдельной витой парой (гибкой), шаг свивки уменьшен с помощью шуруповёрта до минимально возможного.
Витая пара при дополнительной свивке укорачивается примерно в 1.5 раза. Каждый земляной провод в каждой витой паре с обоих сторон соединён с землями, контакты земли и питания на разъёме со стороны платы управления дублированы. Разъём для IRAMX склеен из 2х однорядных с небольшим смещением /подгибанием ног модуля IRAMX.

Резистор 6к8, подтягивающий вывод термистора к земле - размещён на плате управления, по этой причине при НЕ подключении межблочного кабеля на выводе ITRIP будет более 5 вольт, все силовые ключи IRAMX разомкнуты. Подтяжка ITRIP к напряжению питания IRAMX при сработке компараторов сверхтока осуществляется через PNP транзистор, светодиод и резистор 1K2, припаяный непосредственно к выводу IRAMX. Превышение 5 вольт на входе в PIC18F4431 шунтируется защитным диодом с рабочим током до 20 мА на шину +5 вольт внутри 4431.


  Дополнительно для гашения шумов/отражений/ЭМИ - последовательно с выходами ШИМ от 4431 впаяны резисторы 200 Ом:
   Учитывая что изменение шага свивки существенно не меняет волнового сопротивления витой пары (около 110 Ом UTP Cat 5E), учитывая что выходное сопротивление выхода PIC около 70-200 Ом (DS39616B-page 350) - для согласования волнового сопротивления витой пары и выхода ШИМ дополнительные резисторы НЕ нужны.
Однако они добавлены для надежды на выживание при пробое драйверов силового модуля и защиты от влияния ЭМИ на процессор.
   Задним числом, сравнивая стоимости модуля IRAM и процессора PIC18F4431 и вероятности выживания проца при пробое драйверов - вполне возможно что эти резисторы лишние, спасти не спасут а рассогласование вносят и место потребляют. Вполне возможно что более правильным значением было бы 30-50 Ом для более точного согласования с волновым сопротивлением витой пары.

  Блок питания собственных нужд 16 вольт.

Диапазон питающих напряжений модулей IRAM - от 12 до 20 вольт. Однако с учётом защиты UnderVoltage драйверов верхних ключей (максимум 11.6 вольт), падения напряжения на переходах нижних ключей (максимум 2.5 вольт) и падения напряжения на заряжающих диодах (максимум 1.25 вольт) - минимальное напряжение питания увеличивается до 15.35 вольта. С учётом максимального питающего напряжения 20 вольт - разумным компромиссом выглядит 17.5 вольт напряжения питания модуля для работы в максимальном режиме.
   Вместо самостоятельного изготовления - под руками оказался легкоразборный фабричный БП 12 вольт 1 ампер. Для увеличения выходного напряжения до 16 вольт в цепь ОС был добавлен стабилитрон 4 вольта. Для улучшения стабильности выходного напряжения - были добавлены керамические конденсаторы, увеличены выходные электролиты и добавлено кольцо подавления ВЧ шумов на выходных проводах. Потребление частотника по 16 вольтам - около 200 мА, из которых существенную долю потребляют делители защиты от сверхтока и подсветка ЛЦД экрана.
   Вентилятор охлаждения потребляет 200-800 мА в зависимости от модели, ШИМ управления вентилятором в зависимости от температуры не реализована.

  Защита процессора от сквозного открывания выходных ключей при воздействии ЭМИ

(случавшегося при отладке проекта зажигания для ДВС) - процессор питается 5 вольт от отдельного маломощного LDO стабилизатора с предельным током 150 мА/током КЗ около 200 мА.
Питание резисторных делителей 200 Ом- 200 Ом компараторов защиты от сверх тока от отдельной КР142ЕН5=7805.
   Опорное для компараторов - делитель из 12 КОм постоянного и 10 КОм подстроечного резистора, питаемый 5 вольт и выдающий опорное 2.7-5.0 вольт, что соответствует падению на шунтах 0.05 Ома с учётом деления на 2 от тока 8-100 Ампер (точная настройка защиты от сверхтока). Выходы компараторов защиты от сверхтока лишь отключают IRAMX через вывод ITRIP и пока не подводятся к процессору, попытка завести сигнал сверхтока на RESET вместо FLTA для экономии ног пока не доведена до конца. Отключение модуля через повышение напряжения на ITRIP выше 4.5 вольта отключает модуль через ~1.7 микросекунды на ~7 миллисекунд. При этом растёт температура транзисторов, далее модуль программно отключится от перегрева или превышения потребляемого тока или самостоятельно отключится термистором без помощи процессора при температуре термистора ~95 градусов.

  Время защиты от сквозных токов через силовые ключи -

формируется/контролируется и в драйвере силового модуля IRAMX, и в аппаратуре PCPWM PIC18F4431. Настройка аппаратуры PIC18F4431 происходит в файле Init_PCPWM_3F.inc примерно в 144 строке:
;REGISTER 17-5: DTCON – DEAD TIME CONTROL REGISTER
	clrf DTCON,ACCESS			; Состояние по сбросу
;bit 7-6 DTPS1:DTPS0: Dead Time Unit A Prescale Select bits
;11 = Clock source for Dead Time Unit is FOSC/16.
;10 = Clock source for Dead Time Unit is FOSC/8.
;01 = Clock source for Dead Time Unit is FOSC/4.
;00 = Clock source for Dead Time Unit is FOSC/2.
;bit 5-0 DT5:DT0: Unsigned 6-bit dead time value bits for Dead Time Unit.
	movlf	0x18,DTCON,ACCESS	; Примерно 1 мкСек защитный интервал при 48/2 МГц

  Особенности работы аппаратных формирователей DeadTime.

При подробном рассмотрении работы модуля встроенного в Pic18Fxx31 аппаратного формирователя защитного интервала времени - обнаружилось, что при длительности импульса ШИМ, в точности равной удвоенному защитному интервалу - на комплементарных выходах PDCxx обнаруживаются паразитные выбросы длительностью < 0.1 мкСек одновременного переключения силовых ключей с возможностью сквозного открывания.
   Эту особенность придётся учитывать при внедрении регулировки защитного интервала времени из меню - пока не реализовано.

Такая же картина наблюдается при длительности меньшей периода на двойное время DT.
   ( Жёлтый (1) сверху - управление верхним ключом, активный=открытый=низкий. Зелёный (2) снизу - управление нижним ключом, активный низкий уровень.)
   Слева для сравнения - длительности ШИМ на единицу большие удвоенного защитного интервала времени.

  Аппаратная защита от сверхтока.

Изначально (до первого измерения реального тока в реальных шунтах нижних ключей IRAMX) - компараторы сверхтока не предполагали отрицательную полярность на входе (это порождало ложные сработки защиты от сверхтока) и не содержали сдвигающего делителя на 2 из пары одинаковых резисторов (200 Ом 1% оказались под рукой, но ток потребления великоват, правильнее увеличить до ~300-500 Ом при повторении), подтягивающих токовый сигнал от шунта к 5 вольтам и делящим его на 2. Однако реальность оказалась богаче, как видно на осциллограммах снятых прямо с токовых шунтов при вращении тестового мотора ИЭ-1025 от лабораторного источника питания 36 вольт. В итоге - пришлось распаивать конструкцию и внедрять сдвигающие резисторные делители, после этого ложные сработки защиты прекратились. Для попытки подавления ВЧ помех параллельно шунтам 0.05 Ома были припаяны керамические конденсаторы 25 мкФ, что давало R*C около 1.25 мкСек. Это оказалось конструктивно НЕ удобным - шунты жёсткие, могут сломать керамику, что один раз случилось при разборке/сборке конструкции. Фильтрующую ёмкость вполне можно добавить после сдвигающих делителей непосредственно на входе компаратора, с похожим произведением R*C. Схема каждого из трёх идентичных каналов защиты проста, самое сложное не перепутать полярность компаратора. Выходы ОК компараторов LM339 запараллелены и присоединены к базе PNP транзистора (на фото КТ3126) через 12КОм резистор. Переход БЭ транзистора шунтирован защитным/закрывающим 2К4 SMD резистором. Четвёртый компаратор сейчас используется для инверсии выхода защиты от сверхтока (сравнивает с 5 вольтами питающего), но правильнее его использовать для выработки синхронизации с переходом питающей сети через 0 для реализации увеличения "коэффициента мощности" (повышающего DC-DC преобразователя на индукторе и ключе с диодом, управляемого PWM мелкопроца).

  Выбор дискретности генерации синуса.

С целью снижения ЭМИ/импульсных помех через уменьшение количества одновременно переключающихся силовых ключей модуль PCPWM используется в режиме центрально-симметричной генерации.
   Разбирая описание и исходный код AN900 (файл 3im_vf.asm строка ~1125)
;								SINE TABLE
TABLE	code 0x0600		;was 0x0100
;below table is from 270 degrees to 90 degrees @ 10 degree resolution; for 20MHz, PR2 = F9, Timer2 1:1 prescale
;sine_table db	0x00,0x02,0x08,0x11,0x1E,0x2E,0x40,0x54,0x69,0x80,0x96,0xAB,0xBF,0xD1,0xE1,0xEE,0xF7,0xFD,0xFF

;below table is from 270 degrees to 90 degrees @ 10 degree resolution; for 16MHz, PR2 = 137, Timer2 1:1 prescale
sine_table db	0x00,0x02,0x08,0x11,0x1E,0x2E,0x40,0x54,0x69,0x80,0x96,0xAB,0xBF,0xD1,0xE1,0xEE,0xF7,0xFD,0xFF
и AN955 (© 2005 Microchip Technology Inc. DS00955A)
Page 6
SVM generates line-to-line voltage with higher amplitude (about 15% more) compared to Sine PWM 
Page 8
The total sector angle is 60°(?/3 radians). To get a good resolution with an 8-bit
microcontroller like the PIC18FXX31, the entire sector
is divided into 256 points, giving an angle resolution of 0.234°. 
и AN984 DS00984A-page 14, 64 градации синуса на оборот поля
;..............................................................................
;Constants stored in Program space
;..............................................................................
.section .sine_table, "x"
.align256
; This is a 64 entry sinewave table covering 360 degrees of the
; sine function. These values were calculated using Microsoft
; Excel and pasted into this program.
SineTable:
.hword 0,3212,6393,9512,12539,15446,18204,20787,23170,25329
.hword 27245,28898,30273,31356,32137,32609,32767,32609,32137,31356,30273,28898
.hword 27245,25329,23170,20787,18204,15446,12539,9512,6393,3212,0,-3212,-6393
.hword -9512,-12539,-15446,-18204,-20787,-23170,-25329,-27245,-28898,-30273
.hword -31356,-32137,-32609,-32767,-32609,-32137,-31356,-30273,-28898,-27245
.hword -25329,-23170,-20787,-18204,-15446,-12539,-9512,-6393,-3212
а позже и конструкцию Восьмикрут (где используется 18 градаций на оборот, стр. 6 Описания модуляции ) - можно прийти к выводу что дискретность генератора синуса в работающих примерах весьма различна.
   В итоге - для упрощения вычислений - в данном проекте из любви к степеням 2 было принято волевое/авторитарное решение сделать 256 значений синус-таблицы на оборот поля (дискретность таблицы 360/256 = ~1,406 градуса, можно было уменьшить до 128 или 64 или 32 градации).
   При этом разбивку оборота на кратное количеству фаз количество секторов - решено НЕ делать для упрощения кода и лёгкости изменения угла сдвига/количества фаз мотора (существуют 3Ф моторы с углом сдвига +120+120 и +180+90 градусов, 1 шт. 18Fxx31 позволяет создать и управлять мотором 4Ф с углом сдвига +45+90+135 градусов или большее количество фаз при увеличении количества микроконтроллеров). Прибавление сдвигов фаз к накопителю/симулятору вращения происходит в файле PCPWM_3F_4431.asm строки ~40-118, исполняется в прерывании 18 750 Гц. В таблице синусов находятся 256 штук 16 бит значений полного оборота, строки АСМ вычисленны в Excel (файл SinusTable_dw_16.inc, файл Parameters_PSW.xls лист Sin Table диапазон H17:H272 ).
   Симулятором вращения поля служит 24 бита переполняющийся от регулярного изохронного (например с частотой 18 750 Гц) прибавления приращения (= скорость) 24 бита счётчик, каждое переполнение счётчика = оборот поля. Старший байт этого счётчика используется как индекс таблицы синусов для выборки соответствующего текущему положению поля значения синуса.
   Повышение разрядности счётчика-симулятора вращения до 24 бит вызвано стремлением обеспечить плавность хода ротора машины (минимизация погрешностей округления).
   Повышение разрядности таблицы синусов до 16 бит - было вызвано желанием сохранить точность представления синуса при выводе в 12-14 бит ШИМ регистры после умножения на близкую к нулю амплитуду - опять же для плавности хода машины на низких скоростях и амплитудах синусоиды.
   Как повлияет на конечный результат (плавность хода 2 полюса машины с менее чем 32 пазами статора) такое увеличение разрядности вычислений - не исследовано. Вместо этого время было затрачено на шлифовку работоспособности заведомо избыточно более тяжёлой арифметики, при упрощении однозначно успеющей работать.

  Подробное описание вычислителя фазного значения ШИМ.

Программная реализация фазного вычислителя похожа на Цифровой вычислительный синтезатор / Direct digital synthesis алгоритмически, как видно например из описания принципа действия AD9833 стр. 12 интегрального аппаратного синтезатора. Накопитель угла - 24 бита, в качестве ЦАП использован ШИМ 11-14 бит точности. Как видно из кода макроса в файле SinTableLoad.inc (исполняемого в прерывании АЦП с частотой 18 750 Гц 3 раза отдельно для каждой фазы, итого каждая команда макроса потребляет ~1/213 имеющегося быстродействия, наиболее критичный участок кода, сейчас длинной менее 73 слов - примерно 1/3 общего быстродействия потребляет) - после подготовки указателей к выборке из таблицы 16 бит знакового значения синуса (строка ~10) - происходит умножение 16 бит значения таблицы на нормированную 8 бит без знаковую положительную амплитуду (строка ~25) (вычисляется отдельно с частотой 100 Гц как произведение индекса скорости и настраиваемого параметра "V/F Amp" с прибавлением нормированного 8 бит значения начального смещения (для получения прямой вида Y=K*X+B зависимости V от F) с получением результата в рамках 0-0хFF, файл SpeedCalc.inc).
   Результат умножения 24 бита переводится к беззнаковому представлению (сложением с константой - серединой диапазона 0x7f7f01). Старшие 16 бит результата подвергаются ограничению амплитуды около 1/5 от общего размаха (строка ~ 101), нормируются до 12 бит (через умножение на константу 16 бит с нулевым младшим байтом, строка~121) и засылается в регистр длительности ШИМ.
   8 бит мгновенная амплитуда и перевод 8 бит задатчика скорости (приращения) в 24 бита слагаемое накопителя угла поля - вычисляются в отдельной ветке с частотой поступления данных (100 Гц например, файл SpeedCalc.inc, исполняется в фоне основного цикла опроса дружественной многозадачности ).
   Соответственно - для управления синтезатором минимально достаточно нескольких 8 бит задатчиков:
   1. Желаемая скорость/частота поля; 2. Начальная амплитуда при нулевой скорости поля; 3. Усиление амплитуды с возрастанием частоты; 4. Ускорение (интервал времени между единичными изменениями скорости) поля; 5. Максимальная скорость поля.
   Учитывая 5 свободных каналов АЦП - это например позволяет реализовать управление лабораторным генератором частот исключительно переменными резисторами в минималистичном варианте.
   Параметры в минималистичном варианте можно редактировать непосредственно в EPROM перед прошивкой микроконтроллера. Наличие в Pic18F4431 нескольких частот модуляции ШИМ - позволяет переключать их (в том числе на ходу) для наивыгоднейшего компромисса точность против скорости в зависимости от текущей частоты поля - пока не реализовано.

  Преобразование 8 бит индекса скорости в 24 бита приращение накопителя угла поля.

Задача оказалась не слишком тривиальной по причине резонансов.
   Первоначально на скорую руку из 8 бит индекса текущей скорости приращение 16 бит получалось путём возведения в квадрат и нескольких сдвигов до ~20 бит. Это вполне работало на отладке генерации - но при тестовых запусках на слух появилось ощущение резонансов и НЕ плавности хода. С целью преодоления резонансов (разглядывая в Excel первые варианты таблицы приращений ), - было принято решение использовать простые числа для приращений.
   Как результат - текущая реализация программы (файл SpeedCalc.inc) содержит 4 таблицы 256 шт. 24 бит простых чисел для максимальных частот поля 100, 200, 400, 800 Гц (сгенерированы MakeSimple_1.bas) и таблицу 256 шт. 16 бит простых чисел, умножаемых на текущую 8 бит скорость поля для получения приращения накопителя (сгенерирована MakeSimple.bas).
   Выбор варианта осуществляется настраиваемым параметром MaxSpdIndx, позволяющим либо выбрать максимальную частоту из ряда 100, 200, 400, 800 Гц (при этом в качестве приращений накопителя используются только 24 бита простые числа из таблиц) либо плавно с шагом ~5 Гц указать максимальную частоту диапазона ~25-1080 Гц (при этом в качестве приращения накопителя используется произведение 16 бит простого числа и 8 бит текущей скорости поля).
   Таблицы приращений используют много места в ПЗУ - в случае нехватки можно жертвовать/удалять таблицы.

  Борьба с разрядкой конденсаторов питания верхних драйверов/сработкой защиты драйвера от снижения питающего напряжения при ограничении синусоиды.

Проблема обозначилась в виде посторонних звуков на некоторых режимах мотора.
   Возможно это были 2 связанные проблемы - арифметика выдавала значение длительности ШИМ выше периода, а конденсаторы сдвига уровня не могли поддерживать уровень дольше порога при отработке "полки" верхнего ограничения синусоиды.
   Решение было общим для обоих проблем - период был увеличен чуть более, чем необходимо для выбранной длительности ШИМ. Вместо 0x3FF период был установлен 0x404 (файл Init_PCPWM_3F.inc строка ~43). По этой причине на верхней "полке" (длительное открытое состояние верхних ключей силового моста) - уровень НЕ постоянный, а прерываемый короткими импульсами, заряжающими конденсаторы плавающего питания драйверов верхних силовых ключей.

  Аналого-Цифровой Преобразователь.

   Модуль оцифровки аналоговых сигналов в PIC18F4431 сложнее обычного. Добавлено второе УВХ с возможностью "одновременной выборки" 2х каналов. Добавлен буфер FIFO на 4 результата, снижающий в 4 раза частоту прерываний АЦП. В традиционной погоне за полнотой использования имеющихся ресурсов (файл Int_ADC.inc) - 10 бит результаты 2х групп по 4 канала АЦП накапливаются 64 раза в 16 бит буферах перед выгрузкой в обработчики. Частота предоставления данных в обработчики ~150 Гц. Возможность "Одновременной выборки" с увеличением частоты прерываний АЦП до ~23 КГц использовать пока не удалось.
   При пропуске/не успевании прерывания АЦП (переполнении буфера FIFO) - испорченные буфера отбрасываются для НЕ искажения уже накопленных результатов и НЕ перепутывания каналов АЦП, модуль АЦП перезапускается. Для уменьшения вероятности пропуска прерывания АЦП при исполнении кода единственного длинного низко приоритетного прерывания - код прерывания разбит на критичную и не критичную части, установка флага прерывания АЦП проверяется дважды с возможностью пропуска менее критичной части. Для более равномерного времени исполнения обработчиков АЦП (сейчас накопители 4х каналов пересылаются в обработчики по 4 шт каждые 32 вызова прерывания, можно пересылать по одному накопителю каждые 8 вызовов) имеет смысл изменить счётчики количества накоплений - пока не реализовано.
   Для поиска пиковых значений тока за оборот поля - кроме макроса сложения АЦП с буфером - написан макрос сложения и поиска максимума. Максимумы тока за оборот могут использоваться для вычисления скольжения (нагрузки) мотора - пока не реализовано.
   Для измерителей общего тока/напряжения шины - частота получения данных 150 Гц избыточна, имеет смысл понизить до 5 Гц с доп стабилизацией результатов (быстродействие ЛЦД и человека ~5 Гц). При накапливании 2048 результатов АЦП в 24 бита буфере частота результатов будет ~4.5 Гц - пока не реализовано. Для своевременного отображения результатов, асинхронных основной 10 Гц частоте вывода отладочной информации - придётся задействовать дополнительный отдельный вход в модуль ЛЦД - пока не реализовано. При достаточно большом времени усреднения потребляемого тока - сравнение значения мгновенного тока и уставки защиты надо делать в прерывании АЦП - пока не реализовано.

  Учёт реального времени.

   Первоначально источником прерываний для отработки задержек был Timer 1. После запуска автоматического АЦП - источником прерываний для учёта времени стал АЦП модуль, Таймер-1 освободился. В прерывании в соответствующих ветках увеличивается набор переполняемых 8 бит счётчиков (18 750 Гц, 1000 Гц, 100 Гц), 10 Гц, секундный, минутный, часовой и суточный счётчики увеличиваются в фоновом процессе. Наличие набора независимых 8 бит счётчиков позволяет отрабатывать задержки широкого диапазона времени с точностью ~ 1-5%.

  Вывод на ЛЦД экран.

   Подсистема вывода на LCD экран 20 символов х4 строки построена как набор общих для всех модулей символьных строк, описанных в нескольких файлах LCD_Text_**.inc (например LCD_Text_FA.inc и LCD_Text_0-5.inc и LCD_Enc_Text.inc). В строках текста можно обращаться к содержимому ОЗУ по имени переменных, подвергая его форматированию перед выводом. Набор форматов использует пустые символы с кодами 0x10-0x1F, сейчас использованы 11 из 16 штук.
   Для вывода строки с каким-либо номером - зарезервировано имя LcdOutStr, при подключении модуля LCD заменяемое на макрос 3 команды. Для реализации асинхронности вывода текста из независимых подсистем - зарезервировано до 8 буферов и до 8 флагов. В любом месте кода можно присвоить номер строки WREG и использовать макрос LcdOutStr с указанием номера канала/буфера. Вывод строк с учётом быстродействия ЛЦД и форматирования (особенно БЦД преобразование) и загрузки процессора может занимать весьма продолжительное время, однако такое буферирование позволяет избежать накладок/не вывода строк из конкурирующих за занятость ЛЦД подсистем.
   При тестовых замерах скорости вывода модуль ЛЦД показал скорость около 2К+ строк в секунду. Сейчас используется 4 независимых (асинхронных) канала/буфера вывода - раз в секунду часики, десять раз в секунду отладочная информация и доли секунд, каждые примерно 700 мСек температура датчиков 1-Wire, вывод строки/параметра енкодера синхронен с вращением енкодера. Набор символов HD44780 совпадает с PC866/1251 в цифрах и латинских буквах, соответственно набранные латиницей строки корректно отображаются и в текстовом редакторе и на ЛЦД. Таблица преобразования кирилики из 1251 в кодовую таблицу HD44780 реализована 08/05/2018, спасибо за готовую таблицу преобразования technik-1017$mail.ru.
   Невысокая максимальная скорость работы ЛЦД позволяет реализовать отдаление с гальванической развязкой HD44780/кнопок/енкодера/светодиодов от микроконтроллера через UART интерфейс - пока не реализовано. В случае использования в качестве конвертора USB-UART заготовки Микрочип для CDC на PIC18f4550 - экран HD44780 енкодер и кнопки можно присоединить к нему - пока не реализовано.

  Звуковой выход.

   На этапе отладки оказалась простой и информативной реализация бипера через несколько команд в прерывании 1000 Гц, подключение динамика через RC цепь к указанному выводу. В модуле Main резервируется имя Beeper, при подключении переопределяемое на макрос 2 команды. Сейчас биперу из любой части кода с помощью макроса указывается количество полуволн генерации звука частотой 500 Гц.
   Однако с учётом наличия прерывания 18 750 Гц - вполне возможно указывать не только длительность, но и частоту.
   С учётом достаточного запаса по ПЗУ - вполне возможно организовать модуль вывода звука на манер ЛЦД - описывая строки из частот/длительностей/пауз, позволяющие издавать более сложные звуки из различных участков кода - пока не реализовано.
   С учётом что постоянная составляющая вывода динамика сейчас не использована - вполне можно её использовать для вывода 3х состояний 2 шт светодиодов или одного ввода цифрового сигнала - пока не реализовано.
   С учётом наличия достаточного запаса по ПЗУ и свободных CCP модулей, позволяющих генерировать ШИМ 8 бит частотой 187 КГц и 10 бит с частотой 47 КГц - вполне возможно использовать ШИМ как ЦАП для генерации звука с гармонической или иной огибающей - пока не реализовано.

  Датчики температуры DS1820, протокол 1-Wire.

   Для измерения и контроля температуры в универсальной заготовке было заманчиво использовать цифровые калиброванные датчики DS18B20 - удобный для пайки корпус ТО-92, единственный потребный вывод для обмена данными, возможность подключения большого количества датчиков, невысокая цена за калиброванный на заводе датчик.
   Однако программная реализация протокола 1-Wire оказалась не слишком простой с учётом дружественной многозадачности (принципиальное отсутствие программных задержек/пустых циклов NOP, 15 мкСек=180 команд при 12 МИПс, цикл обмена 1 бита 60 мкСек= 720 команд, есть что экономить, автомат состояний в файле 1-Wire_Task.asm).
   Для генерации микросекундных задержек протокола 1-Wire (например в отличие от НЕ экономящего ресурсы кода AN1199, использующего пустые циклы генерации задержек) используется Таймер 0 и обработчик высоко приоритетных прерываний от Таймера-0 в файле Int_1W.inc.
   Итогом работ стала реализация опроса с контролем CRC большого количества датчиков с известными серийными номерами (занесёнными в таблицу ПЗУ, испытывалось до 32 штук, температуры сохраняются в ОЗУ для обработки в других подсистемах) и режима чтения/отображения серийного номера единственного подключённого датчика. Режим полноценного опроса серийных номеров нескольких подключенных датчиков с хранением их в ОЗУ - не реализован. Платой за подключение модуля 1-Wire является занятость Таймера-0 и необходимость весьма высокой скорости реакции на высоко приоритетные прерывания - в VFD заготовке эти условия выполнены.

  Авто сохранение настроек в EPROM=ЭРПЗУ.

   Возможность наличия в универсальной заготовке регулируемых параметров - предполагала хранение их в имеющемся на борту EPROM. Для удобства использования была написана подсистема, записывающая изменённые значения из ОЗУ в EPROM при установке флага синхронизации в любом месте кода, и записывающая данные из EPROM в ОЗУ при старте системы. Перечень адресов ОЗУ, подлежащих хранению в EPROM - находится в файле EPROM_RegsAdr.inc
   Сейчас использовано ~32 из 256 байт EPROM. Подсистема синтезатора синусоиды полностью описывается менее чем 16 байтами включая пороги защит - возможна организация быстро переключаемых наборов настроек на конкретный мотор в количестве не менее 10 штук.

  Интерфейс пользователя.

   Первоначальной задачей создания первого экземпляра частотника было снижение оборотов сверлильного станка без снижения крутящего момента для использования биметалл коронок большого диаметра. Запуск мотора по подаче питания на штатной частоте - был оговорен заранее для наиболее частого обычного использования станка. При планировке корпуса были установлены 3 кнопки в имеющихся местах макетной платы. Одна из кнопок была назначена на "Реверс", вторая - перебор частот между штатной, запомненной и "стоп", третья - возврат к штатной частоте вращения и "стоп". Для упрощения интерфейсы пользователя - разделены на 2 - рабочий и служебный. Рабочий интерфейс/экран максимально разгружен, енкодер регулирует частоту, короткие нажатия кнопки енкодера игнорируются. Слева в 3 строке выводятся 2 байта счётчиков ошибок (PCPWM_Alarm_Route и ADC_ERR_Counter) и PCPWM_MotorStatus - номер шага автомата состояний мотора. При длительном нажатии на кнопку енкодера - происходит переключение в служебный интерфейс. Верхняя строка указывает номер/наименование/значение регулируемого параметра, содержит признак редактирования или листания параметров. Нижняя строка - настраиваемая из набора (вывод АЦП). 2 и 3 строка служебного интерфейса содержат отладочный вывод амплитуды, состояния, кодов ошибки и прочие отладочные параметры.
   Короткие нажатия на кнопку енкодера в служебном интерфейсе инвертируют бит "листание перечня параметров или редактирование параметра". Оба экрана интерфейсов содержат пустоту в месте вывода часов, выводимых раз в секунду отдельной очередью ЛЦД.

  Автомат состояний мотора.

   Для реализации смены состояний мотора - пришлось написать автомат состояний с переходами между ними, находится в файле SpeedChange.inc
   Значение нажатий кнопок, сохранение скорости при смене режима, подпрограмма аварийной остановки мотора, задержки при смене режимов - обрабатываются автоматом состояний.

  Описание постройки частотника №2