Plc yerine elektronik kart

Tekrar merhaba, Arduino ile denemeler yaptım sonlara yaklaştım aslında ama millis fonksiyonu ile ilgili sorunlar yaşıyorum. Sıcaklık kontrol ve mekanik çalışmanın aynı anda olması için millis kullandım. Ancak mekanik çalışmada bir işlemde gecikme eklemem gerekiyor. Yine millis ile yapıyorum ama süre millis sürekli işlediği için tam verim alamıyorum. Benim bir sensörümden veri geldikten sonra ben saydırmak istiyorum. Delay kullandığımda da kesme yapıyor. Bu konuda bir fikir verirseniz çok sevinirim.
 
Kütüphaneyi araştırdım ama o da belirli saniyede bir çıkış veriyor. Ben sadece sinyal geldikten sonra saydırmak istiyorum. Farklı bir fonksiyonunu mu kullanmam gerekiyor ?
 
Ben şunu kullanıyorum
örnek kullanım.




Kod:
#include "Ticker.h"

void sayac(); 
Ticker timer1(sayac, 1000);  //1 saniye

void sayac() {}


void setup() {
 timer1.start();
 
 
 
 }
 
 
 void loop() {


timer1.update();



}
 

Ekli dosyalar

  • Ticker-master.zip
    7.5 KB · Görüntüleme: 2
Son düzenleme:
Ben şunu kullanıyorum
örnek kullanım.




Kod:
#include "Ticker.h"

void sayac();
Ticker timer1(sayac, 1000);  //1 saniye

void sayac() {}


void setup() {
timer1.start();



}


void loop() {


timer1.update();



}
Çok teşekkür ederim bu şekilde halloldu problemim. Şu anda tek sorunum pid ile sıcaklık kontrolü. Pid'yi manuel olarak ayarlayabiliyorum. Ama çok stabil olmuyor, birde rezistans değişikliği olduğu zaman tek tek hepsiyle pid denemeleri yapmam gerekecek. Autotuning yaptırmam lazım ama kütüphaneyi çalıştıramıyorum. Bu konuda da bir yol gösterirseniz çok sevinirim.
 
Kod:
#include <PID_v1.h>
#include <PID_AutoTune_v0.h>

byte ATuneModeRemember=2;
double input=80, output=50, setpoint=180;
double kp=2,ki=0.5,kd=2;

double kpmodel=1.5, taup=100, theta[50];
double outputStart=5;
double aTuneStep=50, aTuneNoise=1, aTuneStartValue=100;
unsigned int aTuneLookBack=20;

boolean tuning = false;
unsigned long  modelTime, serialTime;

PID myPID(&input, &output, &setpoint,kp,ki,kd, DIRECT);
PID_ATune aTune(&input, &output);

//set to false to connect to the real world
boolean useSimulation = true;

void setup()
{
  if(useSimulation)
  {
    for(byte i=0;i<50;i++)
    {
      theta[i]=outputStart;
    }
    modelTime = 0;
  }
  //Setup the pid
  myPID.SetMode(AUTOMATIC);

  if(tuning)
  {
    tuning=false;
    changeAutoTune();
    tuning=true;
  }
 
  serialTime = 0;
  Serial.begin(9600);

}

void loop()
{

  unsigned long now = millis();

  if(!useSimulation)
  { //pull the input in from the real world
    input = analogRead(0);
  }
 
  if(tuning)
  {
    byte val = (aTune.Runtime());
    if (val!=0)
    {
      tuning = false;
    }
    if(!tuning)
    { //we're done, set the tuning parameters
      kp = aTune.GetKp();
      ki = aTune.GetKi();
      kd = aTune.GetKd();
      myPID.SetTunings(kp,ki,kd);
      AutoTuneHelper(false);
    }
  }
  else myPID.Compute();
 
  if(useSimulation)
  {
    theta[30]=output;
    if(now>=modelTime)
    {
      modelTime +=100;
      DoModel();
    }
  }
  else
  {
     analogWrite(0,output);
  }
 
  //send-receive with processing if it's time
  if(millis()>serialTime)
  {
    SerialReceive();
    SerialSend();
    serialTime+=500;
  }
}

void changeAutoTune()
{
 if(!tuning)
  {
    //Set the output to the desired starting frequency.
    output=aTuneStartValue;
    aTune.SetNoiseBand(aTuneNoise);
    aTune.SetOutputStep(aTuneStep);
    aTune.SetLookbackSec((int)aTuneLookBack);
    AutoTuneHelper(true);
    tuning = true;
  }
  else
  { //cancel autotune
    aTune.Cancel();
    tuning = false;
    AutoTuneHelper(false);
  }
}

void AutoTuneHelper(boolean start)
{
  if(start)
    ATuneModeRemember = myPID.GetMode();
  else
    myPID.SetMode(ATuneModeRemember);
}


void SerialSend()
{
  Serial.print("setpoint: ");Serial.print(setpoint); Serial.print(" ");
  Serial.print("input: ");Serial.print(input); Serial.print(" ");
  Serial.print("output: ");Serial.print(output); Serial.print(" ");
  if(tuning){
    Serial.println("tuning mode");
  } else {
    Serial.print("kp: ");Serial.print(myPID.GetKp());Serial.print(" ");
    Serial.print("ki: ");Serial.print(myPID.GetKi());Serial.print(" ");
    Serial.print("kd: ");Serial.print(myPID.GetKd());Serial.println();
  }
}

void SerialReceive()
{
  if(Serial.available())
  {
   char b = Serial.read();
   Serial.flush();
   if((b=='1' && !tuning) || (b!='1' && tuning))changeAutoTune();
  }
}

void DoModel()
{
  //cycle the dead time
  for(byte i=0;i<49;i++)
  {
    theta[i] = theta[i+1];
  }
  //compute the input
  input = (kpmodel / taup) *(theta[0]-outputStart) + input*(1-1/taup) + ((float)random(-10,10))/100;

}
 

Ekli dosyalar

  • Arduino-PID-AutoTune-Library-master.zip
    6 KB · Görüntüleme: 0
Yukarıdaki örnek çok güzel şekilde sana istediğini verir. tuning değişkenini periyodik olarak true yapman yeterli.
 
Evet ama bu kütüphaneyi arduino ide ye ekleyemiyorum. Hata veriyor, QuickPID diye ayrı bir tane buldum ondan da verim alamadım.
 
Hata olarak ne veriyor. Bu kitaplık pid_v1 ile birlikte çalışır. Onu da eklemen gerekli
 

Forum istatistikleri

Konular
129,834
Mesajlar
930,595
Kullanıcılar
452,660
Son üye
sari59

Yeni konular

Geri
Üst