JBC kendin-yap havya sapı ve Termokupl ölçüm testleri INA214

Ne güzel ya. Herkes proje yapıyor :D
 
C:
ISR(ADC_vect)
{
  if(adc_sayac<10)
  {
    ADC_seri[adc_sayac]=ADC;
    adc_sayac++;
  }
  if(adc_sayac==10)
  {
    bufint=ms10;
    // adc interrupt kapatma, alınan örnekler işlenene kadar
    // verinin değişmemesi için, ADC free running modda.
    ADCSRA&=~(1<<ADIE );
   
  }
// ADC ayarları
 ADMUX=0;
  ADCSRA=0;
  ADCSRB=0;
  ADMUX|=1<<REFS0 | 1<<REFS1;   //  Dahili 1.1V referans
  ADMUX&=~(0b1111);
  ADMUX|=5; // PC5 TC okuma
  //ADCSRA|=1<<ADEN | 1<<ADIE | 1<<ADATE;//edit new 24. line
  ADCSRA |= bit (ADPS0) | bit (ADPS1) | bit (ADPS2);//edit by a
 
  // prescaler 0 ve 1 >> 2 , 0b10>>4 ,0b11>>8, 0b100>>16, 0b101>>32
  ADCSRA|=0b10;
  ADCSRA|=1<<ADSC; //çevrimi başlat

//------------------------------------
}
Böyle daha güzel olmadı mı? clock 16mhz dersek 100us'de bir adc'ye bakcak
Haklısın. Ben meraktan kurcalıyorum biraz. Doğrusu ADC saatinin 200 khz altında çalışması. 15 khz falan örnekleme frekansı yapıyor.
 
Forumun şu ana kadar en güzel projesi :)
Heyecanla takip ediyorum :)
 
100 örneğin seri monitöre yazdırılması, PWM döngüme sığmadı. ama 20 örnek de iyi, hesabımda hata da varmış düzelttim. Biraz uğraşıp aldığım ölçümlerin daha tutarlı olmasını sağladım. Her seferinde ADC'yi kapatıp, PWM döngüsünün sonunda mosfeti kapatır kapatmaz tekrar free running modda etkinleştirerek örnek aldım. Bu durumda Alınan bütün ölçümler mosfetin kapanma anına göre aynı uzaklıkta oluyor. ADC'nin etkinleştirilmesi için geçen sürede de Opamp çıkışı biraz toparlanmış oluyor. SMPS öyle fena ki programlama sırasında sık sık yükleme hataları alıyorum. Buna rağmen ADC okumaları fena değil. Zaman aralıkları ADC örnekleme periyodu, yalnız her çevrimde tekrar adc etkinleştirmenin 56 us kadar fazladan maliyeti oluyor. Bu sürede Alınacak ölçüm, opamp çıkışı toparlanmadığından zaten işe yaramaz olacağından sorun olmayacak.

1710277747223.png


1710276826992.png


1710276851928.png


Grafikleri inceleyince 17 KHz örneklemek daha cazip görünüyor. Daha kısa sürede daha fazla örnek alıp veriyi filtrelemek için zaman kalmasını istiyorum. 17 Khz'de ilk veriyi kullanmayıp ardışık 5 ölçümün medyanını alıp PID hesaplamaya zaman kalacağını düşünüyorum. Burada hedefim 1ms içinde bunları tamamlayıp PWM'de "dead time"ı olabildiğince kısa tutmak. Aslında bu çok gerekli değil ama zaten bu proje de çok gerekli değil.
@DeveliAhmet teşekkürler, vallahi koltuklarım kabardı :) .
 
Tuş kontrollerini yazdım. Arduinoya uygun hale getirdim. Seri monitöre fonksiyonları test ettim, gayet iyi çalışıyor. Tuşa basma, bırakma, uzun basma ve uzun sürekli basma fonksiyonları var. İkili basma ve ikili uzun basmayı da destekliyor. Bununla havyadaki iki tuş, artırma, azaltma, giriş ve çıkış fonksiyonlarını yerine getirebilecek. uzun basma ile 5'er veya 10'ar artırıp azaltma yapabilecek.

Kod:
/*
 * İki tuşa arayüz geliştirmek için.
 * Burada Inputlar arduino arduino pin 2 ve 3
 * Inputlar tactile vb tuş ile GND'ye bağlanmalı.
 * tuşa basma, bırakma uzun basma ve uzun sürekli basma fonksiyonları var
 * ikili basma ve ıkıli uzun basmayı da destekliyor
 *
 */


// Tuş ön tanımları
#define T_EKSI          0b01  //tusOku fonksiyonunda buton okuma maskesi
#define T_ARTI          0b10  //tusOku fonksiyonunda buton okuma maskesi
#define T_IKILI         0b00
#define T_NULL          0b11  //iki tuş da basılı değil

#define T_EKSI_BAS      0
#define T_EKSI_BIRAK    1
#define T_EKSI_UZUN     2
#define T_ARTI_BAS      3
#define T_ARTI_BIRAK    4
#define T_ARTI_UZUN     5
#define T_IKILI_BAS     6
#define T_IKILI_BIRAK   7
#define T_IKILI_UZUN    8
#define T_BOS           9

#define TUS_ARTI        2
#define TUS_EKSI        3

#define UZUN_BAS_SURE   100


// tuş kontrol değişkenleri
uint8_t t_1,t_sayac2,t_up,t_durum,tusOkunan,tus_sayac;

unsigned long z0,z1,z2;

void setup() {
  Serial.begin(115200);
 
  // tuşlar
  pinMode(TUS_ARTI,INPUT_PULLUP);
  pinMode(TUS_EKSI,INPUT_PULLUP);
}

void loop() {

  if(millis()>z0+5)
  {
    z0=millis();
    
//debounce için 5 ila 10 ms'de bir çalışan bir döngünün içine yerleştirilir
    tusOku();
  }

  // Buton komutları
  if(t_up>0)    // tuşa basıldığında yapılacaklar, kullanılmayacak
    {
      switch(tusOkunan)
      {
        case  T_ARTI_BAS    : Serial.println(F("ARTI BAS"));t_up=0;break;
        case  T_ARTI_BIRAK  : Serial.println(F("ARTI BIRAK"));t_up=0;break;
        case  T_ARTI_UZUN   : Serial.println(F("ARTI UZUN"));t_up=0;break;
        case  T_EKSI_BAS    : Serial.println(F("EKSİ BAS"));t_up=0;break;
        case  T_EKSI_BIRAK  : Serial.println(F("EKSİ BIRAK"));t_up=0;break;
        case  T_EKSI_UZUN   : Serial.println(F("EKSİ UZUN"));t_up=0;break;
        case  T_IKILI_BAS   : Serial.println(F("İKİLİ BAS"));t_up=0;break;
        case  T_IKILI_BIRAK : Serial.println(F("İKİLİ BIRAK"));t_up=0;break;
        case  T_IKILI_UZUN  : Serial.println(F("İKİLİ UZUN"));t_up=0;break;
        default: break;
      }
    }
}


uint8_t tusOku (void)
{
  // tenp değişkenine anlıkbuton durumunu atama
  byte temp=(digitalRead(TUS_ARTI)<<1 | digitalRead(TUS_EKSI));
 
  // debounce için ardışık okuma aynı olduğunda çalışır
  if(t_durum==temp)
  {
    switch (t_durum)
    {
      case T_ARTI:
        if((tus_sayac==0)&&(tusOkunan==T_BOS))
        {
          t_up=1;
          tusOkunan=T_ARTI_BAS;
          tus_sayac++;
        }
        else if(tus_sayac<UZUN_BAS_SURE)tus_sayac++;

        // Tuş zaten basılıyken
        else if((tus_sayac==UZUN_BAS_SURE)&&((tusOkunan==T_ARTI_BAS)||(tusOkunan==T_ARTI_UZUN)))
        {
          t_up=1;
          tusOkunan=T_ARTI_UZUN;
          tus_sayac=0;
        }
        break;
      case T_EKSI:
        if((tus_sayac==0)&&(tusOkunan==T_BOS))
        {
          t_up=1;
          tusOkunan=T_EKSI_BAS;
          tus_sayac++;
        }
        else if(tus_sayac<UZUN_BAS_SURE)tus_sayac++;
        else if((tus_sayac==UZUN_BAS_SURE)&&((tusOkunan==T_EKSI_BAS)||(tusOkunan==T_EKSI_UZUN)))
        {
          t_up=1;
          tusOkunan=T_EKSI_UZUN;
          tus_sayac=0;
        }
        break;
      case T_IKILI:
        // tuşlar T_IKILI_BAS durumusunda değilse çalışabilir
        // tuşun biri önce basılı okunduysa da çalışır
        // tuşlar debouce süresinden önce ikili okunduysa da çalışır
        if((tusOkunan==T_BOS)||(tusOkunan==T_EKSI_BAS)||(tusOkunan==T_ARTI_BAS))
        {
          tus_sayac=0;
          t_up=1;
          tus_sayac++;
          tusOkunan=T_IKILI_BAS;
        }
        else if(tus_sayac<UZUN_BAS_SURE)tus_sayac++;
        else if((tus_sayac==UZUN_BAS_SURE)&&(tusOkunan==T_IKILI_BAS))
        {
          t_up=1;
          tusOkunan=T_IKILI_UZUN;
          tus_sayac=0;
        }
        break;     
      case T_NULL:
      
        // tuş bırakma olayını yakalayıp tanımlar, hiçbir tuş basılı eğilken çalışır
        // T_NULL (tuş basılı değil) okunduğunda tusOkunan değeri update edilmemiştir
        // Bu döngü son basılı tuşa göre çalışıp hangi tuşun bırakıldığını belirler
        // sonra da tusOkunan olayını atar
        // Button durumu değişikliğini t_up bayrağını 1 yaparak işaretler
        switch(tusOkunan)
        {
          case T_ARTI_BAS:
            tusOkunan=T_ARTI_BIRAK;
            t_up=1;
            tus_sayac=0;break;
          case T_EKSI_BAS:     
            tusOkunan=T_EKSI_BIRAK;
            t_up=1;
            tus_sayac=0;
            break;
          case T_IKILI_BAS:   
            tusOkunan=T_IKILI_BIRAK;
            t_up=1;
            tus_sayac=0;
            break;
          default :     
            tusOkunan=T_BOS;
            t_up=0;
            tus_sayac=0;
            break;
        }
    }         
  }
  t_durum=temp;
  return tusOkunan;
}
 
Konu tutarlılığı için @Mikro Step 'in konusuna yazdığım mesajı aynen taşıyorum;

TC ölçüm gürültüsünü, 10 ölçümün medyanıyla filtreleyerek sabit duty'de denge sıcaklığında 1-2 LSB ADC değerine indirebildim, TC'yi dead time'da okuyorum. saniyede 100 ölçüm alıyorum her duty cycle'da 10 ölçümün medyanı yani

1710593915513.png




Sonra duty'yi arttırıp basitçe 200'ün üzerinde duty=0, 200'ün altında duty sabit olacak şekilde kaba bir regülasyon deneyince durum aşağıda.

1710594270097.png



PWM, ölçüm 200'ün altına iner inmez başlamasına rağmen ısıtıcıdaki sıcaklık artışının TC'ye yansıması yarım saniye sürüyor ve malesef PWM'nin 0 olduğu ölçümlerle PWM sırasında aldığım ölçümler arasında tutarsızlık var. ani bir düşük ölçüm alıyorum PWM başlar başlamaz. plotterdaki dip nokta bunu gösteriyor. PWM biter bitmez(ölçüm 200'ü geçince) aniden yüksek alınan ölçüm de bu yüzden. Yoksa havya sıcaklığı bu kadar yükselmiyor. Örnekleme yaptığım zaman aralığını değiştirmem gerek. Seçtiğim kullandığım INA214'ün kısıtlaması bu.
1710594845110.png


Başta yukarıdaki yapıya bağladım bunu. Ama bunun etkisi olsa da esas faktör opamp çıkışı.
 
Opampın inputlarında TC örneklemesi öncesinde hep aynı şoku uygulamak ve TC okumasını tutarlı hale getirmek için PWM'yi kapatmak yerine duty'yi minimum bir değere indirerek regülasyon denediğimde ölçüm tutarlılığı arttı.

Bir önceki mesajın 2. ekran görüntüsüyle aynı şartlarda sadece minimum duty uygulayarak alınan TC okumaları aşağıda:

1710596430428.png


Regülasyon çok daha iyi. Bu ölçümler şu anda 100C civarı fişek sıcaklığında. Lehimleme sıcaklıklarında da deneyler yapayım.
 
Sorunun ustune gitmek istersen git ama bu haliyle de havya canavar gibi calisir.
Termometre yapmiyorsun sonucta.
 
Sorunun ustune gitmek istersen git ama bu haliyle de havya canavar gibi calisir.
Termometre yapmiyorsun sonucta.
Durum görüldüğü gibi değil. Duty'yi sabit ve düşük uyguluyorum burada, hem sıcaklık düşük hem de havya serbest havada. Gücü ve yükü arttırınca sıcaklık fırlamalarının yükseleceğini düşünüyorum. şimdi birkaç extrem senaryo deneyeyim, sıcaklık fırlamalarını gözlemleyeyim.
 
14V duty %92 sıcaklık 250C ve aşağıdaki grafik sıcaklığı gösteriyor. havya yükü sıfır yani serbest havada.

1710600053740.png



16C civarı bir overshoot var. Burada PID yok. yani maks güç ile min güç var.

Havya ucuna soğutucu aluminyumla dokunduğumda, iyi bir temas sağlıyarak, lehim de yardımıyla, durum aşağıdaki gibi oluyor. Sıcaklık aşımı 13C'ye kadar düşüyor

1710600078855.png



Havya hedef sıcaklığı 350C yapınca aşağıdaki gibi oldu, soğutucuyla dokunduğum anlar belli.

1710600102856.png



Şimdi bu sıcaklık salınımı makul müdür? Bu arada TC ölçümü ile fişek ucu arasında da sıcaklık farkı var bu fark yük ile doğru orantılı. Yük altında oluşan bu farkı regüle etmeye gerek var mıdır?

Edit: fotoğraflar.
 
Son düzenleme:
bu biraz konfora giriyor bu sıcaklık farkı lehimleme konforunu etkilemiyorsa biz biyomedikal cihaz geliştirmiyoruz mikron hassasiyetli kutularada cihaz koymuyoruz.

Bu fark lehimleme açısından problem teşkil etmiyorsa bence kabul edilir.
 
semih_s'in yukledigi fotolari gorebiliyormusunuz?

Bende cikmiyor.
 
Eger hic iyilestirme icin ugrasmadiysan ugrasmalisin.

Iyilestirmelere ragmen boyleyse 16 derece icin fazla da kasmamak lazim.
 
Şu halde sıcaklık ölçümü tutarlı. Sıcaklık kontrolü için hiç çabalamadım, doğrudan soğuksa max duty, sıcaksa min duty şeklinde. Bu haliyle ben de kullanılabilir durumda olduğunu düşündüğümden regülasyon için şu anda daha fazla uğraşmayacağım. Kalibrasyon presedürü, menüler, uç kayıtları gibi işlevleri tamamlamaya devam edip regülasyonla en son uğraşacağım. Hesaplamaları için 250 us falan ayırsam yeter herhalde.
 
Buraya kadar TC ölçümlerini aşağıdaki resimdeki TC kontaklarından yapıyordum. Yani en içteki RED ve en dıştaki GREEN arasındaki voltajı okuyordum. Bir de Isıtıcıda oluşan TC'den ölçüm almak için devrede bir jumper tel ile opamp girişine kablo çektim. ve Ölçümleri en iç kontak RED ile orta kontak BLUE arasından aldım.

1710601930094.png


Aşağıdaki iki çıktı eşit şartlarda alıdı. 14V, %92 duty 350C hedef. PID yok Max duty ve min duty var. soğutucuyla dokunduğum orta bölge belli.

1710602296671.png

1710602568066.png


Soğutucuyla dokunulan kısımlar belli. Şimdi bu ölçümler arasındaki fark gerçekten de fişekte iki ayrı TC olduğunu gösteriyor. Isıtıcı rezistans kontaklarında oluşan TC ısının hemen kaynağında olduğundan dolayı regülasyon çok daha iyi oluyor. TC kontaklarından alınan ölçüm ise fişek ucuna daha yakın ve daha lehimleme sıcaklığını daha doğru yansıtıyor, ama ısı kaynağıyla arasındaki ısıl iletkenlik meselesinden dolayı regülasyon zorlaşıyor.

Aynı şartlarda max duty %50 olunca durum aşağıdaki gibi oldu.

1710603289991.png



Sıcaklık ölçümünü buradan yapıp, havya termal yükünü hesaplayıp, uç ile ısıtıcı arasındaki termal iletkenliği deneyle tespit edip buna göre regülasyon yapmayı düşünüyorum.
 
Bence genel olarak zaten overshoot çok kritik değil. Asıl undershoot önemli. Geniş bir bakır yüzeye lehim yapmaya çalıştığında havyanın yapışmaması lazım. Eğer orada da 15 derece undershoot ile çalışıyorsa hiç regülasyona falan gerek yok.
 
Bence genel olarak zaten overshoot çok kritik değil. Asıl undershoot önemli. Geniş bir bakır yüzeye lehim yapmaya çalıştığında havyanın yapışmaması lazım. Eğer orada da 15 derece undershoot ile çalışıyorsa hiç regülasyona falan gerek yok.
Abi havalı olsun azıcık havya diye uğraşıyorum :) . Sanıyorum çoğu havya istasyonunun ekranı gerçek anlık uç sıcaklığını göstermiyor. Göstere göstere isabetli ve iyi regülasyon olsun. Uğraşırken de proje bitmesin dimi :) .
 
Ölçümleri 15 ölçümün medyanı yaptım. %50 duty'de böyle oldu. alüminyum soğutucuyla yüklesem de ölçümler aynı şekilde oluyor. Şu halde aktif gücü hesaplayıp ölçülmüş ısıl iletkenlikle bir fonksiyona verip regülasyon yapabilirim. Bugün bu kadar yetsin...

1710604662164.png
 

Forum istatistikleri

Konular
5,844
Mesajlar
99,702
Üyeler
2,481
Son üye
rfdog12

Son kaynaklar

Son profil mesajları

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.
cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Back
Top