Попробуем рассмотреть вопрос создания измерительных приборов с нелинейной шкалой на Arduino, на примере ВАТТ-КСВ-метра.
Казалось бы все просто, ведь у Arduino есть АЦП, который сможет измерить напряжение и выдать нам нужную цифру на экран или индикатор. Но в действительности все не так уж и просто.
Даже при первом взгляде на шкалу обычного измерителя мощности или обычного вольтметра переменного тока, мы заметим, что измерительная шкала у него не линейная. И связано это как с особенностями входных цепей измерительного устройства, так и с тем, что нам надо преобразовывать (детектировать) переменное напряжение в постоянное, которое и в состоянии показать измерительная головка прибора. Попробуем разобрать способ создания и калибровки измерительных приборов с нелинейной шкалой, на примере КСВ-Ватт-Метра. Ведь тут нам необходимо будет измерять как раз такие величины.
Тут у нас и начинается самое интересное. Как же нам правильно измерять мощность в нашем устройстве?
Пусть мы сконструировали датчик прямой и отраженной мощности. Причем для нас не важно, по какой схеме вы его собрали. Лишь бы на выходе измерительной части было напряжение, достаточное для измерения с помощью АЦП Arduino (желательно иметь максимальное напряжение не ниже 5 вольт).
Ну и первая сложность, это то, что, Arduino измеряет напряжение. А мощность, как мы знаем из школьного курса физики, находится по формуле:

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

Где U — это измеренное нами напряжение на входе Arduino, а A, B и C — соответствующие коэффициенты, описывающие реально получившуюся у нас систему измерения.
Мы надеемся, что за счет коэффициентов этого уравнения, мы сможем компенсировать все неоднородности и перекосы получившейся у нас измерительной схемы.
В теории вроде все понятно, но как описать получившуюся систему на практике?
С помощью измерительных приборов вряд ли вы сможете вычислить эти коэффициенты. Но на самом деле нам этого и не нужно. Пусть Arduino поможет нам снять мерки с получившейся у нас измерительной системы.
Для этого нам необходимо подключить наш измеритель к нагрузке с заведомо известным КСВ, желательно, если это будет стандартная радиолюбительская 50-омная нагрузка, с КСВ=1.
После чего, либо используем «специальные режимы» имеющегося скетча, либо берем пример из библиотеки Arduino, который выводит нам значения на аналоговом входе, к которому подключена наша измерительная система. Все что нам нужно, это увидеть, какие фактические значения попадают к нам на аналоговый вход Arduino.
Так как наша измерительная система может выдавать на выходе значения напряжения превышающие максимальный порог в 5 вольт, рекомендую на входе Arduino установить потенциометр (подстроечный резистор), чтобы «вогнать» измеряемые параметры в рамки возможностей АЦП Arduino.
Для этого, в нашем примере (измерение мощности), нам необходимо, выставить на трансивере максимальную мощность (например 100 ватт) и с помощью потенциометра на входе Arduino выставить измеряемые значения в районе 800-900 единиц. Максимальное измеряемое значение может быть 1023, поэтому не будем лишний раз перегружать вход микроконтроллера, а оставим небольшой запас по измерению мощности выше нынешней.
Таким образом мы «растянули» наш диапазон измеряемой величины на достаточную «ширину» будущей шкалы измерений. Теперь нужно как-то эту шкалу отградуировать.
Для этого делаем несколько замеров показаний входного напряжения на АЦП Arduino, для мощностей в 0, 5, 10, 20, 30, 50, 75, 100 ватт (чем больше точек измерений у вас будет, тем точнее получится откалибровать наш прибор). Не забывая при этом записывать показания выдаваемые Arduino.
Мы не будем вникать в различные математические методы, которые позволят нам из нашего набора данных получить искомые коэффициенты, мы просто воспользуемся MS Excel. Надеюсь пакет программ MS Office на вашем компьютере найдется. Открываем его и заносим наши данные вот в такую табличку.

Теперь выделяем получившуюся таблицу с данными и вставляем на лист точечную диаграмму, через ленту команд «Вставка».

На получившемся графике жмем правой кнопкой мышки и добавляем линию тренда.

Настраиваем нужные нам параметры — «Полиномиальная 2-й степени», «Показывать уравнение на диаграмме» и «достоверность аппроксимации».

В результате вы получите примерно вот такой график.

На нем виден график по результатам снятым нами с устройства данным (толстая линия с точками) и тонкой черной линией обозначен график функции, которая описывает наш набор данных.
На графике вы видите в формуле коэффициенты функции до 6 знаков после запятой. Это связано с тем, что измеряемые Arduino данные лежат в пределах от 0 до 1000, а 1000 в квадрате даст нам 1 000 000. А мы хотим иметь точность измерения в единицы ватт, поэтому и коэффициенты функции, по количеству значащих цифр, должны соответствовать входным данным.
Для того, чтобы получить такое отображение коэффициентов функции, необходимо нажав правой кнопкой на формуле, выбрать пункт «Формат подписи линии тренда» и в появившемся окне указать нужную нам точность.

Полученные коэффициенты теперь необходимо прописать в скетч нашего измерителя. Скомпилировать и загрузить в Arduino.
Измерительный прибор Готов!
Таким образом мы получили математическое описание сделанной нами системы измерения подручными средствами. Причем мы сразу учли все недостатки и нелинейности нашей как измерительной, так и детектирующей системы, заменив тем самым сложные электронные преобразования математикой, не мучаясь с подбором значений элементов схемы и режимов их работы.
Но есть и еще один плюс в нашем с вами подходе к калибровке таких измерительных устройств.
Если у трансивер выдает мощность до 100 ватт, а вам хотелось бы сделать измеритель мощности и КСВ для своего усилителя, на выходе которого целых 500 ватт. То мы можем математически расширить шкалу нашего измерительного прибора.
Если вы согласны мириться с некоторой погрешностью, то можно пойти следующим способом.Раз у нас мощность, которую мы хотим измерять, превышает имеющуюся для калибровки в 5 раз, значит напряжение на входе Arduino будет примерно в 2.5 раза выше. Ну и нам необходимо будет с помощью потенциометра установить уровень измеряемого сигнала, при подведенных 100 ваттах, до уровня примерно в 400 единиц. После чего провести всю вышеописанную процедуру по снятию показаний с аналогового входа АЦП Arduino и построению получившегося графика.
Чтобы оценить получившуюся систему измерения, нам необходимо построить прогноз для нашей измерительной системы на больший предел измерений. Для этого нажав правой кнопкой мыши на линии тренда, выбираем пункт «Формат линии тренда».

Вписываем в разделе «Прогноз», в поле «Вперед» значение 600 периодов (400+600=1000, что близко к пределу измерения АЦП Arduino). Получаем вот такой график нашей измерительной системы.

Как видите, в данном варианте, при максимальном входном напряжении на АЦП Arduino, мы сможем измерять мощность около 800 ватт. Понятно, что погрешность на высоких мощностях будет выше, чем на откалиброванном участке, но при таких мощностях +/- 10-20 ватт наверняка для вас не будут столь уж критичны, ведь в случае КСВ-Ватт-метра, для нас важны не сами значения, а динамика их изменений, с чем наша система должна справится.
Для тех, кто совсем не дружит с MS Excel, можно скачать готовый шаблон с графиком ОТСЮДА.