Возможности PID регулятора

Тема в разделе "Arduino & Shields", создана пользователем sanik, 19 дек 2017.

  1. sanik

    sanik Гик

    Подскажите пожалуйста Смогу ли я по примеру приведенному здесь управлять двумя серво с двух разных датчиков ( второй датчик у меня DHT) справиться ли библиотека PID_v1.h с такой задачей? Что нужно для этого предпринять?
    Рассматриваются возможности поочередного управления Например поставив флаги пока обрабатывается один датчик второй бездействует. Или же может такой вариант завести второй регулятор
    Код (C++):
    double Setpoint2, Input2, Output2;
    PID myPID2(&Input2, &Output2, &Setpoint2,1,0.4,90, DIRECT);
    Будет ли работать такой вариант? Если возможно такое объясните пожалуйста что нужно добавить ?
    Код (C++):
    //Автомобильный климат контроль, по принципу управления заслонкой
    //www.bigbarrel.ru
    #include <Servo.h>
    #include <PID_v1.h>//пид регулятор
    #include <OneWire.h>
    #include <DallasTemperature.h>
    #define ONE_WIRE_BUS 4
    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors(&oneWire);
    float tempC;//текущая температура
    float temp_old = 0;//старое значение текущей температуры
    int val; //угол поворота мотора
    int val_old;//старый угол поворота мотора
    Servo myservo;//серво привод
    double Setpoint, Input, Output;//переменные для пид регулятора
    PID myPID(&Input, &Output, &Setpoint,1,0.4,90, DIRECT);//пид регулятор. Очень важно правильно подобрать коэффициенты пид регулятора
    void setup() {
        sensors.begin();
        myPID.SetOutputLimits(1, 255);//устанавливаем пределы для выходного сигнала пид регулятора
        myservo.attach(3,2540,640);//устанавливаем пин управления servo/устанавливаем границы поворота сервы
        val_old=-100;
    }
    int sp(){
        return map(analogRead(1),255,1023,15,27);//читаем положение регулятора температуры(потенциометр)
    }
    void loop() {
        if (digitalRead(1)==HIGH){
            sensors.requestTemperatures();
            tempC =sensors.getTempCByIndex(0); //получаем температуру с датчика
            if (abs(tempC-temp_old)>0.1){
                Input = tempC;
                temp_old=tempC;
            } else {
                Input=temp_old;
            }
            if (Setpoint!=sp()){
                Setpoint=sp();
            }
            myPID.Compute();
            delay(20);
            if (!Output==0.00){
                val=map(Output, 1, 255, 0, 180);
                if (abs(val-val_old)>4){
                    val_old=val;
                    myservo.write(val);//управляем мотором
                    delay(200);
                }
            }else{
                val=val_old;
            }
        } else {
        delay(10000);
        }
    }
     
  2. sanik

    sanik Гик

    Код проверил по второму варианту компилируется но будет ли работать нормально? Проверить не могу пока так как нет ардуинки.:(
     
  3. sanik

    sanik Гик

    Что никому не приходилось делать такое?
     
  4. rkit

    rkit Гуру

    Сможете ли вы - это зависит от вашего навыка программирования. А вообще это возможно.
     
  5. ostrov

    ostrov Гуру

    С данной библиотекой не знаком, PID обычно делаю сам. Но, судя по всему, никто не мешает сделать несколько экземпляров класса, как это обычно делается в таких случаях. И работать они должны независимо и одновременно. Впрочем, гарантировать не могу, результат сильно зависить от кривизны библиотеки.
     
  6. Onkel

    Onkel Гуру

    y diHalt на easyelectronics.ru. есть ПИД для чайников.
     
  7. sanik

    sanik Гик

    А конкретную ссылку на статью можно ?
     
  8. DIYMan

    DIYMan Guest