C++ 计时器上的Arduino PID

C++ 计时器上的Arduino PID,c++,c,arduino,arduino-ide,C++,C,Arduino,Arduino Ide,我正在尝试使用PID功能配置我的arduino mega。arduino示例启动一个继电器,该继电器根据“毫秒”功能打开和关闭。但是,我想知道是否有可能在定时器调用上设置PID,以便在6分钟后检查传感器读数。基于传感器读数和参数的攻击性;这将打开或关闭继电器。我的问题是,这可以用计时器而不是“毫秒”来完成吗?下面是arduino提供的示例。下面是我炮制的东西。请给出建议。谢谢 #include <PID_v1.h> #define RelayPin 6 //Define Varia

我正在尝试使用PID功能配置我的arduino mega。arduino示例启动一个继电器,该继电器根据“毫秒”功能打开和关闭。但是,我想知道是否有可能在定时器调用上设置PID,以便在6分钟后检查传感器读数。基于传感器读数和参数的攻击性;这将打开或关闭继电器。我的问题是,这可以用计时器而不是“毫秒”来完成吗?下面是arduino提供的示例。下面是我炮制的东西。请给出建议。谢谢

#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);

}
当然。 或 图书馆

其中TimerOne使用来自计时器的中断在后台执行操作,而后面的SimpleTime则通过主循环中的调用轮询时间。它不消耗时间


其中一款适合您的需要。

谢谢您的帮助。我正在使用时间警报库来实现这个。。。我想。如何在digitalWrite命令中包含输出、继电器名称和高或低命令?myPID::delay成员函数会根据继电器应在何时关闭的时间更新&输出。因此,只需将“if(Output#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 }