Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

PIC ve MAX132 18-Bit ADC

Başlatan tnen, 25 Temmuz 2008, 21:35:23

tnen

Arkadaslar daha once maxim'in 18 bit adc si olan max132 ile ugrasan var mıdır.Eger varsa bana bu konuda yardımcı olabilirmisiniz. Ben basic de bi kod yazdım ama okudugum deger cok fazla geziniyor . Yaptıgımız kart girişine loadcell bağladık ve loadcell uzerindeki yuk sabit oldugu halde çevirim sonunda ADC den okudugumuz deger neredeyse minimum ile max arasında geziniyor. Şimdiden teşekkurler.
Not: kodu buraya şu anda koyamıyorum çünkü bu bilgisayarda değil p.tesi yuklerim.

Klein

önce sorunun donanım mı? yazılım mı? olduğunu tespit etmek gerek. ADC girişini ref veya gnd ile birleştirdiğinde  salınım sürüyor mu?

crypto

Bu tür çalışmalarda besleme ve referans voltj değerlerinin çok stabil olması gerekiyor. Aksi halde en küçük salınımlarda okunan değerler arasında büyük farklar oluşur.

Loadcell den mikrovolt seviyelerinde değerler okumanız gerekecektir. Bu kadar hassasiyet isteyen bir devrede kullanacağınız loadcell e bağlayacağınız kablo, plaket, lehim vs.. de çok önem taşıyor. Bence ilk yapmanız gereken bu şartları uygun hale getirmek.

Okuduğunuz değerlerin min-max arasında gezinmesi de okuma kodlarından kaynaklı hatalardan olabilir.

Yaptığınız devre şeması ve kodları da gönderdiğinizde belki daha iyi yardımcı oluruz.

tnen

Evet ADC nini analog girişlerini kısa devre yapıp gnd ye verdiğimdede salınım devam ediyor. Max132 ile yapılan ornek bir kod buldum fakat bu kod pc com portu ile haberleşiyor. Ben PC den kurtulup bu işi pic e yaptırmak istiyorum.Datasheetten anladığım kadarıyla eğer yanlış yorumlamadıysam CS pinini low yaptıktan sonra control register degerini en buyuk degerlikli bitten başlayarak SCLK pininden verdiğim her saat darbesinin yukselen kenarı ile Max a yazıyorum aynı saat darbesinin dusen kenarı ilede DOUT pininden datayı bit bit alıp kardırıyorum. Aldığım bit enkucuk degerlikli pinden itibaren benim buldugum ornek yazılımda tek anlamadığım yer control registerına yazılan pes pese 0X00 hex degeri datasheet e  gore bence bu degerden birinin 0X02 olması gerektiğini düşünüyorum. Ben kodu basice ceviridm diye düşünüyorum ama bi sorun var bulamadım.
Crypto hocam kodu ve şemayı şu anda koyamıyorum çünkü kod iş yerimdeki pc de tabiki şemada P.tesi gunu uplad ederim .
Bulduğum kod aşagıda;

#include <stdio.h>
#include <dos.h>
#include <time.h>
#include <conio.h>
#include <bios.h>
#include <conio.h>
#include <dos.h>
#define COM1    0
#define MCR	4     				 /* control register    */
#define MSR	6               		 /* status register	*/

int i, j, base_add1=0x3f8, base_add2=0x2f8, out_data=0x03, in_data[4];

float data;

void send_clk(void)
{
  delay(1);
  outportb(base_add1, 0x00);
  delay(3);
}

void read_port(void)
{
  int control[4], out_control;
  data=0;
  for (i=0; i<4; i++)
	 in_data[i]=0;
  control[0]=0x82;
  control[1]=0x04;
  control[2]=0x00; //Bunlardan biri bence 0X02 olmalı
  control[3]=0x00; //
  out_data|=0x02;
  outportb(base_add1+MCR, out_data);         		/* CS high	*/
  delay(10);
  out_data&=0x01;
  outportb(base_add1+MCR, out_data);         		/* CS low	*/
  delay(10);
  out_control=control[0];
  for (i=0; i<8; i++)
	{
	  if (out_control>=0x80)
		 out_data|=0x01;
	  else
		 out_data&=0x02;
	  outportb(base_add1+MCR, out_data);
	  send_clk();					/* clock out	*/
	  out_control&=0x7f;
	  out_control=out_control*2;
	}
  out_data|=0x02;
  outportb(base_add1+MCR, out_data);         		/* CS high	*/
  delay(10);
  do{
	}while((inportb(base_add1+MSR)&0x40)==0); 	/* waiting for EOC=high	*/
  for (j=1; j<4; j++)
	{
	  out_control=control[j];
	  in_data[j]=0;
	  out_data&=0x01;
	  outportb(base_add1+MCR, out_data);  	/* CS low	*/
	  delay(10);
	  for (i=0; i<8; i++)
		 {
	if (out_control>=0x80)
	  out_data|=0x01;
	else
	  out_data&=0x02;
	outportb(base_add1+MCR, out_data);
	in_data[j]=in_data[j]*2+(inportb(base_add1+MSR)&0x80)/0x80;
	send_clk();			      	/* clock out	*/
	out_control&=0x7f;
	out_control=out_control*2;
		}
	  out_data|=0x02;
	  outportb(base_add1+MCR, out_data);         	/* CE high	*/
	  delay(10);
	}
  if ((in_data[1]&0x08)==0)
	 data=(float)(in_data[1]&0x07)+(float)(in_data[2])*2048+(float)(in_data[3])*8;
  else                                      	/* reading is negative 	*/
	{
	  in_data[1]=in_data[1]&0x07;
	  in_data[1]=(8-in_data[1])&0x07;
	  in_data[2]=(256-in_data[2])&0xff;
	  in_data[3]=(256-in_data[3])&0xff;
	 data=-((float)(in_data[1])+(float)(in_data[2])*2048+(float)(in_data[3])*8);
	}
}

void dis_data(void)
{
  float show_data;
  show_data=0.000002*data;
  gotoxy(1,1);
  printf("%.5f  ", show_data);
  gotoxy(1,1);
}

void init(void)
{
  bioscom(0, 255, COM1);                        /* set up COM1		*/
  out_data=0x02;
  outportb(base_add1+MCR, out_data);         	/* CS=high, DIN=low	*/
  delay(100);
}

void main(void)
{
  clrscr();
  init();
  gotoxy(60,24);
  printf("Hit any key to quit");
  do{
	read_port();
	dis_data();
	delay(500);
	 } while(!kbhit());
}


Kodlarınızı kod tagı içine koyun ki RAHAT okunsun. Allegro

tnen

Benim yazdığım basic code asagıda bir sorun bulamadım. Birde siz bakarsanız sevinirim.

INCLUDE "MODEDEFS.BAS"
ADCON1 = 7 'PORTA VE PORTE DIGITAL
OPTION_REG.7 = 0
TRISB = %00101110 
TRISD.7 = 1        'MAX 132 NIN EOC ICIN GIRIS 
CS VAR PORTB.7     'MAX 132 ICIN CS 
DIN VAR PORTB.6    'MAX 132'YE DIN
DOUT VAR PORTB.5   'MAX 132 DEN DOUT
SCLK VAR PORTB.4   'MAX 132 ICIN SCLK
EOC VAR PORTD.7    'MAX 132 ICIN EOC

DARA VAR PORTB.3   'KANTAR ICIN DARA ALMA TUSU
SIFIRLAMA VAR PORTB.2 'KANTAR ICIN ZERO TUSU
KALIBRE VAR PORTB.1  'KANTAR ICIN KALIBRASYON TUSU

PORTA = 0
PORTB = 238
PORTC = 0
PORTD = 0
PORTE = 0

CS = 1

DEFINE LCD_DREG PORTC
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTD
DEFINE LCD_RSBIT 3
DEFINE LCD_EREG PORTD
DEFINE LCD_EBIT 2
I VAR BYTE
K VAR BYTE
DEGER VAR BYTE
AGIRLIK VAR WORD
CONTROL VAR WORD
CONTROLLER VAR BYTE [5]
DATALAR VAR WORD [5]
CONTROLLER[0]=$82
CONTROLLER[1]=$04
CONTROLLER[2]=$00
CONTROLLER[3]=$00
MAIN:

GOSUB MAX132
GOSUB HESAPLA
GOSUB LCD_YAZ
PAUSE 250
FOR I = 0 TO 3
DATALAR[I]=0
NEXT I
GOTO MAIN
END

MAX132:
CS = 1
PAUSE 10
CS = 0
PAUSE 10
CONTROL = CONTROLLER[0]
FOR I = 0 TO 7
    DIN = CONTROL.7 'registerin 7. biti
    SCLK = 1
    PAUSE 2
    SCLK = 0
    PAUSE 2
    CONTROL = CONTROL<<1 'registeri sola 1 bit kaydır
NEXT I

CS = 1
PAUSE 10
WHILE EOC = 0
PAUSEUS 1
WEND

FOR I = 1 TO 3
    CONTROL = CONTROLLER[I]
    DATALAR[I]=0
    CS = 0
    PAUSE 10
    FOR K=0 TO 7
        DIN = CONTROL.7
        PAUSE 1
        SCLK = 1
        PAUSE 1
        SCLK = 0
        DEGER.0=DOUT 'data yı bit bit oku
        PAUSE 5
        DEGER = DEGER<<1 'data yı 1bit sola kaydır
        CONTROL = CONTROL<<1
    NEXT K
    DATALAR[I]=DEGER
    deger = 0
    CS = 1
    PAUSE 10
    
next I
RETURN

HESAPLA:
'AGIRLIK = 0
'IF (DATALAR[1]&$08)=0 THEN
'DATALAR[1]=DATALAR[1]&$07
'DATALAR[2]=DATALAR[2]*2048
'DATALAR[3]=DATALAR[3]*8
'AGIRLIK =DATALAR[1]+DATALAR[2]+DATALAR[3] 
'LCDOUT $FE,$D4
'LCDOUT "AGIRLIK:",DEC5 AGIRLIK ,"  " 
'ELSE
'DATALAR[1]=DATALAR[1]&$07
'DATALAR[1]=(8-DATALAR[1])&$07
'DATALAR[2]=(256-DATALAR[2])&$FF
'DATALAR[3]=(256-DATALAR[3])&$FF
'DATALAR[2]=DATALAR[2]*2048
'DATALAR[3]=DATALAR[3]*8
'AGIRLIK =DATALAR[1]+DATALAR[2]+DATALAR[3]
'LCDOUT $FE,$D4
'LCDOUT "AGIRLIK:","-",DEC5 AGIRLIK 
'ENDIF

RETURN

LCD_YAZ:
LCDOUT $FE,2
LCDOUT "DT1:",BIN16 DATALAR[1]
LCDOUT $FE,$C0
LCDOUT "DT2:",BIN16 DATALAR[2]
LCDOUT $FE,$94
LCDOUT "DT3:",BIN16 DATALAR[3]
RETURN

tnen

Arkadaşlar hala problem devam ediyor. Yaptığım en son işlemlerden biri besleme problemi var mı diye düşünerek max132 yi pil ile besledim. Ama sonuç pek fazla değişmedi.Hala problemin yazılımsal mı donanımsal mı anlamış değilim. P.tesiden itibaren bulduğum PC com portuna bağlanabilen devreyi yapıp C dilinde yazılan daha once bahsettiğim programı PC aracılığı ile deniyecem. Olumlu bir gelişme olursa burada paylaşırım.