Подскажите алгоритм

Хорошо, попробую объяснить. На выходе ПИД и прочих регуляторов, не может быть более одного управляющего воздействия. Потому что система будет иметь бесконечное количество решений.
Вот надо мне 13кОм получить. Есть два резистора на 10 и на 5кОм.
Решения:
8 и 5
9 и 4
10 и 3
11 и 2
11.001 и 1.999кОм

Какое регулятору выбрать?
Вы не понимаете, видимо, о чём сами говорите. Либо не правильно формулируете.

Да нет никаких в электронике и программировании менее точных и более точных переменных. Переменная либо содержит нужное значение либо не содержит.
Что за “узлы регулировки”? Они не могут ведь регулировать одну нагрузку вместе.

Где я об этом говорил?

В картинках, может понятнее будет

Это физические резисторы. А речь вроде как о электронных или виртуальных.
Пока не объясните общюю картину, толку не будет. Сколько нагрузок? Откуда идёт задание мощности? Что является целью регулирования?
Вот простой терморегулятор. Цель: температура, выход управляет подводимой мощностью ТЭНа, вход:датчик температуры.
Что у Вас является заданием и что выходом?

Вопрос изначально другой.
Вот пример: ТЗ - функция на С++ → На вход функции приходит два значение 1. POWER текущая измеренная мощность. 2. NPOWER необходимая мощность. На выход функция должна передать переменную MAJORSTEP со значение 0…255, отвечающая за подводимую текущую мощность, где 0 - Максимальная мощность на выходе, 255 - минимальная. Соответственно прямая зависимость POWER от MAJORSTEP. Второй параметр MINORSTEP можно даже опустить, поскольку он участвует в работе уже после того, как эта функция выровняет подаваемую и измеренную мощность.
Я делал как: Уменьшал шагами MAJORSTEP, (первым регулировочным резистором) пока не доходил до нужной мощности, и когда ± 1 шаг регулировки совпал, выходил из неё, и поддерживал нужную мощность уже переменной MINORSTEP, которая изначально равна 128, и ± она уже просто поддерживает нужную мощность, её шаги слабо влияют на выходную мощностью (как многооборотный подстроечный резистор).
Мне посоветовали PID регулятор. Вот с ним и ковыряюсь. Но пока не очень. Уж больно синусоида у него, как вкл/выкл и коэффициенты никак не подберу, резко он очень повышает и понижает. А если ограничить его сильно, то получается калибровка медленней моей.

Если нужна автоматическая регулировка, то пресловутый MINORSTEP не нужен. Всё равно процесс регулирования происходит постоянно ввиду неидеальности питающих напряжений, ветра, дождя, радиочастиц наконец и теплового шума.
Что мешает взять MAJORSTEP не 0-255, а 0-1024 например? Я так понимаю в разрядности данных проблема.

Таким образом когда система достигла равновесия, мы этой самой MINORSTEP начинаем её вновь “раскачивать”. В чём логика?

А это уже вопрос подбора коэффициентов и применимости конкретного регулятора в принципе. На термостат ПИД хорош, на управление ракетой какой-нибудь аппарат нечёткой логики нужен, а где-то просто “вкл-выкл” достаточно. Что у Вас там за агрегат неизвестно. Какая инерционность, время отклика, какие возмущающие факторы?

Она её там достигнет в редких случаях, поскольку большой шаг регулировки мощности. А MINOR как раз добьёт тютелька в тютельку. Тут уж PID излишен.

Мне удобней работать с двуми, чем соединять и разбирать их постоянно. Железо 8бит.

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

Просто надо настроить хорошо и будет счастье.
Что вообще эта система из себя представляет физически?

Ну так сделайте из двух 8бит один 16бит. В чем проблема?

Не пойму, зачем тут какие-то сложности. Как по мне здесь даже PID не нужен ИМХО.

Речь то идёт об измерении и установке потребляемой мощности, какая здесь инерционность? Это же не температура, к примеру. Инерционность только в измерениях, в обратной связи.

Есль регулятор, скажем ШИМ. Задаём нужное значение npower, и вперёд. Дальше автоматически, если больше измеряемого - по чуть-чуть уменьшаем, и , наоборот.Плавать будет по-любому,сеть ведь не стабилизирована, поэтому автоподстройка малым шагом необходима

к примеру, упрощённо.

Необходимо установить мощность npower = 831.

Значит, к примеру

 StepMajor = npower/10;//83
 StepMinor = npower % 10;//1

Измерили мощность - сравнили, автокоррекция

 if(npower< power)
 StepMinor -= step;
    
 if(npower > power)
  StepMinor += step;

Где
npower - заданная мощность
power - значение измерения

Можно сделать полную автокоррекцию - если разница power - npower больше 10, StepMajor += step(или -=)

1 лайк

Да, выкинул его. Решил всё сделать на конечных автоматах. Очищаю по биту в StepMajor, пока мощность не станет выше установленной, затем ставлю биты, после последнего снятого, пока мощность не станет ниже установленной, тем самым нашёл диапазон, и уже по одному шагу тяну ближе всего к нужной мощности. Выглядит уже симпатично.

    enum class powerful {ADJUST, UP, DOWN, FIND, COMPLETE};
    powerful powerState;

    if (powerState < powerful::COMPLETE){
      PowerCalc += power;
      if (abs(power - npower) <= POWER_DELTA) {
        powerState = powerful::COMPLETE;
        Step = 3;
      } else if (power > npower){
        ((resetBit == 1) || (powerState == powerful::FIND) ? powerState = powerful::COMPLETE : powerState = powerful::DOWN);
      } else if ((power < npower) && (powerState == powerful::DOWN)) {
        powerState = powerful::FIND;
      }
      if(Step++ == 3){
        PowerCalc /= 3; 
        switch (powerState)
          {
          case powerful::ADJUST:
            StepMajor <<= 1;
            resetBit++;
            break;

          case powerful::DOWN:
            resetBit--;
            bitSet(StepMajor, resetBit-1);
            break;

          case powerful::FIND:
            StepMajor--;
            break;

          case powerful::COMPLETE:
            Serial.println("Adjust complete");
            break;
          
          default:
            break;
          }
        Step = 1;
        PowerCalc = 0;
        }
        /// Меняем мощность
1 лайк

Прикольно. PID делает почти то же самое, только строчек меньше.

1 лайк

Подскажите как реализовать ШИМ на ардуино, но чтобы время импульса было примерно 5 секунд с периодом 7 секунд и параллельно можно было бы считывать информацию с потенциометра, подключенного к аналоговому пину

видимо такой ШИМ будет называться ногодрыг через миллис.

Ещё как вариант - На Timer1 по секунде отсчитывать, и, когда надо, в прерывании, ногой дёргать

2 лайка