اطلاعیه

Collapse
No announcement yet.

مرجعی برای کار با آی سی های ADC

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مرجعی برای کار با آی سی های ADC

    در زمینه کار با آی سی های مبدل آنالوگ به دیجیتال نیاز به مرجعی دارم.من با ADC داخلی میکرو کنترلر کار کرده ام و از توابع READ_ADC برای این کار استفاده کرده ام. به دلیل دقت کمی که ADC داخلی میکرو کنترلر داشت نیاز به کار با AD7705 که 16 بیتی دارم. در دیتاشیت این آی سی مدار راه انداز برای سنسور های دمایی پیشنهاد شده است.ارتباط این ماژول با میکرو از طریق ارتباط SPI میسر است.آیا pdf یا سایتی (فارسی با انگلیسی) برای شروع کار وجود دارد؟

    #2
    پاسخ : مرجعی برای کار با آی سی های ADC

    اگه کارتون با دقت 10 بیت هم راه میفته با همون میکرو هم میتونید انجامش بدین
    اما اگه می خواهید با همین کار کنید امید وارم این بهتون کمک کنه :
    http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=we b&cd=2&ved=0CC4QFjAB&url=http%3A%2F%2F www.analog.com%2Fstatic%2Fimported-files%2Fdata_sheets%2FAD7705_7706.pdf&ei=7JYyT _CGLorRhAe9tdTzBA&usg=AFQjCNH1KsJRhAkH3lx2AeMN JbaoHEwpDQ&sig2=xsSMYw2d98dGFjtLr6GE0g
    چيزي را بگو که بتواني بنويسي
    چيزي را بنويس که بتواني امضا کني
    چيزي را امضا کن که بتواني به آن عمل کني (ناپلئون)

    دیدگاه


      #3
      پاسخ : مرجعی برای کار با آی سی های ADC

      این دیتاشیت AD7705 است.آیا مرجع دیگری که به زبان ساده تر و قابل فهم تر برای ما تازه کار توضیح داده باشد سراغ دارید؟
      من دیتاشیت این آی سی و نیز چند application note از شرکت Analog device را دارم.آیا برنامه نویسی با این آی سی های ADC همان قواعد برنامه نویسی با ADC داخلی میکرو را دارد؟آیا برنامه های پیشنهادی در اینترنت که بعضی برای پیاده سازی SPI از SPI داخلی استفاده کرده اند و بعضی دیگر یک SPI را توسط دیاگرام زمانی آی سی خودشان نوشته اند و پیاده سازی کرده اند را کسی توضیح داده است؟(فارسی یا انگلیسی)

      دیدگاه


        #4
        پاسخ : مرجعی برای کار با آی سی های ADC

        دوست عزیز من این کد را تو اینترنت پیدا کردم . ببینید به دردتون می خوره:
        البته اینجور که من توی فروم های خارجی دیدم خیلیا با این ای سی مشکل داشتند.
        //AD7705.c
        //ATMEGA 16
        //4 Mhz

        #include <avr/io.h>
        #include <avr/delay.h>
        #include <stdlib.h>
        #include <avr/pgmspace.h>

        int main(void)
        {
        //Set MOSI, SS, and SCLK as output MISO as input
        DDRB = (1<<5|1<<7|1<<4);

        //Enable SPI, Select Master, SCLK idles high, Sample on rising edge Setup on falling edge
        SPCR = (1<<SPE|1<<MSTR|1<<CPOL|1<&lt ;CPHA);

        //Send to Comm Reg: Next Write Clk
        SPDR = 0b00100000;

        //Wait for transfer
        while(!(SPSR & (1<<SPIF)));

        //Send to ClkReg: Clock Bits and Update rate
        SPDR = 0b00011000;

        //Wait for transfer
        while(!(SPSR & (1<<SPIF)));

        //Send to Comm: next read Clk reg
        SPDR = 0b00101000;

        //Wait for transfer
        while(!(SPSR & (1<<SPIF)));

        //send garbage to shift out byte we want from AD7705
        SPDR = 0;

        //Wait for transfer
        while(!(SPSR & (1<<SPIF)));

        unsigned char value = SPDR;

        DDRD = 0xFF;
        PORTD = value; //read byte from SPI buffer onto PORTD

        while(1);

        return 0;
        }
        اگر خواستید از ماژول های دیگه استفاده کنید میتونید به فروشگاه های اینترنتی یه نگاهی بیندازید
        چيزي را بگو که بتواني بنويسي
        چيزي را بنويس که بتواني امضا کني
        چيزي را امضا کن که بتواني به آن عمل کني (ناپلئون)

        دیدگاه


          #5
          پاسخ : مرجعی برای کار با آی سی های ADC

          خوب به نظرم یکی از بهترین سئوالات این یخش تفاوت کوپلینگ دی سی و ای سی می باشد. که یکی از مهمترین عوامل حل نویز می باشد....

          و پارامتر سیگنال به نویز که دقت مربوط به هیستوگرام با به نوعی nob ای دی سی را مشخص میکند...

          به نظرم این دو پارامتری نقش مهمی را در انتخاب و کار و طراحی یگ مدار adc را دارد... و نهایتان تعداد بیتها و پهنای باند...

          دیدگاه


            #6
            پاسخ : مرجعی برای کار با آی سی های ADC

            نوشته اصلی توسط lordsoroosh
            //AD7705.c
            //ATMEGA 16
            //4 Mhz

            #include <avr/io.h>
            #include <avr/delay.h>
            #include <stdlib.h>
            #include <avr/pgmspace.h>

            int main(void)
            {
            //Set MOSI, SS, and SCLK as output MISO as input
            DDRB = (1<<5|1<<7|1<<4);

            //Enable SPI, Select Master, SCLK idles high, Sample on rising edge Setup on falling edge
            SPCR = (1<<SPE|1<<MSTR|1<<CPOL|1<&lt ;CPHA);

            //Send to Comm Reg: Next Write Clk
            SPDR = 0b00100000;

            //Wait for transfer
            while(!(SPSR & (1<<SPIF)));

            //Send to ClkReg: Clock Bits and Update rate
            SPDR = 0b00011000;

            //Wait for transfer
            while(!(SPSR & (1<<SPIF)));

            //Send to Comm: next read Clk reg
            SPDR = 0b00101000;

            //Wait for transfer
            while(!(SPSR & (1<<SPIF)));

            //send garbage to shift out byte we want from AD7705
            SPDR = 0;

            //Wait for transfer
            while(!(SPSR & (1<<SPIF)));

            unsigned char value = SPDR;

            DDRD = 0xFF;
            PORTD = value; //read byte from SPI buffer onto PORTD

            while(1);

            return 0;
            }
            این کد دارای ایراد است چون فقط 8 بیت از SPDR را گرفته و می خواند.(ADC ما 16 بیتی است)
            مشکل اساسی من در خواندن از رجیستر های ADC تحت ارتباط SPI است.با توجه به رجیستر های ارائه شده در AD7705 و اینکه هم می توان از اکثر رجیستر های آن هم اطلاعات خواند و هم نوشت ، من هم در اولین قدم برای ارتباط با communication register که رجیستر اصلی این ADC است چند خط کد نوشتم اما وقتی چیزی را در این رجیستر نوشتم نتوانستم همان را بخوانم.اگر راهنمایی کنید ممنون می شوم.
            کد هایی که برای این منظور استفاده کردم (ATmega32 و CodevisionAVR و AD7705)
            کد:
            #define NUM_SAMPLES 1000 /* change the number of data samples */
            #define MAX_REG_LENGTH 2 /* this says that the max length of a register is 2 bytes */
            
            #define DRDY PIND.7
            #define CS PORTB.4
            
            char store[1000];
            این چند خط تعریف چند ثابت و نیز تعریف پایه های استفاده شده در میکرو برای ارتباط با پایه های ریست و DRDY آی سی AD7705 می باشد
            کد:
            void Writetoreg(int byteword)
            {
            int q;
            SPCR = 0x3f;
            SPCR = 0X7f; /* this sets the WiredOR mode(DWOM=1), Master mode(MSTR=1), SCK idles high(CPOL=1), /SS can be low
            always (CPHA=1), lowest clock speed(slowest speed which is master clock /32 */
            DDRB = 0xA0; /* SCK, MOSI outputs */
            q = SPSR;
            q = SPDR; /* the read of the status register and of the data register is needed to clear the interrupt which tells
            the user that the
            data transfer is complete */
            CS=0; /* /CS is low */
            SPDR = byteword; /* put the byte into data register */
            while(!(SPSR & 0x80)); /* wait for /DRDY to go low */
            CS=1; /* /CS high */
            }
            
            void Read(int amount,int reglength)
            {
            int b,i;
            SPCR = 0x3f;
            SPCR = 0x7f; /* clear the interrupt */
            DDRB = 0xA0; /* MOSI output, MISO input, SCK output */
              while(DRDY & 0); /* wait for /DRDY to go low */
            CS=0 ; /* /CS is low */
              for(b=0;b<reglength;b++)
              {
              SPDR = 0;
              while(!(SPSR & 0x80)); /* wait until port ready before reading */
              store[i++]=SPDR; /* read SPDR into store array via datapointer */
              }
            CS=1; /* /CS is high */
            }
            این دو تابع وظیفه خواندن و نوشتن در حوزه ارتباط SPI را دارند
            کد:
            int i; 
               char string[5]="amin"; 
               Writetoreg(0x20); /* Active Channel is Ain1(+)/Ain1(-), next operation as write to the clock register */
               while(DRDY & 1); /* wait for /DRDY to go high */
               while(DRDY & 0); /* wait for /DRDY to go low */          
               //while(DRDY & 1); /* wait for /DRDY to go high */
               Writetoreg(0x08);
               Read(1,1);
                 //for(i=0;i<NUM_SAMPLES;i++) 
                // {
                // sprintf(string,"%x",store[i]);
                 puts(store);
                 delay_ms(100);
            این هم برنامه داخل while است که وظیف نوشتن روی com reg و بلافاصله خواندن از آن را بر عهده دارد.
            :read: :read: :read: :cry2:

            دیدگاه


              #7
              پاسخ : مرجعی برای کار با آی سی های ADC

              سلام شما بیایید از ad7715 استفاده کنید تقریبا با ad7705 مشابه هست هم از لحاظ سرعت و تعداد بیت ها و وضوحش
              وهم این که بچه ها تو سایت فکر کنم راه انداختن بگردی پیدا میکنی و تو یکی از مجله های نویز هم دیتا شیتشو فارسی کردن وهم راه اندازی کردن
              :biggrin:
              امام مهدی(عج): اگر شیعیان ما ، که خداوند طاعتشان دهد. در عهد ما وفادار و همدل بودند، هرگز دیدار ما (ظهور) به تاخیر نمی افتاد.(کدام عهد ؟)

              دیدگاه

              لطفا صبر کنید...
              X