Arduino PID на таймер

Я пытаюсь настроить свой 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
}

0

Решение

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

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector