mcp3553 22 bit adc kullanımı hakkında..

Başlatan mustafa_cmbz, 10 Mart 2013, 19:00:36

mustafa_cmbz

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2013 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 27.01.2013                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
   
         DEVICE = 16F877A
        'CONFIG  WDT_OFF , PWRTE_ON , BODEN_OFF , LVP_OFF , CP_OFF
        CONFIG CP_ALL, CPD_ON, WDT_OFF, XT_OSC, PWRTE_ON, BODEN_OFF, WRT_OFF, LVP_OFF, DEBUG_OFF
         XTAL = 4
         
         TRISA=0
         PORTA=0
         
         TRISB=1
         PORTB=0
         
         TRISC=1
         PORTC=1
       
         TRISD=0
         PORTD=0
         
         TRISE=1
         PORTE=1
         
        'CCP1CON   = %00001100
        'DECLARE CCP1_PIN PORTC.2
       
       TRISA=%11111111
         
         

ALL_DIGITAL = TRUE

LCD_DTPIN = PORTD.4
LCD_RSPIN = PORTD.2
LCD_ENPIN = PORTD.3
LCD_INTERFACE = 4
LCD_LINES = 2
LCD_TYPE = 0
   
         
       
         WATCHDOG = OFF

 
         
SYMBOL  CS     PORTB.0
SYMBOL  RDY    PORTB.2
SYMBOL  SCLK   PORTB.1

DIM     x      AS WORD
DIM     deney      AS WORD
DIM     var1   AS FLOAT
kur:
            HIGH    CS            'CONVERSİYON A BASLA
            DELAYMS 100                'burada CS low yapılır ardından hemen
            LOW     CS             'RDY "1" olur, yani çevirim başlar.     
lets_go:
    IF  RDY=0   THEN    CONVERT ' çevirim bittiğinde RDY "0" olur bunu
    GOTO    lets_go                            'takip et ve CONVERT e giderek
CONVERT:                                       ' Clock ile var1 e değişkeni yükle
    SHIN RDY , SCLK , MSBPRE , [var1\18 ]
    FOR x=0 TO   8 STEP    1                ' for next döngüsü ADC toplamda
    HIGH    SCLK                           '24 veya 25 clock istediğinden ve
    DELAYUS 3                                   'bana 16bit çözünürlük gerekli   
    LOW SCLK                               'olduğundan 24 clock tamamlamak   
    NEXT                                            'eklenmiştir.
CONVERT_FINISH:
var1=var1/24
deney=var1
    PRINT   AT  1,1,DEC var1 
    PRINT   AT  2,1,DEC deney
    DELAYMS 5
GOTO    lets_go   



merhabalar ETE  hocam..

Mcp3553 ile protonda bir proje yapmaya çalışıyorum..

Çözünürlük fazla olmasını istediğim için 22bit adc aldım fakat araştırmaların neticesinde protonda yazılan 16bit olacak şekilde kullanılan bir program buldum.

Bu entegreyi nasıl 22bit çözünürlükte kullanabilirim...neyi nasıl hesaplamalıyım? hangi datayı nasıl gönderip almalıyım..

Birde float değişkeni ile çok virgüllü oluyor bu konuda bana yardımcı olabilirmisiniz?

ete

Data sheet de her şey açıklanmış ama sen bir başkasından duymayı tercih ediyorsun anlaşılan.
Tabiki önceden hiç görmediğim ve kullanmadığım bir ADC çevirici bu. Yapmam gerekeni yaptım ve Data sheete bakarak senin için bilgiler edinmeye çalıştım.
Data sheet'e bakılırsa 2 modda çalışıyor. Tek okuma yada sürekli okuma modu. Ağırlık sürekli okuma modunda olduğu için ona ait daha fazla detay vermişler.
Aletin Bir CLK bir DATA birde Chip Seçim pini var. Seçim pini aynı data ve Clk hattına birden fazla entegre bağlamanı sağlıyor.
Biz şimdlik tek entegreyi kontrol edeceğiz.
ADC çevrimi CS ucunun LOW a çekilmesi ile başlıyor. Çevrim tamamlanıncaya kadar Data pini HIGH da bekliyor. Bu aşamada bu pinin bağlı olduğu işlemci pinini giriş yaparak Data pininin LOW olduğu konumu yakalamak gerekir. Data pini LOW olduğu anda çevrim tamamlanmış demektir.
Sıra Digitale çevrilen bilgiyi almaya gelmiştir artık. Data sheet diyorki Alet 22 bit olmasına rağmen sen 24 bit okuyacaksın. İlave iki bit Overflow yani taşma bitidir der.
Bit 23 Taşma biti olup Vin<-Vref olduğu zaman  bu bit 1 olmaktadır.  Bit 22 yine taşma biti olup Vin>Vref olduğu zaman 1 olmaktadır.
Bit21 ile Bit0 arasındaki bitler 22 bitlik ADC karşılığına denk gelmektedir. Bit21 aynı zamanda işaret biti olup Okunan değer pozitif ise sıfır, negatif ise 1 olmaktadır.

Data sheet e göre MCU eşliğinde okuma yaparken iki mode kullanılıyor.
Birincide En yüksek bit en önce çekiliyor ve CLK High da kalıyor.  Bu modda okunacak bilgi 3 ayrı byte halinde okunuyor.
Diğeri format olarak uygun olmadığı için bunu tercih ettim.
PBP da Shiftin komutu parametrelerine bakarsan  Mode-4 için şunları yazmışlar,
"Shift data in highest bit first, Read data before sending clock. Clock idles high." bu açıklama aynen data sheetin istediği gibi sanırım bunu kullanmak gerekecek.
Örnek satır yazacak olursak,

CS=0
INPUT DTA
WHILE DTA=1:WEND
SHIFTIN DTA,CLK,4,[VAR_C,VAR_B,VAR_A]
VAR_C=VAR_C & %00111111   
CS=1

Kod içinde yer alan VAR_C düzeltmesi taşma bitlerini okunan değerden ayıklamak içindir
Gerekirse bu bitler bir başka değişkene aktarılarak taşma kontrolüde yapılabilir.
Sonuçta elinde 3 ayrı byte şeklinde 22 bitlik ADC değeri durmaktadır. Gerisi bunu değerlendirmeye kalıyor.
İster 32 bitlik değişken kullan ve bunları bir değişkende topla sonra sayı ile istediğin şekilde oyna istersen byte byte değerlendir.
Benden bu kadar.
Ete




mikro29

#2
Hayırlı günler,
MCP3553 ile 2.5V ve -2.5V ölçmeye çalışıyorum, lakin protonbasic gazabına uğruyorum. Protonbasic ondalıklı sayıları düzgün işleyemediği için sonuç yanlış çıkıyor.Onun için sayıları yuvarlamayı denedik ama yine sonuç problemli forumlarda da aradığımı bulamadım c dillerinde yazılmış kodlar var bana basic lazım yardımlarınızı bekliyorum. Gerçek ortamdada deniyorum aynı.
Protonbasic da yazdığımız kodlar


Dim SONUC As Float
Dim SONUC2 As Dword
Dim ILK As Byte
Dim ORT As Byte
Dim SON As Byte
Dim TOPLAM1 As Dword
Dim TOPLAM2 As Dword
Dim TOPLAM3 As Dword
Dim GEN As SDword
'SDWORD = -2147483648 ve +2147483647
'FLOAT  = -2147483646.999 ve +2147483646.999

' MCP3553 PİNLERİ
Symbol SDI = PORTA.0
Symbol SCK = PORTA.1
Symbol CS  = PORTA.7

' REF VOLTAJI = 2.500

BASLA: 
CS=0
   Input SDI
    While SDI=1:Wend
    SHIn SDI,SCK,4,[SON,ORT,ILK]
CS=1
   
TOPLAM1 = ILK.0 * 1 + ILK.1 * 2 + ILK.2 * 4 + ILK.3 * 8 + ILK.4 * 16 + ILK.5 * 32 + ILK.6 * 64 +ILK.7 * 128 '0 - 7 BİTLER
TOPLAM2 = ORT.0 * 256 + ORT.1 * 512 + ORT.2 * 1024 + ORT.3 * 2048 + ORT.4 * 4096 + ORT.5 * 8192 + ORT.6 * 16384 ORT.7 * 32768 ' 8 - 15 BİTLER
TOPLAM3 = SON.0 * 65536 + SON.1 * 131072 + SON.2 * 262144 + SON.3 * 524288 '+ SON.4 * 1048576' + SON.5 * 2097152
GEN = TOPLAM1 + TOPLAM2 + TOPLAM3   

If SON.4 = 1  Then ' 21.BIT = FARK POZİTİF İSE 
    SONUC = (GEN-1048576)*10/2097151' * 10/2097151)'2462    '4194303=0.00000119209V = 0,0011 mV
    HSerOut [Dec4 SONUC,"V",13,10]
        Else 
    SONUC = (GEN*10)/2097151'0.000002517)    '4194303=0.00000119209V = 0,0011 mV
    HSerOut [Dec4 SONUC,"V",13,10]
EndIf

DelayMS 500
GoTo BASLA
End




ete

Aldığın değeri neden birde tek tek bit bazında hesaplamşsın onu anlamadım.
Elinde 3 adet 8 bitlik değişken var ve bunu 32'bite çevirmekistiyorsun anlaşılan.
Bunun basicde kolay yolu şöyledir.
Değişken tanımlarken
DIM TOPLAM AS DWORD diye bir değişken tanımladın diyelim.
DIM BIR AS TOPLAM.BYTE0
DIM IKI AS  TOPLAM.BYTE1
DIM UC AS  TOPLAM.BYTE2
şeklinde bir tanımlama yaparsan ve 
SHIn SDI,SCK,4,[UC,IKI,BIR]
şeklinde bir komut kullanırsan otomatikman sonuç değerin TOPLAM değişkeninde yer alır ve hiç bir hesaplama yapman gerekmez. Ancak UC olarak isimlendiren sonbyte aynı zaamnda overflow bitlerinide ihtiva ettiği için doğru hesap UC=UC & %00011111 şeklinde olabilir. Zira 22.ci bit  (bit21) işaret biti olarak kullanılıyor. (Aslında neden 22 bit demişler ki sonuç 21 bit aslında)
Sonucu hesaplamaya gelince,
2,5V karşılığı okunabilecek değer 2.097.151 olacağına göre pozitif sonuç için ;
Sonuç=(ADC değer *10*25)/2.097.151 şeklinde bir formül kullanıp gerçek değer için sonucun 100 e bölünmesi gerekir.
Negatif değer hesabını pek anlamadım o nedenle bir öneride bulunamayacağım. Tekrar inceleyeceğim bir fikir ednirsem eklerim buraya.

Ete




Hattuşa

slm bir protoncu olarak keşke diyorum buraya isis ve bas dosyasını eklemiş olsalardı, PC ortamında bizde bişeyler yazar ve yardımcı oluruz belki diye düşünmüştüm. ama olmadı maalesef

mikro29

#ETE hocam Allah razı olsun başka forumda sormuştum, orada yazılanı uyguladım olay çözüldü.

Alıntı Yap
GEN.Byte0=ILK
GEN.Byte1=ORT
GEN.Byte2=SON

mikro29

#pro-TR denediğim program ve şema bu başka birşey yok

Alıntı Yap
slm bir protoncu olarak keşke diyorum buraya isis ve bas dosyasını eklemiş olsalardı, PC ortamında bizde bişeyler yazar ve yardımcı oluruz belki diye düşünmüştüm. ama olmadı maalesef

tam program

Device = 16F628A   
Config FOSC_INTOSCIO, WDTE_OFF, PWRTE_ON, MCLRE_ON, BOREN_OFF, LVP_OFF, CPD_OFF, CP_OFF

Xtal 4   
Declare  SHOW_SYSTEM_VARIABLES = OFF 
Declare  FSR_CONTEXT_SAVE = OFF
Declare  Reminders = OFF   
Declare  Warnings = OFF 
Declare  Optimiser_Level 0

        '76543210 
TRISA = %00000001
TRISB = %00000000
CMCON = %00000111
VRCON = %00000000
OPTION_REG  = %10000000
'INTCON      = %10100000
INTCON = %00000000   

Declare PortB_Pullups = OFF 
Declare  All_Digital = On
Declare Hserial_Baud = 9600                                       '  RS232 port
Declare Hserial_RCSTA = %10010000                                       
Declare Hserial_TXSTA = %00100100
Declare Hserial_Clear = On 

Dim SONUC As Float
Dim SONUC2 As Dword
Dim ILK As Byte
Dim ORT As Byte
Dim SON As Byte
Dim TOPLAM1 As Dword
Dim TOPLAM2 As Dword
Dim TOPLAM3 As Dword
Dim GEN As SDword
'SDWORD = -2147483648 ve +2147483647
'FLOAT  = -2147483646.999 ve +2147483646.999

' MCP3553 PİNLERİ
Symbol SDI = PORTA.0
Symbol SCK = PORTA.1
Symbol CS  = PORTA.7

BASLA: 
CS=0
   Input SDI
    While SDI=1:Wend
    SHIn SDI,SCK,4,[SON,ORT,ILK]
CS=1
   
'TOPLAM1 = ILK.0 * 1 + ILK.1 * 2 + ILK.2 * 4 + ILK.3 * 8 + ILK.4 * 16 + ILK.5 * 32 + ILK.6 * 64 +ILK.7 * 128 '0 - 7 BİTLER
'TOPLAM2 = ORT.0 * 256 + ORT.1 * 512 + ORT.2 * 1024 + ORT.3 * 2048 + ORT.4 * 4096 + ORT.5 * 8192 + ORT.6 * 16384 ORT.7 * 32768 ' 8 - 15 BİTLER
'TOPLAM3 = SON.0 * 65536 + SON.1 * 131072 + SON.2 * 262144 + SON.3 * 524288 '+ SON.4 * 1048576' + SON.5 * 2097152
'GEN = TOPLAM1 + TOPLAM2 + TOPLAM3

GEN.Byte0=ILK
GEN.Byte1=ORT
GEN.Byte2=SON     

If SON.4 = 1  Then ' 21.BIT = FARK POZİTİF İSE 
    SONUC = 2.5-(GEN-1048576)*10/2097151' * 10/2097151)'2462    '4194303=0.00000119209V = 0,0011 mV
    HSerOut ["-",Dec4 SONUC,"V",13,10]
        Else 
    SONUC = (GEN*10)/2097151'0.000002517)    '4194303=0.00000119209V = 0,0011 mV
    HSerOut [Dec4 SONUC,"V",13,10]
EndIf

DelayMS 500
GoTo BASLA
End

Hattuşa



Alıntı yapılan: mikro29 - 14 Nisan 2017, 13:48:14
#ETE hocam Allah razı olsun başka forumda sormuştum, orada yazılanı uyguladım olay çözüldü.


sorununuzu çözdünüzmü yani

mikro29

#8
Evet, çalışan program aşağıda


Device = 16F628A   
Config FOSC_INTOSCIO, WDTE_OFF, PWRTE_ON, MCLRE_ON, BOREN_OFF, LVP_OFF, CPD_OFF, CP_OFF

Xtal 4   
Declare  SHOW_SYSTEM_VARIABLES = OFF 
Declare  FSR_CONTEXT_SAVE = OFF
Declare  Reminders = OFF   
Declare  Warnings = OFF 
Declare  Optimiser_Level 0

        '76543210 
TRISA = %00000001
TRISB = %00000000
CMCON = %00000111
VRCON = %00000000
OPTION_REG  = %10000000
'INTCON      = %10100000
INTCON = %00000000   

Declare PortB_Pullups = OFF 
Declare  All_Digital = On
Declare Hserial_Baud = 9600                                       '  RS232 port
Declare Hserial_RCSTA = %10010000                                       
Declare Hserial_TXSTA = %00100100
Declare Hserial_Clear = On 

Dim SONUC As Float
Dim SONUC2 As Dword
Dim ILK As Byte
Dim ORT As Byte
Dim SON As Byte
Dim TOPLAM1 As Dword
Dim TOPLAM2 As Dword
Dim TOPLAM3 As Dword
Dim GEN As SDword
'SDWORD = -2147483648 ve +2147483647
'FLOAT  = -2147483646.999 ve +2147483646.999

' MCP3553 PİNLERİ
Symbol SDI = PORTA.0
Symbol SCK = PORTA.1
Symbol CS  = PORTA.7

BASLA: 
CS=0
   Input SDI
    While SDI=1:Wend
    SHIn SDI,SCK,4,[SON,ORT,ILK]
CS=1

GEN.Byte0=ILK
GEN.Byte1=ORT
GEN.Byte2=SON 

' REFERANS VOLTAJI = 2.500 V
If SON.4 = 1  Then ' 21.BIT = FARK NEGATİF İSE '4194303=0.00000119209V = 0,0011 mV
    SONUC = 2.5 - (GEN - 1048576 ) * 10 / 2097151
    HSerOut ["-",Dec4 SONUC,"V",13,10]
        Else 
    SONUC = (GEN*10)/ 2097151 
    HSerOut [Dec4 SONUC,"V",13,10]
EndIf 

DelayMS 500
GoTo BASLA
End

ete

GEN.BYTE2=SON burada kritik bir durum arz ediyor. İkaz etmişim ama programda bir düzeltme göremedim.
Bu SON isimli byte aynı zamanda overflow bitleri ile sign bitinide ihtiva ediyor. Onu direk GEN olarak tanımlarsan sonucun yanlış çıkması gerekir.  Şöyle örnek vereyim.
ILK   =%10011011
ORTA=%01011001
SON =%00100010
şeklinde 3 değer okuduğunu farzedelim.
Bu durumda GEN=%00100010 01011001 10011011 olur. Ama asıl olması gereken GEN ise
GEN=%00000010 01011001 10011011 şeklinde olması gerekird. Çünki 22 bit burada 1 gözüküyor bu sayının negatif olduğunu gösteriyor.
Sonu pozitif olduğu müddetçe ve taşma olmadığı müddetçe kullandığın program doğru çalışır. Ama tersine bir şey çıakrsa sonucun yanlış çıkar. Doğru olması için SON=SON & %00011111  yapıp sonra GEN.Byte2=SON  demen gerekir.

Ete

mikro29

#10
@ETE hocam sim de 0.0001 V ... 2.500 V deniyorum sonuç -/+ birebir aynı problem yok gibi

ete

#11
birde eksi voltaj dene bakalım pozitifde sorun yok demiştim zaten. O girdiğin pozitif voltaj.
SON simli değişkenin son 3 biti pozitif voltajda zaten %000xxxxx şeklinde sorun çıkarmaz.
Negatifde ise %abcxxxxx şeklinde abc yerine high bit girebiliyor. Girerse hesap sonucu yanlış çıkar.

Ete

mikro29

Hocam yapmak istediğim adc eviren ve evirmeyen girişlerine pil bağlayıp ölçmek. Eksi voltaj derken yanlış oldu aynı girişlere pili ters bağlamak.

ete

Evet açıklaman yanlış olmuş.
Her neyse
Ete

mikro29

#14
Simülasyonda hiç problem yok ama gerçekte sonuç hep yanlış. Ref entegresi MCP1525, yukarıdaki şemayı gerçekte aynen yaptım ref voltajı ölçtüm 2.506V
mcp3553 2 ve 3 numaralı uçlarına 2 adet 1.2V pil bağladım pil toplam voltajı = 2.565V ama seri porttan aldığım değer -4562.5585V

program;

Device = 16F628A   
Config FOSC_INTOSCIO, WDTE_OFF, PWRTE_ON, MCLRE_OFF, BOREN_OFF, LVP_OFF, CPD_OFF, CP_OFF

Xtal 4   
Declare  SHOW_SYSTEM_VARIABLES = OFF 
Declare  FSR_CONTEXT_SAVE = OFF
Declare  Reminders = OFF   
Declare  Warnings = OFF 
Declare  Optimiser_Level 0

        '76543210 
TRISA = %00000001
TRISB = %00000010
CMCON = %00000111
VRCON = %00000000
OPTION_REG  = %10000000
'INTCON      = %10100000
INTCON = %00000000   

Declare PortB_Pullups = OFF 
Declare  All_Digital = On
Declare Hserial_Baud = 9600           
Declare Hserial_RCSTA = %10010000                                       
Declare Hserial_TXSTA = %00100100
Declare Hserial_Clear = On 
 
Dim SONUC As Float
Dim ILK As Byte
Dim ORT As Byte
Dim SON As Byte
Dim GEN As Dword
Dim TOPLAM As Word   
'SDWORD = -2147483648 ve +2147483647
'FLOAT  = -2147483646.999 ve +2147483646.999
' MCP3553 PİNLERİ
Symbol SDI = PORTA.0
Symbol SCK = PORTA.1
Symbol CS  = PORTA.7
BASLA: 
CS=0
   Input SDI
    While SDI=1:Wend
    SHIn SDI,SCK,4,[SON,ORT,ILK]
CS=1

GEN.Byte0=ILK
GEN.Byte1=ORT
GEN.Byte2=SON
SON=SON & %00011111
''''Vref taşma
''''22.Bit- bit için pozitif yöndeki taşma (taşmada lojik-1 olur)
''''23.Bit- bit ise negatif (taşmada lojik 1 olur) yöndeki taşmayı belirtmek için kullanılmaktadır.
''''24.Bit- ise ADC'nin veri çevirme işleminin tamamlayıp tamamlamadığını göstermek için kullanılır

' REFERANS VOLTAJI = 2.500 V
If SON.4 = 1  Then ' 21.BIT = FARK NEGATİF İSE '4194303=0.00000119209V = 0,0011 mV
    SONUC = 2.5 - (GEN - 1048576 ) * 10 / 2097151
    HSerOut ["-",Dec4 SONUC,"V",13,10]
        Else 
    SONUC = (GEN*10)/ 2097151
    HSerOut [Dec4 SONUC,"V",13,10]
EndIf
DelayMS 1000
GoTo BASLA
End

Powered by EzPortal