Kendin-Yap Auto-Range Miliohmmetre

semih_s

Kıdemli Üye
Katılım
16 Aralık 2020
Mesajlar
1,345
Bir süredir boş vaktimde uğraştığım proje. Devreyi tamamladım ve dizgisini yaptım. Birazdan da kartı basacağım.
Edit: Aşağıdaki şema ve fotoğraflar projenin güncel durumudur. birkaç ufak değişiklik ve geliştirme oldu.



ohmmetre_ina180_v2_şema.jpg


ohmmetre_ina180_v2_Dizgi.jpg
ohmmetre_ina180_v2_Grafik.jpg



TL431 ile bir transistörü sabit akım kaynağı olarak düzenledim. Bu sabit akımı değiştirerek kademeler arasında geçiş yapılabiliyor. Ekran seçmedim. Şimdilik tek bir 4 basamaklı 7 segment led display kullanmayı düşünüyorum.

Cihazın beyni Atmega88-168 veya 328 olabilecek. 8 mhz dahili osilatörle çalışacak ve arduino olacak. Ekran için ayrıca spi ve i2c çıkışları da yerleştirdim. UART çıkışı da ekledim. Cihazda tuş yok, kalibrasyon için arduino serial monitor ile çalışacak bir arayüz koymayı düşünüyorum. Ölçümü high-side sensing ile INA180B1 akım monitörü ile yapıyorum.

Cihazda kalibrasyon sonrası %1'den daha iyi bir isabetlilik bekliyorum. Hem INA180'in çıkışının gnd'yi tam olarak giremeyecek olmasından, hem de ADC'nin olası kusurlarından tahminimce 10-15mOhm altını düzgün ölçemeyecek. Zaten 10mOhm ölçecek olsa da bu pek işe yarar bir ölçüm olmaz, çünkü en düşük kademede 1-2 mOhm gibi bir çözünürlükle olduğundan %10'dan an daha kötü bir isabetlilik olur.

Relatif ölçüm için tuş gerekli ama bunun yerine cihazı inputlar kısa devre iken açarak kullanmayı düşündüm, Olmadı kullanılmayan uart-spi-i2c headerların birine tuş iliştiririm.

Uğraşmak isteyenler için simulasyonun çalıştığı proje dosyasını da ekleyeyim.

Edit:
Alete yazıcıdan kutu basmak veya hazır kutu kesip delip yerleştirmek zor geldi. Eski bir telefonun piline silikon bantla yapıştırdım. Durum aşağıda görünüyor. Tırnak parlatıcısıyla yolları izole ettim. Bir pakete iliştirip bıraksam panik yaratacak bir görüntüsü oldu. Bununla yakın zamanda daha fazla uğraşacağımı sanmıyorum...

Ekrandaki çizgiler pil durumunu gösteriyor, pil durumunu ölçüm dışı direnç takıldığında yada ölçüm yapılmadığında gösteriyor. Fotoğraftaki durum pilin %50 civarı olduğu hal.


ohmmetre_ina180_Foto1.jpg
ohmmetre_ina180_Foto2.jpg


Aşağıda 7 segment ekranın 74HC595 ile çalışan devresi de var. Pdf olarak toner transfere hazır dosya da ekte. Tam ödevlik yani :) . Proje dosyası da ekte. Segmentlerin bacaklara göre dağılımı farklı displayler için kodda konfigürasyon kısmı var.

7SEG_4D_hc595.v2_şema.jpg


7SEG_4D_hc595.v2_dizgi.jpg


Kod aşağıdaki gibi. Biraz frankeştayn gibi (frankeştayn doktor ama yaratığın adı yokmuş yapacak bir şey yok)

Ohmmetre INA180:
/*Ohmmetre_ina180B1_V2 için firmware
  Atmega88-168-328 ile çalışır

  */

#include <Arduino.h>
#include <avr/io.h>
#include <avr/interrupt.h>

// SPI ile 7segment sürmek için tamımlamalar

#define DDR_SPI        DDRB                    //
#define PORT_SPI    PORTB                    //
#define SPI_SCK        PINB5                    //
#define SPI_MOSI    PINB3                    //
#define SPI_SS        PINB2                    //

#define LATCH_DDR    DDRD
#define LATCH_PORT    PORTD
#define LATCH_PIN   PIND
#define LATCH_PIN_NO  3
#define LATCH_H     (LATCH_PORT|=1<<LATCH_PIN_NO)
#define LATCH_L     (LATCH_PORT&=~(1<<LATCH_PIN_NO))
#define LATCH_L_H_L   LATCH_L;LATCH_H;LATCH_H;LATCH_L;LATCH_L

// anot veya katod display seçimi (KATOT İÇİN DENENMEDİ ve düzenlenmedi -Work In Progress)
#define ANOT


/**
    7SEGMENTS
          A
      F      B
          G
      E      C
          D   DP

**/

// hangi segmentin hangi "595" bacağına bağlandığı
/*
         14-|"U" |-    74HC595
         13-|      |-15
         12-|      |-
         11-|      |-
         10-|      |-
           9-|      |-
           8-|      |-
    GND -|.......|-Q'------|
                                    |
          6-|''U''|-             |
          5-|      |-7           |
          4-|      |-D_in----|
          3-|      |-
          2-|      |-
          1-|      |-
          0-|      |-
    GND-|.......|-

*/

// Segment ve basamakların hc595 bağlantıları yukarıdaki şemaya göre
// bit shift operatörünün sağı değiştirilecek, hangi segmentin
// hangi bacağa bağlı olduğuna göre
#define A 1<<12
#define B 1<<0
#define C 1<<6
#define D 1<<4
#define E 1<<2
#define FS 1<<14
#define G 1<<3
#define DP 1<<5
// basamaklar için sadece pin konumu

#define D0    1<<13//en yüksek basamak
#define D1    1<<11
#define D2    1<<15
#define D3    1<<1  //en düşük basamak


#define R0   (A|B|C|D|E|FS)
#define R1   (B|C)
#define R2   (A|B|G|E|D)
#define R3   (A|B|G|C|D)
#define R4   (B|C|G|FS)
#define R5   (A|FS|G|C|D)
#define R6   (A|FS|G|C|D|E)
#define R7   (A|B|C)
#define R8   (A|B|C|G|E|D|FS)
#define R9   (A|B|C|D|FS|G)


// seg[i]: binary olarak "i" rakamının gösterimi için
// açılacak segmentlerin hc595'in bacaklarında isabet ettiği yerler
// seg[10] ve seg[11] pil seviye gösterimi için         
int16_t seg[12]={~R0,~R1,~R2,~R3,~R4,~R5,~R6,~R7,~R8,~R9,~(G),~(D)};

// basamak maske değişkeni
int bas_maske[5]={(D3)|~(D0|D1|D2|D3) , (D2)|~(D0|D1|D2|D3) , (D1)|~(D0|D1|D2|D3) , (D0)|~(D0|D1|D2|D3) , ~(D0|D1|D2|D3) };

// gösterilecek sayının basamak değerleri için ve nokta pozisyonu için
byte b_degeri[12],nokta;

#define KADEME100 5
#define KADEME10 6
#define KADEME1 7

#define PIL A6
#define DIRENC A0

int disp[8];
byte asama,j,kademe,ADC_reset;
unsigned long t0,t1,t2;

int gost[8];
int adc_seri[128],a_i,ADC_bayrak,pil_seviyesi;
int pil_full=618;
int pil_bos=480;
int buff;
float top,ort;

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Kalibrasyon katsayıları>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Bu katsayılar her kademe için ilgili değerde (1-10-100 Ohm) direnç ile ölçüm yaparak belirlenir
// kalibrasyon için %1'lik bir grup direnç içinden ölçülerek seçilmiş ortalama değerde bir
// direnç ile kalibrasyon yapmak %1'den iyi bir doğruluk yakalanmasını sağlar.
 
float kal_kademe1=1.051;
float kal_kademe10=1.051;
float kal_kademe100=1.075;


void timer2_init(void);
void getADC(byte kanal);
void kademe_sec(byte k);
void SPI_MasterInit(void);
void disp_sur (void);
void dumpADC (void);
void basamak(int16_t sayi);
void disp_set (void);
void dac_yaz (uint16_t deger);

ISR(TIMER2_COMPA_vect)
{
  disp_sur();
}
/*
ISR(ADC_vect) // hareketli ortalama
{
  ADC_bayrak++;
  top+=ADC;
  if(a_i>126)
  {
    a_i=0;
  }
}
*/
void setup()
{
 
  analogReference(INTERNAL);
  pinMode(KADEME100,OUTPUT);
  pinMode(KADEME10,OUTPUT);
  pinMode(KADEME1,OUTPUT);

  LATCH_DDR|=1<<LATCH_PIN_NO;

  SPI_MasterInit();

  kademe_sec(KADEME100);
  timer2_init();
  sei();

}


void loop()
{
  if(kademe==0) // başlangıç
  {
  
  }
 
  if(kademe==KADEME1)
  {
    if(millis()>(t0+500))
    {
      t0=millis();
      getADC(DIRENC);
      buff=round(ort*kal_kademe1);
    
      if(ort>=1021)kademe_sec(KADEME10);
      else
      {
        basamak(buff);
        disp_set();
      }
    }
  }
 
  if(kademe==KADEME10)
  {
    if(millis()>(t0+500))
    {
      t0=millis();
      getADC(DIRENC);
      buff=round(ort*kal_kademe10);
    
      if(ort<=103)kademe_sec(KADEME1);
      else if(ort>=1020)kademe_sec(KADEME100);
      else
      {
        basamak(buff);
        disp_set();
      }
    }
  
  }
 
  if(kademe==KADEME100)
  {
    if(millis()>(t0+500))
    {
      t0=millis();
      getADC(DIRENC);
      buff=round(ort*kal_kademe100);
      if(ort>=1020)// ölçüm dışı yüksek direnç
      {
        // pil ölç ve oranla 4 basamakta seviyeyi göster
        // Pil seviyesi full:"----" %75:"---_" %50:"--__" %25: "-___" düşük: "_____"
        if(millis()>=t1+100)
        {
          t1=millis();
          analogRead(PIL);
          pil_seviyesi=(analogRead(PIL)-pil_bos)/24;
        
          if(pil_seviyesi>3)
          {
            for(byte i=0;i<4;i++)
            {
              disp[i]=(seg[10]&bas_maske[i]);
            }
          
          }
          else if(pil_seviyesi>2)
          {
            for(byte i=1;i<4;i++)
            {
              disp[i]=(seg[10]&bas_maske[i]);
            }
            disp[0]=(seg[11]&bas_maske[0]);
          }
          else if(pil_seviyesi>1)
          {
            for(byte i=2;i<4;i++)
            {
              disp[i]=(seg[10]&bas_maske[i]);
            }
            for(byte i=0;i<2;i++)
            {
              disp[i]=(seg[11]&bas_maske[i]);
            }         

          }
          else if(pil_seviyesi>0)
          {
            for(byte i=3;i<4;i++)
            {
              disp[i]=(seg[10]&bas_maske[i]);
            }
            for(byte i=0;i<3;i++)
            {
              disp[i]=(seg[11]&bas_maske[i]);
            }             
          }
          else
          {
            for(byte i=0;i<4;i++)
            {
              disp[i]=(seg[11]&bas_maske[i]);
            }         
          }
        
        }
      }
      else
      {
        basamak(buff);
        disp_set();
      }
    }
    if(ort<100)kademe_sec(KADEME10);
  }
}

void kademe_sec(byte s)
{
  kademe=s;
  switch (s)
  {
    case KADEME100:
      digitalWrite(KADEME100,HIGH);
      digitalWrite(KADEME10,LOW);
      digitalWrite(KADEME1,LOW);
      nokta=1;
      break;
    
    case KADEME10:
      digitalWrite(KADEME10,HIGH);
      digitalWrite(KADEME1,LOW);
      digitalWrite(KADEME100,LOW);
      nokta=2;
      break;
    case KADEME1:
      digitalWrite(KADEME1,HIGH);
      digitalWrite(KADEME10,LOW);
      digitalWrite(KADEME100,LOW);
      nokta=3;
      break;
    default:
      digitalWrite(KADEME100,HIGH);
      digitalWrite(KADEME10,LOW);
      digitalWrite(KADEME1,LOW);
      break;
    
  }
  delay(1000);
}
void getADC(byte kanal)
{
  top=0;
  analogRead(kanal);
  analogRead(kanal);
  analogRead(kanal);
  for(byte i=0;i<33;i++)
  {
    adc_seri[i]=analogRead(kanal);
    top+=adc_seri[i];
    ort=top/33;

  }
}
void dumpADC (void)
{
 
  Serial.println(F("ADC okumaları"));
  for(byte i=0;i<128;i++)
  {
    Serial.print(i);
    Serial.print(". ");
    Serial.println(adc_seri[i]);
  
  }
}

void disp_set (void)
{
    uint8_t i=0;;
    for(i=0;i<4;i++)
    {
        // gösterilecek segmentleri aç | bütün basamakları kapat & gösterilecek basamağı aç
        // i=0: 100 binler basamağı, i=5: 1'ler basamağı
        disp[i]=0;
        disp[i]= ( seg[b_degeri[i]] & bas_maske[i]);
    }
  disp[nokta]&=~(DP);//dot_maske;

}

void basamak(int16_t sayi)//basamakları hesaplar basamak değerlerini b[i] array değişkene atar ve 7segment display için binary registerlarını tayin eder
{
  uint8_t i;
  {
    gost[0]=sayi;
    for(i=0;i<5;i++)//bas:basamak sayısını mod için yardımcı değerleri hesaplar
    {
      gost[i+1] = gost[i]/10;
      //if(gost[i+1]==0)i=4;
    }
    for(i=0;i<6;i++)// 10^i basamağının değerlerini hesaplar
    {
      b_degeri[i] = gost[i]-gost[i+1]*10;
    }
  }
}

void disp_sur (void)
{
  switch(asama)
  {
    case 0:
      LATCH_H;// en son gönderilen disp değerini shift reg çıkışlarına yansıtma
      // en düşük bitten başlanıyor, gönderime alt 8 biti gönderme
      SPDR = 0xff&disp[j];
      asama++;
      break;
    case 1:
      LATCH_L;
      SPDR=disp[j]>>8;
      asama=0;
      j++;//basamak takip değişkeni
       if(j>3)//altıncı basamaktan sonra başa döner
      {
        j=0;
      }
      break;
    default: asama=0;j=0;
  }
}


void SPI_MasterInit(void)
{
    // Set MOSI and SCK output, all others input
    DDR_SPI = (1<<SPI_SCK)|(1<<SPI_MOSI)|(1<<SPI_SS);
    SPCR = (1<<SPE)|(1<<MSTR)|(1<<DORD);
  //SPSR|=1<<SPI2X;
}

void dac_yaz (uint16_t deger)
{
  //Bu fonksiyon çağrıldığında spi birimi 16bitin tamamını gönderene kadar mcu meşgul olur.
  //Bunun yerine >> while (!(SPSR & (1<<SPIF))); << kodları kaldırılıp loop içinde belli bir periyotta sürekli
  //transfer tamamlanma kontrolü yapıp, tamamlandıysa SPI registerine gönderilecek veri yazılabilir.
  // 8 bitte bu çok kolay olsa da 16 bit için hc595 latch pini de toggle edileceğinden sekansı dikkatli ayarlamak gerekir.
 
      // en düşük bitten başlanıyor, gönderime alt 8 biti gönderme
      SPDR = 0xff&deger;
      while (!(SPSR & (1<<SPIF)));
      SPDR=deger>>8;
      while (!(SPSR & (1<<SPIF)));
      LATCH_L_H_L;// en son gönderilen disp değerini shift reg çıkışlarına yansıtma
}

void timer2_init(void)
{
  TCCR2A=0;
  TCCR2B=0;
  TCCR2A|=1<<WGM21;   // CTC mod
  TCCR2B|=0b111;      // prescaler 1024
  TIMSK2|= 1<<OCIE2A; // Compare interrupt 2A CTC için
  OCR2A=20;
}

void ADC_init(void)
{
  ADMUX=0;
  ADMUX|= 1<<REFS1|1<<REFS0;
  ADCSRA=0;
  ADCSRA|=1<<ADEN | 1<<ADATE | 0b110 ;
}

void ADC_kanal_sec(byte kanal)
{
  ADC_reset=1; // adc buffer array değişkenini sıfırlamak için bayrak
  if(kanal<8)
  {
    ADMUX=~(0b1111); //
    ADMUX|=kanal;
  }
}
 

Ekler

  • ohmmetre_ina180-v2-top.pdf
    58.1 KB · Görüntüleme: 26
  • ohmmetre_ina180_Foto2.jpg
    ohmmetre_ina180_Foto2.jpg
    88.9 KB · Görüntüleme: 41
  • 7SEG_4D_hc595.v2.pdsprj
    31.4 KB · Görüntüleme: 44
  • 7seg_4d_hc595_v2_alt.pdf
    18.3 KB · Görüntüleme: 27
Son düzenleme:
MCU daki ADC nin giriş empedansı düşükse veya değişken ise, INA18081 çıkışını yükler ve ölçüm sonucunu etkiler. R21'i kaldırıp yerine kısa devre koymak daha iyi olabilir. Veya araya bir buffer opamp konabilir.
 
MCU daki ADC nin giriş empedansı düşükse veya değişken ise, INA18081 çıkışını yükler ve ölçüm sonucunu etkiler. R21'i kaldırıp yerine kısa devre koymak daha iyi olabilir. Veya araya bir buffer opamp konabilir.
Baskıya geçmeden son kontrolleri yapıyordum. Bu direnci jumper ile değiştirebilirim ve kondansatörü de kaldırabilim. Bir de INA180'in çıkışını yüklememişim. Bir 10K direnç ekleyeyim, datasheet verilerini 10K yük ile vermişler, herhalde çıkışın GND'ye yaklaşmasına faydası olur.
 
C3 ün kesin faydası olur. Hatta daha büyük değer veya paralel birkaç tane kapasitör de seçilebilir. Çıkış DC olacağı için oradaki paraziti ne kadar temizlersen o kadar iyi. Mesela ADC girişine çok yakın, kaliteli iki tane paralel 1 μF film kapasitör ve dediğin gibi paralel 10 kΩ direnç iyi olur.
 
C3 ün kesin faydası olur. Hatta daha büyük değer veya paralel birkaç tane kapasitör de seçilebilir. Çıkış DC olacağı için oradaki paraziti ne kadar temizlersen o kadar iyi. Mesela ADC girişine çok yakın, kaliteli iki tane paralel 1 μF film kapasitör ve dediğin gibi paralel 10 kΩ direnç iyi olur.
Devre üzerinde oynayabilmek için smd olarak dizdim THT bileşenleri de, bu değişiklikleri yapabilirim. akımı yükseltip referans olarak tl431 çıkışını da kullanmayı düşündüm. Birkaç jumper telle değişik versiyonları test ederim. Aslında düşününce bu kadar sıkışık dizmesem daha iyiymiş. Kurcalamak ve ölçüm yapmak daha kolay olurdu.
 
Aslında MCU daki ADC nin okuduğu verileri grafik olarak görüntüleyebilsen, kodu geliştirmede çok faydası olur. Mesela SPI porta okuduğun ADC verilerini yazsan? Ama SPI verilerini grafikleştirebilen bir osiloskop lazım. Veya basit lojik analizörler ile kaydedip sonradan harici bir program ile görüntülenebilir. Okunan veri üzerindeki gürültü analizi ile de tam olarak nasıl bir filtreleme gerektiğini belirleyebilirsin.
 
Aslında MCU daki ADC nin okuduğu verileri grafik olarak görüntüleyebilsen, kodu geliştirmede çok faydası olur. Mesela SPI porta okuduğun ADC verilerini yazsan? Ama SPI verilerini grafikleştirebilen bir osiloskop lazım. Veya basit lojik analizörler ile kaydedip sonradan harici bir program ile görüntülenebilir. Okunan veri üzerindeki gürültü analizi ile de tam olarak nasıl bir filtreleme gerektiğini belirleyebilirsin.
:) UART'ı bu yüzden koydum. verileri bir array'e kaydedip seri monitörden bilgisayara çekeceğim. SPI porttan osiloskobu da deneyeyim. dekoderi hiç kullanmadım, denerim.
 
Aslında MCU daki ADC nin okuduğu verileri grafik olarak görüntüleyebilsen, kodu geliştirmede çok faydası olur. Mesela SPI porta okuduğun ADC verilerini yazsan? Ama SPI verilerini grafikleştirebilen bir osiloskop lazım. Veya basit lojik analizörler ile kaydedip sonradan harici bir program ile görüntülenebilir. Okunan veri üzerindeki gürültü analizi ile de tam olarak nasıl bir filtreleme gerektiğini belirleyebilirsin.
Gürültü analizi nasıl yapılır bilmiyorum. O aşamaya gelince veriyi burada paylaşayım. AVR'nin 10 bit ADC'si pille beslenen bu devredeki gürültüyü yakalayabilir mi?

Bu gürültünün diyelim ki hem bileşenlerin kendisinden doğal olarak geliyor hem de devredeki tasarım kusurlarından. ADC için kullandığım 1.1V dahili referans yerine daha yüksek bir referans voltajı kullansam, dinamik aralığın tamamını kullanacak şekilde kazancı da ayarlasam faydası olur mu? Gerçi yeri gelince belli olur. Herhalde önümüzdeki hafta sonuna kadar ilk ölçümleri alırım, kurcalarım.
 
:) UART'ı bu yüzden koydum. verileri bir array'e kaydedip seri monitörden bilgisayara çekeceğim. SPI porttan osiloskobu da deneyeyim. dekoderi hiç kullanmadım, denerim.

Hmm evet ya aklıma gelmedi. Arduino IDE ile doğrudan grafiği de basabiliyorsun :)
 
Gürültü analizi nasıl yapılır bilmiyorum. O aşamaya gelince veriyi burada paylaşayım. AVR'nin 10 bit ADC'si pille beslenen bu devredeki gürültüyü yakalayabilir mi?

Bu gürültünün diyelim ki hem bileşenlerin kendisinden doğal olarak geliyor hem de devredeki tasarım kusurlarından. ADC için kullandığım 1.1V dahili referans yerine daha yüksek bir referans voltajı kullansam, dinamik aralığın tamamını kullanacak şekilde kazancı da ayarlasam faydası olur mu? Gerçi yeri gelince belli olur. Herhalde önümüzdeki hafta sonuna kadar ilk ölçümleri alırım, kurcalarım.

Maksimum dinamik alanı kullanmak için referans voltajını maksimum yapmak çok büyük fayda sağlar. ADC nin kendi öz gürültüsünün yaratacağı olumsuz etkiyi de azaltmış olursun. ADC girişini şaseye çekip okuduğun veriyi grafikleştirirsin. Oradaki gürültünün karakterine göre de bir filtreleme stratejisi tespit edilir. Mesela benim projede ADC nin okuduğu iğne palslerini median filtre ile neredeyse tamamen giderdim, çok iyi sonuç aldım.
 
Semih Bey
Bu pcb lerdeki kısa devreyi kolayca bulabilir sanırım
PCB hazırmı?
Malzemeleri lehimleyebildinizmi?
 
Semih Bey
Bu pcb lerdeki kısa devreyi kolayca bulabilir sanırım
PCB hazırmı?
Malzemeleri lehimleyebildinizmi?
Mosfetler eksik. Bugün sipariş verdim gelince kuracağım. Kısa devre bulmak için pratik olmaz herhalde bu alet. Ama kelvin yerine normal probla kullanılırsa isabetlilik azalır ama daha pratik olabilir.
 
Peki Kelvin probu eklenebilirmi bu devreye(PCB ye ufak bir soket eklemesiyle)
 
Evet kelvin probl çalışacak. Ama usb soketinden. Usb'nin 2 kablosu akım vermek için ikisi de opamp inputları için. Ama bunlar prob ucunda kısa devre edilerek kullanılabilir. Ölçümde kayda değer bir fark olmayabilir, çünkü çözünürlük şu haliyle 1 mOhm'dan fazla. Deneyince göreceğim. Belki umduğum gibi olursa kademeleri mikro ohm ölçecek şekilde düzenleyebilirim. Ama bu donanımda anlamlı olur mu deneyince göreceğim.
 
ohmmetre.jpg

Ohmmetreyi topladım. ufak 1-2 değişiklikle bastım kartı.

Test için hızlıca bir kod yazdım. kademeleri yönetip, uart ile seri monitöre okumaları gönderebiliyorum.

ohmmetre:
#define KADEME1 5
#define KADEME2 6
#define KADEME3 7

#define PIL A6
#define DIRENC A0

int direncADC,pilADC;
int direncSeri[100];

void pilOku(void);
void direncOku(void);
void kademe(byte k);



void setup() {
 
  analogReference(INTERNAL);
  pinMode(KADEME1,OUTPUT);
  pinMode(KADEME2,OUTPUT);
  pinMode(KADEME3,OUTPUT);
 
  Serial.begin(9600);
  Serial.println("BASLA");

  direncOku(1);
  Serial.print("kademe0  ");
  Serial.println(direncADC);
  Serial.println();
  kademe(KADEME3);
  delay(10);
  direncOku(1);
  Serial.print("kademe3  ");
  Serial.println(direncADC);
  delay(100);
  direncOku(50);
  dumpDirenc();
}


void loop() {
  delay(100);      
}

void kademe(byte k)
{
  switch (k)
  {
    case KADEME1:
      digitalWrite(KADEME1,HIGH);
      digitalWrite(KADEME2,LOW);
      digitalWrite(KADEME3,LOW); break;
      
    case KADEME2:
      digitalWrite(KADEME2,HIGH);
      digitalWrite(KADEME1,LOW);
      digitalWrite(KADEME3,LOW); break;
    case KADEME3:
      digitalWrite(KADEME3,HIGH);
      digitalWrite(KADEME2,LOW);
      digitalWrite(KADEME1,LOW); break;
    default:
      digitalWrite(KADEME1,HIGH);
      digitalWrite(KADEME2,LOW);
      digitalWrite(KADEME3,LOW); break;
      
  }
}
void direncOku(byte max100)
{
  direncADC=analogRead(DIRENC);
  direncADC=analogRead(DIRENC);
  direncADC=analogRead(DIRENC);
  for(byte i=0;i<max100;i++)
  {
    direncSeri[i]=analogRead(DIRENC);
  }
}

void pilOku(void)
{
  pilADC=analogRead(PIL);
  pilADC=analogRead(PIL);
  pilADC=analogRead(PIL);
}
void dumpDirenc (void)
{
 
  Serial.println("50 direnc okuması");
  for(byte i=0;i<50;i++)
  {
    Serial.print(i);
    Serial.print(". ");
    Serial.println(direncSeri[i]);
    
  }
}

Birkaç deneme yaptım ama bir tutarsızlık gördüm. 0.5 mA çekmesi gerekirken 1mA akım veriyor alet en yüksek direnç ölçüm kademesinde. Bunu TL431'in referans bacağına giden akım olduğunu düşünüyorum. bu akımın 5uA olması gerekiyor datasheetlere göre ama galiba bağladığım çip orjinal değil ve 500uA civarı gidiyor ref bacağına. Diğer kademelerde 5mA ve 50mA akım verildiğinden çalışmasında tutarsızlığa sebep olmuyor.

UART'a ölçümün ne kadar stabil olduğunu görmek için veri gönderdim. Ölçümleri en düşük kademede 50mA akımla yaptım. Referans voltajı dahili 1.1V, bunu Atmega168'in ref bacağından 1075mV olarak ölçüyorum unit139C mültimetre ile.
şönt-40mOhm.jpg


klips.jpg


Devreyi Korad ile besliyorum pilleri bağlamadım. 3.5 Volta kadar sorunsuz çalışıyor. Uart çeviriciye sadece data pinleri ve GND ile bağladım. bilgisayarın USBsinden beslemeye gürültü gelmemesini umarak.

Ölçüm sonuçları aşağıdaki gibi oldu. Bu sayılar sadece ADC okumasının sonucu üzerinde herhangi bir çevrim işlemi yapmıyorum. şimdilik 50mA ile 1oHm kademesinde gayet temiz ölçüm alabiliyorum.

seri monitör:
BASLA
kademe0  0

kademe3  14
50 direnc okuması
0. 14
1. 14
2. 14
3. 14
4. 14
5. 14
6. 14
7. 14
8. 14
9. 14
10. 14
11. 14
12. 14
13. 14
14. 14
15. 14
16. 14
17. 14
18. 14
19. 14
20. 14
21. 14
22. 14
23. 14
24. 14
25. 14
26. 14
27. 14
28. 14
29. 14
30. 14
31. 14
32. 14
33. 14
34. 14
35. 14
36. 14
37. 14
38. 14
39. 14
40. 14
41. 14
42. 14
43. 14
44. 14
45. 14
46. 14
47. 14
48. 14
49. 14
BASLA
kademe0  0

kademe3  64
50 direnc okuması
0. 64
1. 64
2. 64
3. 64
4. 64
5. 64
6. 64
7. 65
8. 65
9. 64
10. 64
11. 64
12. 64
13. 64
14. 64
15. 64
16. 64
17. 64
18. 65
19. 64
20. 64
21. 64
22. 64
23. 64
24. 64
25. 64
26. 64
27. 64
28. 64
29. 65
30. 64
31. 64
32. 65
33. 64
34. 65
35. 64
36. 64
37. 64
38. 64
39. 64
40. 64
41. 64
42. 65
43. 64
44. 64
45. 65
46. 64
47. 64
48. 64
49. 64
BASLA
kademe0  0

kademe3  36
50 direnc okuması
0. 36
1. 36
2. 36
3. 36
4. 36
5. 36
6. 36
7. 36
8. 36
9. 36
10. 36
11. 36
12. 36
13. 36
14. 36
15. 36
16. 36
17. 36
18. 36
19. 36
20. 36
21. 36
22. 36
23. 36
24. 36
25. 36
26. 36
27. 36
28. 36
29. 36
30. 36
31. 36
32. 36
33. 36
34. 36
35. 36
36. 36
37. 36
38. 36
39. 36
40. 36
41. 36
42. 36
43. 36
44. 36
45. 36
46. 36
47. 36
48. 36
49. 36
BASLA
kademe0  0

kademe3  37
50 direnc okuması
0. 37
1. 37
2. 37
3. 37
4. 37
5. 37
6. 38
7. 37
8. 37
9. 37
10. 37
11. 37
12. 37
13. 37
14. 37
15. 37
16. 37
17. 37
18. 37
19. 37
20. 37
21. 37
22. 37
23. 37
24. 37
25. 37
26. 37
27. 37
28. 37
29. 37
30. 37
31. 37
32. 37
33. 37
34. 37
35. 37
36. 37
37. 37
38. 37
39. 37
40. 37
41. 37
42. 37
43. 37
44. 37
45. 37
46. 37
47. 37
48. 37
49. 37

Ölçümler 4 kablo ölçüm değil. 14 aldığım ADC okuması probların kısa devre direnci. Bunda klipslerin lehim noktasından kıskacın ucuna kadar olan direnç ve kontak direncini ölçmüş oluyorum.

64 okuduğum ADC, fotoğraftaki seri bağlı 20mOhmluk 2şönt dirençten geliyor.
37 ve 36 bu şöntlerin lehim noktasından ayrı ayrı ölçümler. Probu ayırıp tekrar ölçünce gürültü olmayan ama farklı ölçümler okuyorum 64 ölçtüğüm direnç bir sonraki söküp bağlamalarda 185 okunabiliyor, yine gürültü olmuyor; 50 okumada 2-3 farklı değer okuyorum sadece 1 birim sapıyor. aynı direncin farklı okunmasını probların kontak direncine bağlıyorum. şu halde sens girişi ve akım kaynağı 2 proba beraber lehimli, bu da kontak direncinin ölçümü bozması anlamına geliyor. Birazdan 4 probla deneyeceğim.
 
4 kablo kısa devre bağlayıp aldığım ölçüm

4kablo kısadevre.jpg


4kablo kısadevre:
BASLA
kademe0  0

kademe3  0
50 direnc okuması
0. 0
1. 0
2. 0
3. 0
4. 0
5. 0
6. 0
7. 0
8. 0
9. 0
10. 0
11. 0
12. 0
13. 0
14. 0
15. 0
16. 0
17. 0
18. 0
19. 0
20. 0
21. 0
22. 0
23. 0
24. 0
25. 0
26. 0
27. 0
28. 0
29. 0
30. 0
31. 0
32. 0
33. 0
34. 0
35. 0
36. 0
37. 0
38. 0
39. 0
40. 0
41. 0
42. 0
43. 0
44. 0
45. 0
46. 0
47. 0
48. 0
49. 0


Aşağıda 40 mOhm ölçüm. Beyaz kablo "sens+", kırmızı kablo "akım+", yeşil kablo "sense-" ve siyah kablo "akım-".

4kablo40mOhm.jpg


4 kablo 40 mOhm:
BASLA
kademe0  0

kademe3  35
50 direnc okuması
0. 35
1. 36
2. 35
3. 36
4. 35
5. 35
6. 35
7. 35
8. 35
9. 35
10. 35
11. 36
12. 36
13. 35
14. 36
15. 35
16. 36
17. 35
18. 35
19. 36
20. 35
21. 35
22. 36
23. 36
24. 35
25. 35
26. 35
27. 36
28. 36
29. 35
30. 36
31. 35
32. 36
33. 35
34. 35
35. 36
36. 35
37. 35
38. 35
39. 35
40. 35
41. 36
42. 35
43. 35
44. 35
45. 36
46. 36
47. 36
48. 35
49. 35

En son akım problarının yerini değiştirmeden "sense-" probunu 20 mOhm'a denk gelecek şekilde ortaya iliştiriyorum.
4kablo 20mOhm.jpg


Okunan sonuçlar:
4 kablo 20 mOhm:
BASLA
kademe0  0

kademe3  16
50 direnc okuması
0. 16
1. 16
2. 16
3. 16
4. 16
5. 16
6. 16
7. 16
8. 16
9. 16
10. 16
11. 16
12. 16
13. 16
14. 16
15. 16
16. 16
17. 16
18. 16
19. 16
20. 16
21. 16
22. 16
23. 16
24. 16
25. 16
26. 16
27. 16
28. 16
29. 16
30. 16
31. 16
32. 16
33. 16
34. 16
35. 16
36. 16
37. 16
38. 16
39. 16
40. 16
41. 16
42. 16
43. 16
44. 16
45. 16
46. 16
47. 16
48. 16
49. 17

Ardışık tutarlı okumalar alıyorum. kontak direncinin etkisi 4 kablo ölçüm ile ortadan kalkıyor.

Bu devre doğru dürüst kelvin klipslerden kolay ve düzgün ölçümler alabilecek gibi duruyor. mOhm kademesinde beklediğim şekilde ölçüm yapacak. mOhm kademesinde akımı 100mA ayarlarsam 1mOhm çözünürlükle 500mOhm'a kadar ölçüm yapabilecek.

Diğer kademelerde gürültü etkisinin daha fazla olacağını düşünüyorum. Deneyeyim.
 
@semih_s
Semih Hocam elinize sağlık
Bu PCB ye komponentleri diğer taraftan lehimleseydiniz sanki daha sade görünürdü gibi geldi bana .
Bu şekilde havya ile çalışmak zorlamadımı ?
 
Son düzenleme:
Semih Hocam elinize sağlık
Bu PCB ye komponentleri diğer taraftan lehimleseydiniz sanki daha sade görünürdü gibi geldi bana .
Bu şekilde havya ile çalışmak zorlamadımı ?
:) en azından headerlara delik delmek iyi olurdu. Devrede denemeler yaparken diğer komponentleri söküp takmak böyle daha kolay oluyor. Gece bayağı bir uğraştım. Devredeki sorunları çözdüm. Tüm kademelerde stabil ölçüm alıyor devre.
Headerları söküp deliklerini deleceğim. Ufak bir kutuya temiz bir şekilde girecek hale gelecek.
 
Kutu için Altınkayanın sitesinin araştırın bence. Neredeyse hemen her ay yeni kutular tasarlayıp üretiyorlar.
İleride display ekleme ihtimaliniz varsa ona göre kutuyu düşünmekte fayda var.
Ayrıca bu firmada LED lerin ışığını kutunun yüzeyine taşımak için kullanılan LED çubuklar ,RF için filitre eden kutular falanda var.
Bu cihaz için gerek olmasa bile başka cihazlar için ihtiyaç olabilir.Aklınızda olsun.
 
Son düzenleme:
@semih_s
Hocam , kartlardaki kısa devre olan bölgeye yaklaştıkça bölgeyi anlayabilecek kadar hassas ölçüm yapabiliyormu ?
Yani sizin yaptığınız kısa devre bağlantısına yaklaştıkça ölçtüğü değer değişiyormu?
Böyle bir test yaptınızmı?
 

Çevrimiçi personel

Forum istatistikleri

Konular
5,445
Mesajlar
92,824
Üyeler
2,389
Son üye
muratcan16x

Son kaynaklar

Son profil mesajları

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)
Kesici/Spindle hızı hesaplamak için SpreadSheet UDF'leri kullanın, hesap makinesi çok eski kalan bir yöntem :)
İkinci Mesaj deneme 3 4 :D
Dr. Bülent Başaran,
Elektrik ve Elektronik Mühendisi
Yonga Tasarım Özdevinimcisi
Üç güzel "çocuk" babası
Ortahisar/Ürgüp/Konya/Ankara/Pittsburgh/San Francisco/Atlanta/Alaçatı/Taşucu...

Back
Top