О работе с таблицей (выбор значения)

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

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

Нужно, зная значение одного столбца, выбрать соответствующее значение из другого. Понимаю, что можно использовать тупой перебор либо посредством if() либо switch(). Что быстрее (мнения на просторах Сети разделились)? Пока я ОЧЕНЬ не силен, но уверен, что есть другой, более эффективный способ выборки. Если можно объяснить это в двух словах - пожалуйста, объясните. Но еще лучше - подскажите, где про такое можно почитать? Но чтобы понятно было чайнику-новичку.

Заранее спасибо!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Sonologist пишет:

где про такое можно почитать? 

Какое, "такое"? Давайте задача внятно. Что значит, "зная значение одного столбца, выбрать соответствующее значение из другого". Чему "соответсвующее"?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

это Вам Вирта почитать

sadman41
Offline
Зарегистрирован: 19.10.2016

Можно и не Вирта, а про массивы (в том числе и многомерные).

negavoid
Offline
Зарегистрирован: 09.07.2016

Идеально подошли бы ассоциативные массивы, но в си я не силён, не знаю, есть ли.

// таблица значений
$arr = [
  "left_val1" => "right_val1",
  "left_val2" => "right_val2",
  // .....
];

// взять значение
$got_value = $arr[ "left_val37" ];

 

sadman41
Offline
Зарегистрирован: 19.10.2016

В Си - нет (я искал).

b707
Offline
Зарегистрирован: 26.05.2017

negavoid пишет:

Идеально подошли бы ассоциативные массивы

с учетом их внутренней реализации (хеш-функция, если не ошибаюсь) - для 100 значений "тупой перебор" не сильно проиграет

Если же исходные значения (так сказать ось Х) распределены равномерно, то можно обойтись простым массивом

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Похоже, я один не понял, что нужно ТС :( Тупею :(

SLKH
Offline
Зарегистрирован: 17.08.2015

Sonologist пишет:

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

Нужно, зная значение одного столбца, выбрать соответствующее значение из другого. Понимаю, что можно использовать тупой перебор либо посредством if() либо switch(). Что быстрее (мнения на просторах Сети разделились)? Пока я ОЧЕНЬ не силен, но уверен, что есть другой, более эффективный способ выборки. Если можно объяснить это в двух словах - пожалуйста, объясните. Но еще лучше - подскажите, где про такое можно почитать? Но чтобы понятно было чайнику-новичку.

Заранее спасибо!

Мне, как чайнику-новичку, вообще ни хрена не понятно: что такое "зная значение одного столбца, выбрать соответствующее значение из другого" ?

Можешь написать пример: 5 - 10 строк и 2 столбца?

sadman41
Offline
Зарегистрирован: 19.10.2016

ЕвгенийП пишет:

Похоже, я один не понял, что нужно ТС :( Тупею :(

Вам-то хорошо - Вы только сейчас начали, а я вот давно уже :(( Как на форум попал, так и чуствую, что отравляюсь оглупляющими вопросами.

sadman41
Offline
Зарегистрирован: 19.10.2016

SLKH пишет:

Мне, как чайнику-новичку, вообще ни хрена не понятно: что такое "зная значение одного столбца, выбрать соответствующее значение из другого" ?

complexArray[] = {
{0, 880}
{1, 321}
{2, 439}
...
{82, 953}
}
...
x = 2;
y = complexArray[x][1];
....

 

b707
Offline
Зарегистрирован: 26.05.2017

Sonologist пишет:

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

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

Можно еще построить простенький "рабоче-крестьянский" индекс, например разделить 100 значений на 10 "десятков", первые значения десятков вынести в отдельный массив и искать сначала по ним. Это в теории должно ускорить поиск впятеро, но требует предварительной работы и расходует память.

Хотя для 100 значений все это не слишком актуально

sadman41
Offline
Зарегистрирован: 19.10.2016

Можно и бинарный поиск применить, канеш, но к способу хранения это отношения не имеет ))

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

b707 пишет:

"Тупой перебор" можно сделать чуть менее тупым. если исходный массив отсортировать по возрастанию. 

Тем более, что стандартная реализация qsort - она искаропки есть, грех не пользоваться при необходимости. Из одного проекта:

//----------------------------------------------------------------------------------------------------------------
#include <stdlib.h>
//----------------------------------------------------------------------------------------------------------------
struct CompassCompare
{
  uint16_t count;
  CompassPoints point;

  CompassCompare()
  {
    point = cpUnknown;
    count = 0;
  }
  
  CompassCompare(CompassPoints d, uint16_t c)
  {
    point = d;
    count = c;
  }

  bool operator < (const CompassCompare& rhs)
  {
    return count < rhs.count;
  }

  bool operator > (const CompassCompare& rhs)
  {
    return count > rhs.count;
  }

  bool operator == (const CompassCompare& rhs)
  {
    return count == rhs.count;
  }
    
};
//----------------------------------------------------------------------------------------------------------------
int sort_desc(const void *cmp1, const void *cmp2)
{
  CompassCompare a = *((CompassCompare *)cmp1);
  CompassCompare b = *((CompassCompare *)cmp2);

  return a > b ? -1 : (a < b ? 1 : 0);
}
//----------------------------------------------------------------------------------------------------------------
  CompassCompare comp[4];
  comp[0] = CompassCompare(cpEast,eastCount);
  comp[1] = CompassCompare(cpWest,westCount);
  comp[2] = CompassCompare(cpNorth,northCount);
  comp[3] = CompassCompare(cpSouth,southCount);

  qsort(comp,4,sizeof(CompassCompare),sort_desc); 

  result = comp[0].point;

Тупое, быстрое и удобное получение направления с компаса по максимальному кол-ву хитов с датчика. Было лень делать по другому :)))

nik182
Offline
Зарегистрирован: 04.05.2015

Мне показалось, или один столбец линейно растущий? А выбирать надо из второго столбца первый или из первого второй? Если по первому, растущему, то какие проблемы просто по значению индекс построить? 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

У Березовского докторская на подобную тему :)

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Всего 100 значений,а не 100000. Просто перебор, без сортировки, поисков, хешей и индексов. Не нужно с ума сходить. 16 Мгц нам для каких-то целей нужно же использовать? ;))

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

wdrakula пишет:

Всего 100 значений,а не 100000. Просто перебор, без сортировки, поисков, хешей и индексов. Не нужно с ума сходить. 16 Мгц нам для каких-то целей нужно же использовать? ;))

Согласен один if() где-то за 3 такта - первый забросили число, второй забросили переменную, третий - вычли.

Хотя нет - else if должно быть за 2 такта первым забросили переменную, вторым - вычли

sadman41
Offline
Зарегистрирован: 19.10.2016

Могу дать ссылку на онлайн-компилятор в asm. Там можно прямо увидеть скоко тактов avr-gcc назначит. И не гадать.

nik182
Offline
Зарегистрирован: 04.05.2015

И ссылку ещё в тему про прерывания свежую, чтоб человек там увидел какими асмами компилятор единичку в бит регистра пишет. 

sadman41
Offline
Зарегистрирован: 19.10.2016
Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

По экспрессивности дискуссии я понял, что был косноязычен в первом посте. Задача: зная % поставляемой мощности, в нужное время "зажечь" триак. % мощности я устанавливаю сам, потом программно открываю триак. Пытался вывести формулу зависимости - Эксель дает такой бред, что волосы дыбом даже на полной лысине. Отсюда попытка поработать просто с таблицей.

% мощности Время открытия триака (мсек) Время открытия триака (мксек)
0 10 10000
1 9,362 9362
2 9,097 9097
3 8,892 8892
4 8,718 8718
5 8,564 8564
6 8,425 8425
7 8,295 8295
8 8,174 8174
9 8,06 8060
10 7,952 7952
11 7,848 7848
12 7,748 7748
13 7,652 7652
14 7,559 7559
15 7,468 7468
16 7,38 7380
17 7,294 7294
18 7,211 7211
19 7,129 7129
20 7,048 7048
21 6,969 6969
22 6,892 6892
23 6,816 6816
24 6,741 6741
25 6,667 6667
26 6,594 6594
27 6,522 6522
28 6,45 6450
29 6,38 6380
30 6,31 6310
31 6,241 6241
32 6,172 6172
33 6,104 6104
34 6,037 6037
35 5,97 5970
36 5,903 5903
37 5,837 5837
38 5,771 5771
39 5,706 5706
40 5,641 5641
41 5,576 5576
42 5,511 5511
43 5,447 5447
44 5,383 5383
45 5,319 5319
46 5,255 5255
47 5,191 5191
48 5,127 5127
49 5,064 5064
50 5 5000
51 4,936 4936
52 4,873 4873
53 4,809 4809
54 4,745 4745
55 4,681 4681
56 4,617 4617
57 4,553 4553
58 4,489 4489
59 4,424 4424
60 4,359 4359
61 4,294 4294
62 4,229 4229
63 4,163 4163
64 4,097 4097
65 4,03 4030
66 3,963 3963
67 3,896 3896
68 3,828 3828
69 3,759 3759
70 3,69 3690
71 3,62 3620
72 3,55 3550
73 3,478 3478
74 3,406 3406
75 3,333 3333
76 3,259 3259
77 3,184 3184
78 3,108 3108
79 3,031 3031
80 2,952 2952
81 2,871 2871
82 2,789 2789
83 2,706 2706
84 2,62 2620
85 2,532 2532
86 2,441 2441
87 2,348 2348
88 2,252 2252
89 2,152 2152
90 2,048 2048
91 1,94 1940
92 1,826 1826
93 1,705 1705
94 1,575 1575
95 1,436 1436
96 1,282 1282
97 1,108 1108
98 0,903 903
99 0,638 638
100 0 0

Ну, а дальше - второй абзац моего (ТС) поста.

Мужики, не бейте ногами, правда, хочу разобраться...

sadman41
Offline
Зарегистрирован: 19.10.2016

Вангую адский срач... 

SLKH
Offline
Зарегистрирован: 17.08.2015

unsigned int table[] = {10000, 9362, 9097, /*......*/ 903, 638, 0};

byte power;

unsigned int vremyaOtkritiaTriacka;

// *********

 

vremyaOtkritiaTriacka = table[power];

============

Это было нужно?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:

Могу дать ссылку на онлайн-компилятор в asm. 

Зачем, если AVR студия выдаёт ассемблерный файл прямо из коробки, а любимая IDE - если одну единственную опцию компилятору добавить?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

SLKH пишет:

Это было нужно?

Думаю, да :)

sadman41
Offline
Зарегистрирован: 19.10.2016

ЕвгенийП пишет:

Зачем, если AVR студия выдаёт ассемблерный файл прямо из коробки, а любимая IDE - если одну единственную опцию компилятору добавить?

Online-сервисы - тренд нынешнего времени... К тому же там можно просто небольшой фрагмент набить и он не будет загромождён вступлениями и послесловиями - всё чисто по делу.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

sadman41 пишет:

Вангую адский срач... 

Гы - начну, пожалуй. Уважаемый ТС, а нахрена Вы не сказали, что Ваши данные уже отсортированы? Да хрен бы с ним 16Мгц рулит. Пишите программу - обосрем и поможем :)

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

[/quote]

Гы - начну, пожалуй. Уважаемый ТС, а нахрена Вы не сказали, что Ваши данные уже отсортированы? Да хрен бы с ним 16Мгц рулит. Пишите программу - обосрем и поможем :)

[/quote]

Собираюсь писать, НО!

Первые прикидки в смысле "if vs Switch" я озвучил. Нет вопросов, именно этими операторами я вопрос решу, это примитив. Но неужели нет другого, более изящного пути? 

PS: Други, некоторое время буду вне сети, простите, если что полезное - кидайте, как только вернусь - сразу....

nik182
Offline
Зарегистрирован: 04.05.2015

Ну я ж говорил что линейно растуший индекс. #23 точный ответ в одну строку. Что ещё надо для счастливой жизни? 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Sonologist пишет:

[обираюсь писать, НО!

Первые прикидки в смысле "if vs Switch" я озвучил. Нет вопросов, именно этими операторами я вопрос решу, это примитив. Но неужели нет другого, более изящного пути? 

PS: Други, некоторое время буду вне сети, простите, если что полезное - кидайте, как только вернусь - сразу....

А давайте напишем очень простую программу:

1. считываем millis()

2. Проходимся по Вашим данным, сравниванивая с нулем

3. Считываем millis()

Если будет больше секунды -  пишите следующее сообщение сюда.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Sonologist пишет:

Первые прикидки в смысле "if vs Switch" я озвучил. Нет вопросов, именно этими операторами я вопрос решу, это примитив. Но неужели нет другого, более изящного пути? 

Вы троллите? Вам же дали решение в одну ("о д н у !!!") строку в #23. Чего Вам ещё-то надо?

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Никто никого не троллит. Это всем вам, гуру, с первого взгляда все понятно. А я #23 должен был "пережевать, проглотить и прислушаться к ощущениям". Теперь допёр, что это то, что нужно. Всем спасибо! 

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

SLKH пишет:

Это было нужно?

Да! Спасибо!!!!

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Прописал маленький скетч по примеру #23 (еще раз мерси!) - все работает. 

      //АРДУИНО UNO Пока просто в цикле перебирает значение доли мощности от 0 до 100% и выдает соответствующее значение задержки.

unsigned int table[] = {10000, 9362, 9097, 8892, 8718, 8564, 8425, 8295, 8174, 8060, 7952, 7848, 7748, 7652, 7559, 7468, 7380, 7294, 7211, 7129, 7048, 6969, 6892, 6816, 6741, 6667, 6594, 6522, 6450, 6380, 6310, 6241, 6172, 6104, 6037, 5970, 5903, 5837, 5771, 5706, 5641, 5576, 5511, 5447, 5383, 5319, 5255, 5191, 5127, 5064, 5000, 4936, 4873, 4809, 4745, 4681, 4617, 4553, 4489, 4424, 4359, 4294, 4229, 4163, 4097, 4030, 3963, 3896, 3828, 3759, 3690, 3620, 3550, 3478, 3406, 3333, 3259, 3184, 3108, 3031, 2952, 2871, 2789, 2706, 2620, 2532, 2441, 2348, 2252, 2152, 2048, 1940, 1826, 1705, 1575, 1436, 1282, 1108, 903, 638, 0 };
byte power;
unsigned int latency;
void setup()
{
  Serial.begin(115200);
}
void loop ()
{
  for (power==0;power<101;power++)
  {
    delay (100);
    latency=table[power];
    Serial.print(power);
    Serial.print("   ");
    Serial.println(latency);
  }
}

 

Далее - сделаю прерывание по переходу напряжения через ноль и буду управлять устройством. 

Еще маленький вопрос: как приучить себя не забывать ставить в конце строки ";"?  Уже год пытаюсь писать программы, но то и дело забываю это сделать... :(

 

Green
Offline
Зарегистрирован: 01.10.2015

Да уж. Если бы только ;... for (power === 0; power < sizeof(table) / sizeof(table[0]); power++)

SLKH
Offline
Зарегистрирован: 17.08.2015

Sonologist пишет:

и буду управлять устройством. 

Сильно сомневаюсь, что для управления устройством действительно нужна дискретность 1/100.

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

SLKH пишет:

Сильно сомневаюсь, что для управления устройством действительно нужна дискретность 1/100.

Да конечно, не нужна :)  Это просто скетч для пробы выдергивания из таблицы нужного числа. Это же готовое соотношение мощности и времени открытия  силового элемента. Теперь нет нужды пересчитывать мощность в напряжение и обратно. Задал нужную долю мощности и пусть себе работает: определили прерыванием зерокросс, отсчитали время, открыли триак. На следующем зерокроссе он сам заткнется, и процесс повторится.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

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

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

DetSimen пишет:

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

Это не тайна, называется "по Брезенхейму". Есть момент: при слабой сети, если нагрузка большая (а у меня предполагается в максимуме 4500вт) такой прием вызывает мигание ламп. Увы, проверено. Помехи меня беспокоят меньше: опыт показал, что при работе фазо-импульсного регулятора домашняя техника никак не реагирует. Что касается пропуска полупериодов - есть алгоритм, когда пропуск происходит не, скажем, 50/50 полупериодов, 1/1 и т.д. Это если надо подать половинную мощность (ну и соответственно, в зависимости от других долей мощности). Однако высчитывание дробных значений типа 17% мощности или, там, 81%... Целая история с географией. Есть формулы расчета угла открытия триака в зависимости от мощности, но тут опять надо пересчитывать угол в длительность задержки. А вышепрведенная таблица все упрощает. Особенно, если не высчитывать TRMS напряжения на нагрузке, а сразу применить микросхему, напрмер ADE7757, то можно не заморачиваться расчетами-перерасчетами, а сразу получать информацию о мощности и по обратной связи корректировать ее временем открытия триака. Или, на крайняк - какой-нибудь TRMS->DC, например, LTX1966. Тут, правда, надо пересчитать напругу в мощность, но это даже не интересно, до того просто.

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Кстати, вот если бы кто дал ссылочку на "правильный" алгоритм пропуска полупериодов... Я имею ввиду нечто вроде "50%=1:1, 33% - 1:2,  25%=1:3" и т.д. Но хотя бы с разблюдовкой от 0 до 100%. Пока не нашел, а то интересно было бы поэкспериментировать и с этим.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

если взять 100 поупериодов за основу, то пропуск 1 полупериода даст видимо 1%

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Sonologist пишет:

Кстати, вот если бы кто дал ссылочку на "правильный" алгоритм пропуска полупериодов... Я имею ввиду нечто вроде "50%=1:1, 33% - 1:2,  25%=1:3" и т.д. Но хотя бы с разблюдовкой от 0 до 100%. Пока не нашел, а то интересно было бы поэкспериментировать и с этим.

Это теоретически невозможно, лишь 0% всех действительных чисел можно представить числами рациональными.

Но если нужно не "от 0 до 100%", а с некоторым фиксированным шагом (например, 1%), то начинаем с дроби вида M/N, затем находим для M и N наибольший общий делитель и сокращаем.

Т.е. получется последовательность вида: 0, 1/100, 1/50, 3/100, 1/25, 1/20, 3/50, 7/100, 2/25, 9/100, 1/10, 11/100...

nik182
Offline
Зарегистрирован: 04.05.2015

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

На форуме тема была http://arduino.ru/forum/programmirovanie/algoritm-ravnomernogo-raspredeleniya#comment-83725

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

nik182 пишет:

На форуме тема была

 Я там был. Но по причине слабости подготовки так и не понял, за что отвечают переменные reg, zad и er.

//управление симистором
02 void ResOut(){
03   delay(1);// задержка о которой я писал
04   reg = zad + er;
05   if (reg < 50){
06     out=0;
07     er = reg ;
08   }
09   else {
10     out=1;
11     er=reg-100;
12     }
13  digitalWrite(13,out);
14  }

 

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

andriano пишет:

затем находим для M и N наибольший общий делитель и сокращаем.

Это понятно (чистая арифметика). Другой вопрос, что в части этих дробей будет та самая "цветомузыка". А это неприятно.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Я имелл ввиду не лампочки, где пропуск полупериодов критичен, а, например, тэны. Прошу пращенья, что влез спахмелья. 

nik182
Offline
Зарегистрирован: 04.05.2015

Мощные тэны влияют на лампочки при плохой проводке. Во всяком случае у меня дома я экспериментировал на 2 кВт чайнике. Этого лампочкам хватало. Когда померял напряжение, оказалось что скачет на 7 вольт. А разницу 220 и 213 лампочки чуяли так, что глазом было видно. А другой проводки нет. За давностью дома все кабель каналы забиты мусором и новый кабель до щитка протянуть проблемно. 

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

DetSimen пишет:

Я имел ввиду не лампочки, где пропуск полупериодов критичен, а, например, тэны. Прошу пращенья, что влез спахмелья. 

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

Мое первое устройство (ШИМ-полевик-мост) так и не заработало: пёрла такая наводка, что Ардуино моментально сходила с ума. Причем победить это никаким экранированием, ферритовыми кольцами и прочими способами так и не удалось.

Второе устройство (на пропуске периодов) вызывало "цветомузыку" по всему участку, обеспеченному одной фазой.

Сейчас без "видимых" последствий и неприятных эффектов работает регулятор на РМ-2 (https://akip.com.ua/instructions/instr_RM-2.pdf). Штука работоспособная, но в настройке и управлении не очень удобная (ползание по меню с помощью кнопок). Сначала управление РМ-2 я сделал на Ардуино (зашунтировал тактовые кнопки оптронами 4N25). Все работает, управлять стало намного удобнее: указал нужную мощность,  пересчитал напряжение и определенное количество раз помигал оптронами. Сейчас хочу функцию этого регулятора полностью возложить на Ардуино. То, что ссылок на такую задачу вагон знаю, большое количество их изучил. Но хочу сделать сам. В первую очередь - для того, чтобы научиться хоть чему-нибудь, а не просто копипаст. Таблица, о которой я вел речь, удобна тем, что это готовый способ организовать обратную связь именно по мощности. Читать ее можно прямо с ТЭНа, но вот пока до конца не уразмел, как это сделать поизящнее и при этом с гальванической развязкой. Трансформатор, мнится мне, не подойдет: на ТЭНе синусоида в виде огрызков с крутыми фронтами, неизвестно, что он выдаст. Вернее, не силен в электрике, не знаю. Наверное, выход - линейный оптрон, но они с конской ценой. Так что, думаю пока... 

Pyotr
Offline
Зарегистрирован: 12.03.2014

Могу предложить простую схему ФИУ симистором с детектором нуля в самой схеме. Управляется ШИМ. Правда линейность не очень, но если есть обратная связь, то норм. Только схема на бумаге, поэтому сразу не выкладываю - мож не надо.