Я пытаюсь настроить свой Arduino Mega с функциональностью PID. Пример 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);
}
Вот мой код:
#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 Parametersvoid 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
}
абсолютно.
TimerOne
или же
SimpleTime
библиотеки.
Где TimerOne использует прерывание от таймера для выполнения действия в фоновом режиме, а позднее SimpleTime опрашивает время от вызова в основном цикле. Он не потребляет TimerOne.
Один из них будет соответствовать вашим потребностям.
Других решений пока нет …