ads1232

Başlatan ugurer, 10 Mart 2017, 10:35:03

ugurer

Merhabalar. Bir proje için ads1232 kullanmam gerekiyor fakat okuma işleminin nasıl yapılacağını çözemedim. Program olarak CCS-C kullanıyorum bu konuda deneyimli olan birileri yardım ederse çok sevinirim.

Murat Mert

elindeki ürün bu mu? yoksa kullanmayı mı düşünüyorsun? Micro chipin ürünleri var onlara bak derim.
mert07

ugurer

Elimde ki ürün bu load cell ile kullanacağım

Murat Mert

spi okumada ne durumdasın data sheetine baktın mı? İncelemeden konuştum. hiç deneme yaptınmı?
mert07

ugurer

Aynen bir kaç deneme yaptım paylaşıyım hemen onları. Datasheet'ini inceledim yani orada anlatmışlar tabi ama denediğim yollarda atıyorum 86525 gibi bir değer sabit kalıyor değişmiyor hiç ve hep aynı değeri okuyorum.
#include <main.h>
#include <max7219.c>//ekran için 
#define buzzer pin_d7

#define dout pin_a5 //okuma pini
#define clk pin_a4 // clk pini
#define pwd  pin_a3//power pini
#define zero pin_b3//deneme için tuş atadım önemli değil bu 

void yaz(int32 Val,int8 &a,int8 &b,int8 &c,int8 &d,int8 &e,int8 &f);//yazdırma fonksiyonu
signed int32 oku(void);
int16 i=0;
int a,b,c,d,e,f;
int32 deger=0;   

signed int32 oku(void){//okuma kısmı 

signed int32 adc_bit;
for(i=0;i<24;i++){
adc_bit=adc_bit<<1;
adc_bit=dout;
output_high(clk);
delay_ms(1);
output_low(clk);
delay_ms(1);
}
return(adc_bit);
}
 


void yaz(int32 Val,int8 &a,int8 &b,int8 &c,int8 &d,int8 &e,int8 &f)
{   a=0;b=0;c=0;d=0;e=0;f=0;
    while(val>=100000){val-=100000,a++;}
    while(val>=10000){val-=10000,b++;}
    while(val>=1000){val-=1000,c++;}
    while(val>=100){val-=100,d++;}
    while(val>=10){val-=10,e++;}
    while(val>=1){val-=1,f++;}
    write7219(6,a);
    write7219(5,b);
    write7219(4,c);
    write7219(3,d);
    write7219(2,e);
    write7219(1,f);
 
}

void main() 
{
    init7219();
    for(i=0;i<8;i++){write7219(i,15);} delay_ms(100);
    output_high(buzzer);
    delay_ms(1000);
    output_low(buzzer);
    delay_ms(1000);
    output_high(buzzer);
    delay_ms(1000);
    output_low(buzzer); 
    output_low(pwd); delay_ms(50); output_high(pwd);output_high(clk);//datasheetten anladığım kadarıyla bunların yapılması gerekiyor
   while(TRUE)
   {
   deger=oku();
   if(input(zero)){while(input(zero));deger=0;output_high(buzzer);delay_ms(50);output_low(buzzer);};
   yaz(deger,a,b,c,d,e,f);
   }
}

Murat Mert

donanımsal pinlerle okumaya çalışsan.
mert07

ugurer

Donanımsal pinlerle okumaya çalışıyorum ama olduramadım. Datasheet'ten anladığım kadarıyla
- Önce powerdown pini high olacak
- Okuma bilgisi hazır olduğu zaman kendisi high oluyor zaten
- High olduktan sonra döngüye sokup 24 clock darbesi gönderip bilgi okumamız lazım

Benim anladığım kadarıyla böyle olmalı ama olduramadım. Yazdığım kodlarda paylaşlaştığım gibi. Önerilerinize açığım 1 hafta oldu artık okumam lazım şu ADC'yi. Yardımlarınız için şimdiden teşekkürler.

ugurer

Yardım edebilecek ya da daha kullanan yok mu hiç ??

striger

bir kac duzenleme gerekebilir belki ama isinizi gorecektir muhtemelen

ADS1230.c
// compiler CCS
// author Str

// check if ADS1230 is ready
// from the datasheet: When output data is not ready for retrieval, digital output pin DOUT is high. Serial clock
// input PD_SCK should be low. When DOUT goes to low, it indicates data is ready for retrieval.
bool ADS1230_isReady();

// waits for the chip to be ready and returns a reading
signed int32 ADS1230_read();

// returns an average reading; times = how many times to read
signed int32 ADS1230_readAverage(unsigned int8 times);

// returns (read_average() - OFFSET), that is the current value without the tare weight; times = how many readings to do
signed int32 ADS1230_getValue(unsigned int8 times);

// returns get_value() divided by SCALE, that is the raw value divided by a value obtained via calibration
// times = how many readings to d
//unsigned int16 ADS1230_getUnits(int8 times);
float ADS1230_getUnits(unsigned int8 times);

// set the OFFSET value for tare weight; times = how many times to read the tare value
void ADS1230_tare(unsigned int8 times);

// set the SCALE value; this value is used to convert the raw data to "human readable" data (measure units)
void ADS1230_setScale(float scales);

// set OFFSET, the value that's subtracted from the actual reading (tare weight)
void ADS1230_setOffset(signed int32 offsets);


// CONSTANTS //
// - Connection Pins (CHANGE THESE PINS AS YOU WISH)
#ifndef ADS1230_SCLK_pin
   #define ADS1230_SCLK_pin   PIN_A3 // Power Down and Serial Clock Input
#endif
#ifndef ADS1230_DOUT_pin
   #define ADS1230_DOUT_pin     PIN_A4 // Serial Data Output
#endif


unsigned int8 GAIN;      // amplification factor
signed int32 OFFSET;   // used for tare weight
float SCALE;   // used to return weight in grams, kg, ounces, whatever


bool ADS1230_isReady()
{
   return(!input(ADS1230_DOUT_pin));
}

signed int32 ADS1230_read()
{
   unsigned int8 i;
   signed int32 value = 0;

   // wait for the chip to become ready
   while(!ADS1230_isReady());
   // pulse the clock pin 24 times to read the data
   for (i = 0; i < 24; i++)
   {
      output_high(ADS1230_SCLK_pin);
      value = value << 1;
      output_low(ADS1230_SCLK_pin);

      if(!ADS1230_isReady()) value++;
   }

   value = value >> 4;

   value = value ^ 0x800000;

   return(value);
}
//------------------------------------------------------------------------------
signed int32 ADS1230_readAverage(unsigned int8 times)
{
   signed int32 sum = 0;
   unsigned int8 i;

   for(i = 0; i < times; i++)
   {
      sum += ADS1230_read();
   }
   return(sum / times);
}
//------------------------------------------------------------------------------
signed int32 ADS1230_getValue(unsigned int8 times)
{
   signed int32 diff = 0;
   diff = ADS1230_readAverage(times) - OFFSET;
   return(diff);
}
//------------------------------------------------------------------------------
float ADS1230_getUnits(unsigned int8 times)
{
   return((float)(ADS1230_getValue(times) / SCALE));
}
//------------------------------------------------------------------------------
void ADS1230_tare(unsigned int8 times)
{
   signed int32 sum;
   sum = ADS1230_readAverage(times);
   ADS1230_setOffset(sum);
}

void ADS1230_setScale(float scales)
{
   SCALE = scales;
}

void ADS1230_setOffset(signed int32 offsets)
{
   OFFSET = offsets;
}

ugurer

@striger hocam paylaşımınız için teşekkürler öncelikle. ADS1232'ye göre ayarladım kodları fakat bir gelişme olmadı maalesef. Ekranda hep sabit değer kalıyor ve hiç değişmiyor. Yani sanki bir okuma yapıp tekrar çalışmıyor gibi bir görüntü var. Önerebileceğiniz herhangi bir yöntem var mıdır kontrol etmem için.

Fixxer

Donanımsal olarak, SPEED ve  Gain ayarlarını değiştirip denediniz mi ?!
...............................

ugurer

Sorunu hallettim şuan adc'yi beslemeyi unutmuşum acemilik işte  ;D. Yardım eden herkese teşekkür ediyorum özellikle @Murat Mert hocam çok sağolun. @striger hocamın paylaştığı kodlar çalışıyor. Yazdığım kodları paylaşıyım yine de
#include <main.h>
#include <max7219.c>
#include <ads1230.c>

#define buzzer pin_d7
//#define dout pin_a5
//#define clok  pin_a4
#define pwd  pin_a3 //uyku modu için kullanacağım direk high olarak da kullanılabilir.
#define zero pin_b3

void yaz(int32 Val,int8 &a,int8 &b,int8 &c,int8 &d,int8 &e,int8 &f);
long adc_oku(void);
int16 i=0;
int a,b,c,d,e,f;
int32 deger=0;


void yaz(int32 Val,int8 &a,int8 &b,int8 &c,int8 &d,int8 &e,int8 &f)
{   a=0;b=0;c=0;d=0;e=0;f=0;
    while(val>=100000){val-=100000,a++;}
    while(val>=10000){val-=10000,b++;}
    while(val>=1000){val-=1000,c++;}
    while(val>=100){val-=100,d++;}
    while(val>=10){val-=10,e++;}
    while(val>=1){val-=1,f++;}
    write7219(6,a);
    write7219(5,b);
    write7219(4,c);
    write7219(3,d);
    write7219(2,e);
    write7219(1,f);
 
}

void main() 
{      
    init7219();
    for(i=0;i<10;i++){write7219(1,i);write7219(2,i);write7219(3,i);write7219(4,i);
    write7219(5,i);write7219(6,i);write7219(7,i);output_high(buzzer);delay_ms(100);    
    output_low(buzzer);}          
    output_high(pwd);
    while(TRUE)
   { t
    deger=ADS1230_read();
    if(input(zero)){while(input(zero));deger=0;output_high(buzzer);delay_ms(50);output_low(buzzer);}
    yaz(deger,a,b,c,d,e,f);  
   }
     
}

tekosis

24bit adc ile saniyede kaç okuma yapılabiliyor?
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

ugurer

İki farklı hız modu var birinde 10 okuma diğerinde 80 okuma olarak yazıyor datasheet'te.