Universal Havya Kontrolcüsü Tasarımı

Lineerlik konusuna çok takılmıyorum. Her bir cihaz için Lookup table yapıp kendü üzerindeki flash belleğe yazacak bir otomatik çözüm geliştirmek çok sorun olmaz. Ayrıca SDK'nın kendi içerisinde referans voltajına bakarak ADC'yi karakterize eden ve sonra calibre edilmiş değer döndüren birer fonksiyon var. Fena sonuç vermiyorlar. .

Asıl sorun ofset konusu gibi. Benim de aklıma ilk opmamp geldi ama daha pratik birşey olsa o da güzel olurdu.
 
Lineerlik konusuna çok takılmıyorum. Her bir cihaz için Lookup table yapıp kendü üzerindeki flash belleğe yazacak bir otomatik çözüm geliştirmek çok sorun olmaz. Ayrıca SDK'nın kendi içerisinde referans voltajına bakarak ADC'yi karakterize eden ve sonra calibre edilmiş değer döndüren birer fonksiyon var. Fena sonuç vermiyorlar. .

DAC'ın lineerliği nasıl ölçtün mü? Eğer o daha iyi ise loopback şeklinde ADC otomatik olarak karakterize edilebilir.
 
o.c. yaptıkça bu adc süresi kısalıyor.
pll sabit bölemiyor olabilir 133'de çalışırken 48 alıyor olabilir pll defauld olarak 133 ayarlı diye biliyorum.
ADC süresi mi kısalıyor Arduino core'unun yardımcı fonksiyonları mı hızlanıyor? İkincisi olabilir. O sitedeki kodu bir dene bence.
 
OP-AMP'a geri dönüm.
OP-AMP'a güzel bir yazılımsal kalibrasyon yaparsam op-amp ile bitiririz.
 
C++:
float       adc   = 0.0;
const float cpu_v = 3.30;
const int max_adc = 4096;
float       adc_v = 0.0;
float           c = 0.0;

const int numReadings = 25;
int readings[numReadings];
int readIndex         = 0;           
int total             = 0;               
float average         = 0;


void setup() {
  Serial.begin(115200);
  analogReadResolution(12);
  pinMode(A0, INPUT);
  analogWriteResolution(16);
  pinMode(0, OUTPUT_8MA);


  for (int thisReading = 0; thisReading < numReadings; thisReading++) {
    readings[thisReading] = 0;
  }
}

void loop() {

  if(digitalRead(0) == LOW){
    total = total - readings[readIndex];
    readings[readIndex] = analogRead(A0);
    total = total + readings[readIndex];
    readIndex = readIndex + 1;
    if (readIndex >= numReadings) {
      readIndex = 0;
    }
    average = total / numReadings;
    adc_v = average * (cpu_v / max_adc);
    c = adc_v * 308, 32;
    c = c - 7,6;//KALBRASYON -
    c = c + 0; //KALIBRASYON +
    Serial.println(c);
}
 

    PID();
}

float mn     = 0;    //MIN PWM COUNT
float mx     = 54000;//MAX PWM COUNT
float lTime  = 0;
float errSum = 0;
float lErr   = 0;

float Kp = 70;//P
float Ki = 12;//I
float Kd = 66;//D

void PID() {
  unsigned long now = millis();
  int32_t timeChange = (int32_t)(now - lTime);
  float error = 186 - c;//set değişkeni buraya girecek
  errSum += error * timeChange;
  errSum = constrain(errSum, mn * 1.1, mx * 1.1);
  float dErr = (error - lErr) / timeChange;
  float newOutput = (Kp * error + Ki * errSum + Kd * dErr);
  float output = constrain(newOutput, mn, mx);
   analogWriteFreq(100);
   analogWrite(0, output);
}

Final programımız bu.
Elinde imkanı olanlar LM358 ile kurup deneyebilir mi acaba?
Bende harika çalışıyor diyemem ama farklı bir ortamda farklı birinin elinde ne sonuçlar verecek ona göre gideceğim.
Programın bu hali her türlü denetleyici ile çalışır.
 
Son düzenleme:
C++:
float       adc   = 0.0;
const float cpu_v = 3.30;
const int max_adc = 4096;
float       adc_v = 0.0;
float           c = 0.0;

const int numReadings = 25;
int readings[numReadings];
int readIndex         = 0;           
int total             = 0;               
float average         = 0;


void setup() {
  Serial.begin(115200);
  analogReadResolution(12);
  pinMode(A0, INPUT);
  analogWriteResolution(16);
  pinMode(0, OUTPUT_8MA);


  for (int thisReading = 0; thisReading < numReadings; thisReading++) {
    readings[thisReading] = 0;
  }
}

void loop() {

  if(digitalRead(0) == LOW){
    total = total - readings[readIndex];
    readings[readIndex] = analogRead(A0);
    total = total + readings[readIndex];
    readIndex = readIndex + 1;
    if (readIndex >= numReadings) {
      readIndex = 0;
    }
    average = total / numReadings;
    adc_v = average * (cpu_v / max_adc);
    c = adc_v * 308, 32;
    c = c - 7,6;//KALBRASYON -
    c = c + 0; //KALIBRASYON +
    Serial.println(c);
}
 

    PID();
}

float mn     = 0;    //MIN PWM COUNT
float mx     = 54000;//MAX PWM COUNT
float lTime  = 0;
float errSum = 0;
float lErr   = 0;

float Kp = 70;//P
float Ki = 12;//I
float Kd = 66;//D

void PID() {
  unsigned long now = millis();
  int32_t timeChange = (int32_t)(now - lTime);
  float error = 186 - c;//set değişkeni buraya girecek
  errSum += error * timeChange;
  errSum = constrain(errSum, mn * 1.1, mx * 1.1);
  float dErr = (error - lErr) / timeChange;
  float newOutput = (Kp * error + Ki * errSum + Kd * dErr);
  float output = constrain(newOutput, mn, mx);
   analogWriteFreq(100);
   analogWrite(0, output);
}

Final programımız bu.
Elinde imkanı olanlar LM358 ile kurup deneyebilir mi acaba?
Bende harika çalışıyor diyemem ama farklı bir ortamda farklı birinin elinde ne sonuçlar verecek ona göre gideceğim.
Programın bu hali her türlü denetleyici ile çalışır.
Denemek için uç şart dimi? Bende uç yok. Olsadenerdim
 
C++:
float       adc   = 0.0;
const float cpu_v = 3.30;
const int max_adc = 4096;
float       adc_v = 0.0;
float           c = 0.0;

const int numReadings = 25;
int readings[numReadings];
int readIndex         = 0;           
int total             = 0;               
float average         = 0;


void setup() {
  Serial.begin(115200);
  analogReadResolution(12);
  pinMode(A0, INPUT);
  analogWriteResolution(16);
  pinMode(0, OUTPUT_8MA);


  for (int thisReading = 0; thisReading < numReadings; thisReading++) {
    readings[thisReading] = 0;
  }
}

void loop() {

  if(digitalRead(0) == LOW){
    total = total - readings[readIndex];
    readings[readIndex] = analogRead(A0);
    total = total + readings[readIndex];
    readIndex = readIndex + 1;
    if (readIndex >= numReadings) {
      readIndex = 0;
    }
    average = total / numReadings;
    adc_v = average * (cpu_v / max_adc);
    c = adc_v * 308, 32;
    c = c - 7,6;//KALBRASYON -
    c = c + 0; //KALIBRASYON +
    Serial.println(c);
}
 

    PID();
}

float mn     = 0;    //MIN PWM COUNT
float mx     = 54000;//MAX PWM COUNT
float lTime  = 0;
float errSum = 0;
float lErr   = 0;

float Kp = 70;//P
float Ki = 12;//I
float Kd = 66;//D

void PID() {
  unsigned long now = millis();
  int32_t timeChange = (int32_t)(now - lTime);
  float error = 186 - c;//set değişkeni buraya girecek
  errSum += error * timeChange;
  errSum = constrain(errSum, mn * 1.1, mx * 1.1);
  float dErr = (error - lErr) / timeChange;
  float newOutput = (Kp * error + Ki * errSum + Kd * dErr);
  float output = constrain(newOutput, mn, mx);
   analogWriteFreq(100);
   analogWrite(0, output);
}

Final programımız bu.
Elinde imkanı olanlar LM358 ile kurup deneyebilir mi acaba?
Bende harika çalışıyor diyemem ama farklı bir ortamda farklı birinin elinde ne sonuçlar verecek ona göre gideceğim.
Programın bu hali her türlü denetleyici ile çalışır.

Bu hafta içerisinde benim JBC sap ile denerim Ahmet.
 
Bu hafta içerisinde benim JBC sap ile denerim Ahmet.
Ufak bir bug var çözemiyorum.
Error belli değerin üstüne çıktığında PID algoritması çalışmıyor.

6 numara alyan ile PID çalışırken uca dokunuyorum belli miktar soğuduğunda artık PID çalışmıyor.
 
lErr burada neyi kontrol ediyor
eğer tam oturtamazssak sıcaklığı.
mesela 245-250-255 arası geziyor.
bir önceki sapmayı kullanmak gerekebiliyor oturtmak için şuan öyle birşey yaşamadığımız için last error kullanmıyoruz.
başka bir reziztans ile yaşarsak onu devreye alacağım geleceğe yatırım o.
 
C++:
float       adc   = 0.0;
const float cpu_v = 3.30;
const int max_adc = 4096;
float       adc_v = 0.0;
float           c = 0.0;

const int numReadings = 25;
int readings[numReadings];
int readIndex         = 0;             
int total             = 0;                 
float average         = 0;

long adcValue = 0;
int n = 25;

void setup() {
  Serial.begin(115200);
  analogReadResolution(12);
  pinMode(A0, INPUT);
  analogWriteResolution(16);
  pinMode(0, OUTPUT_8MA);


  for (int thisReading = 0; thisReading < numReadings; thisReading++) {
    readings[thisReading] = 0;
  }
}

void loop() {

  if(digitalRead(0) == LOW){
    total = total - readings[readIndex];
    readings[readIndex] = analogRead(A0);
    total = total + readings[readIndex];
    readIndex = readIndex + 1;
    if (readIndex >= numReadings) {
      readIndex = 0;
    }
    average = total / numReadings;
    adc_v = average * (cpu_v / max_adc);
    c = adc_v * 282, 32;
    c = c - 7,6;//KALBRASYON -
    c = c + 0; //KALIBRASYON +

   for(int i=0;i<n;i++)
   adcValue = adcValue + c;
   adcValue = adcValue / n;
   adcValue = adcValue - 10;
   Serial.println(adcValue);
}

    PID();
}

float mn     = 0;    //MIN PWM COUNT
float mx     = 54000;//MAX PWM COUNT
float lTime  = 0;
float errSum = 0;
float lErr   = 0;

float Kp = 70;//P
float Ki = 12;//I
float Kd = 66;//D

void PID() {
  unsigned long now = millis();
  int32_t timeChange = (int32_t)(now - lTime);
  float error = 386 - adcValue;//set değişkeni buraya girecek
  errSum += error * timeChange;
  errSum = constrain(errSum, mn * 1.1, mx * 1.1);
  float dErr = (error - lErr) / timeChange;
  float newOutput = (Kp * error + Ki * errSum + Kd * dErr);
  float output = constrain(newOutput, mn, mx);
   analogWriteFreq(100);
   analogWrite(0, output);
}
derecenin ortalamasını @ozkarah abinin verdiği şekilde yaptım daha iyi oldu.
ama hala ufak buglar var.
bir bug'da set edilenin 3 derece altında PID uyanmıyor.
 
Projeyi geliştirmeye devam ediyorum fakat aynı şeyleri yazasım gelmiyor.
Elimde 2 yeni op amp var onlarla testler yapıyorum yeni pid algoritmaları yazmayı deniyorum kimisi daha iyi oluyor kimisi daha kötü fakat bunları yüzlerce mesaj konuştuğumuz için tekrar tekrar yazmamın anlamı yok. Lm358 li sisteme göre olumlu bir sonuç alırsam onu yazarım şuan için çok farkı yok
 

Çevrimiçi üyeler

Forum istatistikleri

Konular
5,989
Mesajlar
102,193
Üyeler
2,517
Son üye
Dzenit

Son kaynaklar

Son profil mesajları

deneyci wrote on hakan8470's profile.
Sibonge uNkulunkulu ngokuhlukahluka asinike kona.

Bu hangi dil? :)
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
Back
Top