Arduino PID на таймер

0

Я пытаюсь настроить my arduino mega с помощью функции PID. Пример arduino инициирует реле, которое включается и выключается, которое основано на функции "millis". Тем не менее, я хотел бы знать, возможно ли иметь PID для вызова таймера, поэтому после того, как он скажет, что через 6 минут он проверяет показания датчика. Исходя из показаний датчика и насколько агрессивны параметры; это включит или выключит реле. Мой вопрос: может ли это быть сделано с таймерами вместо "миллисов"? Ниже приведен пример ардуино. Ниже, это то, что я придумал. Пожалуйста, дайте совет. Благодарю.

#include <PID_v1.h>
#define RelayPin 6

//Define Variables we'll be connecting to
double Setpoint, Input, Output;

//Specify the links and initial tuning parameters
PID myPID(&Input, &Output, &Setpoint,2,5,1, DIRECT);

int WindowSize = 5000;
unsigned long windowStartTime;
void setup()
{
  windowStartTime = millis();

  //initialize the variables we're linked to
  Setpoint = 100;

  //tell the PID to range between 0 and the full window size
  myPID.SetOutputLimits(0, WindowSize);

  //turn the PID on
  myPID.SetMode(AUTOMATIC);
}

void loop()
{
  Input = analogRead(0);
  myPID.Compute();

  /************************************************
   * turn the output pin on/off based on pid output
   ************************************************/
  if(millis() - windowStartTime>WindowSize)
  { //time to shift the Relay Window
    windowStartTime += WindowSize;
  }
  if(Output < millis() - windowStartTime) digitalWrite(RelayPin,HIGH);
  else digitalWrite(RelayPin,LOW);

}

Вот мой код:

#include "Wire.h"
#include "DS1307RTC.h"
#include "PID_v1.h"
#include "SPI.h"
#include "Time.h"
#include "TimeAlarms.h"

#define RELAY_ON 1
#define RELAY_OFF 0
#define Relay1  2 

int analogChannel0 = 0;
double Setpoint, Input, Output;
double Kp=1, Ki=0.5, Kd=0.25;  //PID Tuning Parameters
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT); //PID Tuning Parameters


void setup() {



     digitalWrite(Relay1, RELAY_ON);

     pinMode(Relay1, OUTPUT);   

Serial.begin(9600);

     Alarm.timerRepeat(360, Pid); 

     Input = analogRead(analogChannel0);
     myPID.SetMode(AUTOMATIC);     //turn the PID on
     Setpoint = 7.0;

     }

void loop() {                           
            Alarm.delay(0); 
            } 


void Pid()
             {
             Input =  analogRead(analogChannel0);              
             myPID.SetTunings(Kp, Ki, Kd);   
             myPID.Compute(); 
             ////FROM HERE I DONT KNOW WHAT TO DO
             } 
Теги:
arduino
arduino-ide

1 ответ

1
Лучший ответ

абсолютно. TimerOne или SimpleTime.

Там, где TimerOne использует прерывание от таймера для выполнения действия в фоновом режиме, а более поздний SimpleTime проверяет время от вызова в основном цикле. Он не использует TimerOne.

Один из них будет соответствовать вашим потребностям.

  • 0
    Спасибо за помощь. Я использую библиотеку TimeAlarms, чтобы добиться этого ... я думаю. Как включить OUTPUT, мое релея и команду HIGH или Low в мою команду digitalWrite?
  • 0
    функция-член myPID :: delay обновляет выход & на время, когда реле должно быть отключено. Следовательно, вам просто нужно поставить "if (Output <millis () - windowStartTime) digitalWrite (RelayPin, HIGH); иначе digitalWrite (RelayPin, LOW);" в конце вашей функции Pid (). Где вы говорите //// ОТ ЗДЕСЬ Я НЕ ЗНАЮ, ЧТО ДЕЛАТЬ.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню