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. .
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.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.
Bunu deneyen de gördüm. Başarılı olduğunu yazıyordu. Ama denemedim. Diğer yöntem daha rahat uyutur gibi geldiDAC'ın lineerliği nasıl ölçtün mü? Eğer o daha iyi ise loopback şeklinde ADC otomatik olarak karakterize edilebilir.
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);
}
Denemek için uç şart dimi? Bende uç yok. OlsadenerdimC++: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.
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.
içinde TC olan bir uçla çalışabilir bu program.Denemek için uç şart dimi? Bende uç yok. Olsadenerdim
Ufak bir bug var çözemiyorum.Bu hafta içerisinde benim JBC sap ile denerim Ahmet.
eğer tam oturtamazssak sıcaklığı.lErr burada neyi kontrol ediyor
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);
}
Yok çevre tepkilerini bekliyorum.Burda son buldu heralde proje
O kişi çıkacakmı acabaYok çevre tepkilerini bekliyorum.
eğer buraya kadar hatam varsa ileriden dönemem bu haliyle biri daha test etsin devam edeceğim.
Çıkmazssa benim becebildiğim kadar havya kullanır yapacaklar.O kişi çıkacakmı acaba
Hadi hayır BakalımÇıkmazssa benim becebildiğim kadar havya kullanır yapacaklar.