اطلاعیه

Collapse
No announcement yet.

مبدل آنالوگ به دیجیتال AD7190

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

    پاسخ : مبدل آنالوگ به دیجیتال AD7190

    نوشته اصلی توسط vishy71
    سلام.دوستان من این تراشه رو راه اندازی کردم با ولتاژ رفرنس 4.952 .کاملا درست کار می کنه اما تو بعضی از محدوده ها 20 میلی ولت کمتر از اهم متر نشون میده.اهم متر هم 16 بیتیه و دقت خوبی داره.البته تو محدوده های دیگه از اهم متر هم بهتر جواب میده.اما تو بعضی محدوده ها نه.
    فرکانس نمونه برداری رو از 4 و خرده ای هرتز تا 300 هرتز هم تغییر دادم نتیجه همونه.با فیلتر sinc4 , sinc3 هم نتیجه تفاوتی نمی کنه.chop خاموشه همچنین بافر و burn.گین 1 هستش.بایپولار.فیلتر notch هم فعاله.کالیبراسیون هم زیاد فرقی نمی کنه ( در محدوده ی نانو ولت یا میکرو ولت یه خرده تغییرات مشاهده میشه)

    ممنون
    سلام
    اگه بافر رو فعال کنی، مقادیم خیلی کم و مقادیر خیلی زیاد رو نشون نمی ده.
    برای کاری در حوزه اربعین نیاز به نیروی داوطلب هستیم.
    http://hosseinwalkingday.com

    دیدگاه


      پاسخ : مبدل آنالوگ به دیجیتال AD7190

      بافر خاموشه.burn هم خاموشه و SINC3 یا SINC4 هم تفاوتی نمی کنه در کل.کانال 1 و ولتاژ رفرنس 2.5 ولته
      بعضی جاها پرش داره اصلا هم کوتاه نمیاد :(

      دیدگاه


        پاسخ : مبدل آنالوگ به دیجیتال AD7190

        این کد برای خود AD7190:

        #define Mode 0x08
        #define Conf 0x10
        #define Data 0x18
        #define Offset 0x30
        #define FScale 0x38

        void ADWR(char reg){
        CS=0;
        spi_write(0x00 | reg);
        spi_write(DATA_REG[0]);
        spi_write(DATA_REG[1]);
        spi_write(DATA_REG[2]);
        CS=1;
        }
        void setparam(char p1,char p2,char p3){
        DATA_REG[0]=p1;
        DATA_REG[1]=p2;
        DATA_REG[2]=p3;
        }
        void ADRST(){
        CS=0;
        //adc reset
        spi_write(0xFF);
        spi_write(0xFF);
        spi_write(0xFF);
        spi_write(0xFF);
        spi_write(0xFF);
        spi_write(0xFF);
        spi_write(0xFF);
        spi_write(0xFF);
        spi_write(0xFF);
        spi_write(0xFF);
        spi_write(0xFF);
        spi_write(0xFF);
        spi_write(0xFF);
        spi_write(0xFF);
        CS=1;
        __delay_ms(1);
        }
        void ADRD(char reg){
        CS=0;
        spi_write(0x40 | reg);
        DATA_REG[0]=spi_write(0x00);
        DATA_REG[1]=spi_write(0x00);
        DATA_REG[2]=spi_write(0x00);
        CS=1;
        __delay_ms(1);
        }
        void single_mode(){
        ADRD(Mode);
        DATA_REG[0] &=0x0F;
        DATA_REG[0] |=0X20;
        ADWR(Mode);
        }
        void cont_mode(){
        ADRD(Mode);
        DATA_REG[0] &=0x0F;
        ADWR(Mode);
        }
        void idle_mode(){
        ADRD(Mode);
        DATA_REG[0] &=0x0F;
        DATA_REG[0] |=0X40;
        ADWR(Mode);
        }
        char get_status(){
        char tmp;
        CS=0;
        spi_write(0x40);
        tmp=spi_write(0x00);
        CS=1;
        return tmp;
        }
        void AD7190_init(){
        ADRST();
        __delay_ms(10);
        setparam(0x00,0x01,0x00); //Chopisable,Refin1(+)&Refin1(-),CH1,No burn,No ref det,no BUF,Bipolar,Gain:1
        ADWR(Conf);
        setparam(0x8C,0x85,0x60); //Internal Zero-Scale,Internal 4.92 MHz,SINC3,No ENPAR,NO Single,REJ60:EN
        ADWR(Mode);
        while((get_status()&0x80)!=0x80); //wait to Calibraion
        cont_mode();
        }


        این هم کد برنامه:

        #include <htc.h>
        #include <stdio.h>
        #include <stdlib.h>

        #define _XTAL_FREQ 12000000
        #define RS LATD0
        #define EN LATD1
        #include "spi.c"
        #include "lcd.c"
        #define CS LATA5
        char DATA_REG[3];
        #include "ad7190.c"

        char temp;

        static void interrupt
        isr(){
        if(TMR2IF==1){
        TMR2IF=0;
        }
        else if(INT0IF==1){
        INT0IF=0;
        LATB3=~LATB3;
        }
        }

        void main(){
        unsigned long xc;
        double x1;
        __delay_ms(10);

        lcd_init();
        lcd_cmd4(0x01); //clear LCD

        spi_init();

        TRISB |=0x01;
        //Enable RB0/INT
        INTCON2=0x80;
        RCON=0x00;
        INTCON=0xD0;

        //tmr2
        TMR2=0;
        PR2=0xFF;
        T2CON=0x7F;
        TMR2IE=1;
        PEIE=1;

        GIE=0; //Disable Global Interrupt

        AD7190_init();
        LATB3=0;
        while(1){
        while(1){
        if((get_status() & 0x80)!=0x80)break; //wait to RDY
        }
        LATB3=1;
        ADRD(Data);
        xc=DATA_REG[0]*65536;
        xc+=(DATA_REG[1]*256);
        xc+=(DATA_REG[2] & 0xF0);

        //bipolar
        x1=xc*2.495; //2.495 Vref
        x1/=8388608; //2^N-1 where N=24
        x1-=2.495;

        //unipolar
        //x1=xc*2.495;
        //x1/=16777216;

        x1*=1000; //Convert to mV
        lcd_cmd4(0x01); //clear LCD
        printf("%4.5f mV",x1);
        LATB3=0;
        }
        }

        دیدگاه


          پاسخ : مبدل آنالوگ به دیجیتال AD7190

          نوشته اصلی توسط vishy71
          بافر خاموشه.burn هم خاموشه و SINC3 یا SINC4 هم تفاوتی نمی کنه در کل.کانال 1 و ولتاژ رفرنس 2.5 ولته
          بعضی جاها پرش داره اصلا هم کوتاه نمیاد :(
          بنده که هیچی نفهمیدم.
          به زحمت دوستان، سایت امکانات خوبی داره. از قسمت مخصوص درج کد استفاده کنید تا خوانا باشه.
          برای کاری در حوزه اربعین نیاز به نیروی داوطلب هستیم.
          http://hosseinwalkingday.com

          دیدگاه


            پاسخ : مبدل آنالوگ به دیجیتال AD7190

            عذر می خوام حواسم نبود :دی .امیدوارم اینیکی خوب باشه.
            کد:
            #define Mode  0x08
            #define Conf  0x10
            #define Data  0x18
            #define Offset  0x30
            #define FScale 0x38
            
            void ADWR(char reg){
              CS=0;
              spi_write(0x00 | reg);
              spi_write(DATA_REG[0]);
              spi_write(DATA_REG[1]);
              spi_write(DATA_REG[2]);
              CS=1;
            }
            void setparam(char p1,char p2,char p3){
              DATA_REG[0]=p1;
              DATA_REG[1]=p2;
              DATA_REG[2]=p3;
            }
            void ADRST(){
              CS=0;
              //adc reset
              spi_write(0xFF);
              spi_write(0xFF);
              spi_write(0xFF);
              spi_write(0xFF);
              spi_write(0xFF);
              spi_write(0xFF);
              spi_write(0xFF);
              spi_write(0xFF);
              spi_write(0xFF);
              spi_write(0xFF);
              spi_write(0xFF);
              spi_write(0xFF);
              spi_write(0xFF);
              spi_write(0xFF);
              CS=1;
              __delay_ms(1);
            }
            void ADRD(char reg){
              CS=0;
              spi_write(0x40 | reg);
              DATA_REG[0]=spi_write(0x00);
              DATA_REG[1]=spi_write(0x00);
              DATA_REG[2]=spi_write(0x00);
              CS=1;
              __delay_ms(1);
            }
            void single_mode(){
              ADRD(Mode);
              DATA_REG[0] &=0x0F;
              DATA_REG[0] |=0X20;
              ADWR(Mode);
            }
            void cont_mode(){
              ADRD(Mode);
              DATA_REG[0] &=0x0F;
              ADWR(Mode);
            }
            void idle_mode(){
              ADRD(Mode);
              DATA_REG[0] &=0x0F;
              DATA_REG[0] |=0X40;
              ADWR(Mode);
            }
            char get_status(){
              char tmp;
              CS=0;
              spi_write(0x40);
              tmp=spi_write(0x00);
              CS=1;
              return tmp;
            }
            void AD7190_init(){
              ADRST();
              __delay_ms(10);
              setparam(0x00,0x01,0x00);  //Chop:Disable,Refin1(+)&Refin1(-),CH1,No burn,No ref det,no BUF,Bipolar,Gain:1
              ADWR(Conf);
              setparam(0x8C,0x85,0x60);  //Internal Zero-Scale,Internal 4.92 MHz,SINC3,No ENPAR,NO Single,REJ60:EN
              ADWR(Mode);
              while((get_status()&0x80)!=0x80); //wait to Calibraion
              cont_mode();
            }
            
            
            این هم کد برنامه:
            
            #include <htc.h>
            #include <stdio.h>
            #include <stdlib.h>
            
            #define _XTAL_FREQ 12000000
            #define RS  LATD0
            #define EN  LATD1
            #include "spi.c"
            #include "lcd.c"
            #define CS  LATA5
            char DATA_REG[3];
            #include "ad7190.c"
            
            char temp;
            
            static void interrupt
            isr(){
              if(TMR2IF==1){
               TMR2IF=0;
              }
              else if(INT0IF==1){
               INT0IF=0;
               LATB3=~LATB3;
              }
            }
            
            void main(){
              unsigned long xc;
              double x1;
              __delay_ms(10);
            
              lcd_init();
              lcd_cmd4(0x01);   //clear LCD
            
              spi_init();
            
              TRISB |=0x01;
              //Enable RB0/INT
              INTCON2=0x80;
              RCON=0x00;
              INTCON=0xD0;
            
              //tmr2
              TMR2=0;
              PR2=0xFF;
              T2CON=0x7F;
              TMR2IE=1;
              PEIE=1;
             
                GIE=0;   //Disable Global Interrupt
            
              AD7190_init();
              LATB3=0;
              while(1){
               while(1){
                 if((get_status() & 0x80)!=0x80)break; //wait to RDY
               }
               LATB3=1;
               ADRD(Data);
               xc=DATA_REG[0]*65536;
               xc+=(DATA_REG[1]*256);
               xc+=(DATA_REG[2] & 0xF0);
            
               //bipolar
               x1=xc*2.495;   //2.495 Vref
               x1/=8388608;   //2^N-1 where N=24
               x1-=2.495;
            
               //unipolar
               //x1=xc*2.495;
               //x1/=16777216;
            
               x1*=1000;   //Convert to mV
               lcd_cmd4(0x01);   //clear LCD
               printf("%4.5f mV",x1);
               LATB3=0;
              }
            }
            ویرایش

            دیدگاه


              پاسخ : مبدل آنالوگ به دیجیتال AD7190

              سلام

              :angry: :angry: :angry:
              [code=c]#define Mode 0x08
              #define Conf 0x10
              #define Data 0x18
              #define Offset 0x30
              #define FScale 0x38

              void ADWR(char reg){
              CS=0;
              spi_write(0x00 | reg);
              spi_write(DATA_REG[0]);
              spi_write(DATA_REG[1]);
              spi_write(DATA_REG[2]);
              CS=1;
              }
              void setparam(char p1,char p2,char p3){
              DATA_REG[0]=p1;
              DATA_REG[1]=p2;
              DATA_REG[2]=p3;
              }
              void ADRST(){
              CS=0;
              //adc reset
              spi_write(0xFF);
              spi_write(0xFF);
              spi_write(0xFF);
              spi_write(0xFF);
              spi_write(0xFF);
              spi_write(0xFF);
              spi_write(0xFF);
              spi_write(0xFF);
              spi_write(0xFF);
              spi_write(0xFF);
              spi_write(0xFF);
              spi_write(0xFF);
              spi_write(0xFF);
              spi_write(0xFF);
              CS=1;
              __delay_ms(1);
              }
              void ADRD(char reg){
              CS=0;
              spi_write(0x40 | reg);
              DATA_REG[0]=spi_write(0x00);
              DATA_REG[1]=spi_write(0x00);
              DATA_REG[2]=spi_write(0x00);
              CS=1;
              __delay_ms(1);
              }
              void single_mode(){
              ADRD(Mode);
              DATA_REG[0] &=0x0F;
              DATA_REG[0] |=0X20;
              ADWR(Mode);
              }
              void cont_mode(){
              ADRD(Mode);
              DATA_REG[0] &=0x0F;
              ADWR(Mode);
              }
              void idle_mode(){
              ADRD(Mode);
              DATA_REG[0] &=0x0F;
              DATA_REG[0] |=0X40;
              ADWR(Mode);
              }
              char get_status(){
              char tmp;
              CS=0;
              spi_write(0x40);
              tmp=spi_write(0x00);
              CS=1;
              return tmp;
              }
              void AD7190_init(){
              ADRST();
              __delay_ms(10);
              setparam(0x00,0x01,0x00); //Chopisable,Refin1(+)&Refin1(-),CH1,No burn,No ref det,no BUF,Bipolar,Gain:1
              ADWR(Conf);
              setparam(0x8C,0x85,0x60); //Internal Zero-Scale,Internal 4.92 MHz,SINC3,No ENPAR,NO Single,REJ60:EN
              ADWR(Mode);
              while((get_status()&0x80)!=0x80); //wait to Calibraion
              cont_mode();
              }


              این هم کد برنامه:

              #include <htc.h>
              #include <stdio.h>
              #include <stdlib.h>

              #define _XTAL_FREQ 12000000
              #define RS LATD0
              #define EN LATD1
              #include "spi.c"
              #include "lcd.c"
              #define CS LATA5
              char DATA_REG[3];
              #include "ad7190.c"

              char temp;

              static void interrupt
              isr(){
              if(TMR2IF==1){
              TMR2IF=0;
              }
              else if(INT0IF==1){
              INT0IF=0;
              LATB3=~LATB3;
              }
              }

              void main(){
              unsigned long xc;
              double x1;
              __delay_ms(10);

              lcd_init();
              lcd_cmd4(0x01); //clear LCD

              spi_init();

              TRISB |=0x01;
              //Enable RB0/INT
              INTCON2=0x80;
              RCON=0x00;
              INTCON=0xD0;

              //tmr2
              TMR2=0;
              PR2=0xFF;
              T2CON=0x7F;
              TMR2IE=1;
              PEIE=1;

              GIE=0; //Disable Global Interrupt

              AD7190_init();
              LATB3=0;
              while(1){
              while(1){
              if((get_status() & 0x80)!=0x80)break; //wait to RDY
              }
              LATB3=1;
              ADRD(Data);
              xc=DATA_REG[0]*65536;
              xc+=(DATA_REG[1]*256);
              xc+=(DATA_REG[2] & 0xF0);

              //bipolar
              x1=xc*2.495; //2.495 Vref
              x1/=8388608; //2^N-1 where N=24
              x1-=2.495;

              //unipolar
              //x1=xc*2.495;
              //x1/=16777216;

              x1*=1000; //Convert to mV
              lcd_cmd4(0x01); //clear LCD
              printf("%4.5f mV",x1);
              LATB3=0;
              }
              }[/code]


              این تکه کد تون مشکوک هستم
              [code=c]
              ADRD(Data);
              xc=DATA_REG[0]*65536;
              xc+=(DATA_REG[1]*256);
              xc+=(DATA_REG[2] & 0xF0);
              [/code]

              شما ضرب نکنید، دو بایت از AD7190 بخونید و خروجی اش رو نشون بدهید
              اعداد رو اینجا بذارید تا بصورت دستی ضرب کنیم و مطمئن بیشیم تو این تکه مشکلی نداری
              برای کاری در حوزه اربعین نیاز به نیروی داوطلب هستیم.
              http://hosseinwalkingday.com

              دیدگاه


                پاسخ : مبدل آنالوگ به دیجیتال AD7190

                معذرت می خوام :redface: زیاد وارد نیستم تو اینجور کامنت گذاشتن.

                خوب اون ضرب ینی همون شیفت دادن.ینی به جای اینکه 16 بار شیفت بدم داده ی MSB رو ضرب کرده در 2 به توان 16 که میشه همون 65536.
                بعدی هم به جای 8 بار شیفت دادن ضربدر 256 کردم.بایت آخری رو هم 4 بیت پایین رو صفر کردم تا دقت 20 بیتی بشه.
                اینی که شما میگین دقت 16 بیتیه قبلا هم تست کردم به صورت جداگونه ولی نتیجه همینطور بوده.

                دیدگاه


                  پاسخ : مبدل آنالوگ به دیجیتال AD7190

                  نوشته اصلی توسط vishy71
                  معذرت می خوام :redface: زیاد وارد نیستم تو اینجور کامنت گذاشتن.

                  خوب اون ضرب ینی همون شیفت دادن.ینی به جای اینکه 16 بار شیفت بدم داده ی MSB رو ضرب کرده در 2 به توان 16 که میشه همون 65536.
                  بعدی هم به جای 8 بار شیفت دادن ضربدر 256 کردم.بایت آخری رو هم 4 بیت پایین رو صفر کردم تا دقت 20 بیتی بشه.
                  اینی که شما میگین دقت 16 بیتیه قبلا هم تست کردم به صورت جداگونه ولی نتیجه همینطور بوده.
                  شما عدد ها رو دستی بذار اینجا

                  روند پروژه های علمی از ساده به سخت هست
                  هر وقت بهش مطمئن شدیم، می ریم مرحله بعدی
                  برای کاری در حوزه اربعین نیاز به نیروی داوطلب هستیم.
                  http://hosseinwalkingday.com

                  دیدگاه


                    پاسخ : مبدل آنالوگ به دیجیتال AD7190

                    اکی
                    با ولتاژ رفرنس 2.495 این مقادیر روی ولت متر (16 بیتی) و روی خروجی هستش:(8 بیت پایین پرش زیاد داره بعضا)

                    ولتاژ روی ولت متر ، مقدار اندازه گیری شده

                    210.59 8AD48C میلی وبت
                    -49.62 7D747E میلی ولت
                    1.1209 B9848F ولت
                    8694 AC9C7B میلی ولت
                    351.52 92121B میلی ولت

                    دیدگاه


                      پاسخ : مبدل آنالوگ به دیجیتال AD7190

                      یه مشکل دیگه هم تو این مدلی هستش که نمونه ی به دست اومده رفته رفته زیاد میشه.ینی مثلا 8AD48C اولش اندازه گرفته میشه بعد رفته رفته میره بالا.
                      فرکانس نمونه برداری هم 10 هرتز بوده.
                      بازم ممنون

                      دیدگاه


                        پاسخ : مبدل آنالوگ به دیجیتال AD7190

                        نوشته اصلی توسط vishy71
                        یه مشکل دیگه هم تو این مدلی هستش که نمونه ی به دست اومده رفته رفته زیاد میشه.ینی مثلا 8AD48C اولش اندازه گرفته میشه بعد رفته رفته میره بالا.
                        فرکانس نمونه برداری هم 10 هرتز بوده.
                        بازم ممنون
                        آقاجون MSB LSB ات رو بذار

                        *
                        ورودی ات رو اتصال کوتاه کن ببین چه عدد هایی میاد.
                        برای کاری در حوزه اربعین نیاز به نیروی داوطلب هستیم.
                        http://hosseinwalkingday.com

                        دیدگاه


                          پاسخ : مبدل آنالوگ به دیجیتال AD7190

                          نوشته اصلی توسط مرتضی م.
                          آقاجون MSB LSB ات رو بذار

                          *
                          ورودی ات رو اتصال کوتاه کن ببین چه عدد هایی میاد.
                          خوب MSB LSB هستش دیگه. :eek: از چپ به راست.
                          ورودی رو اتصال کوتاه هم می کنم واسا.
                          ولتاژ اندازه گیری شده با ولت متر: 0.06 میلی ولت
                          ولتاژ اندازه گیری شده با AD7190 هم اینه: 0.06104 میلی ولت.
                          که دقیقا عین هم هستن.
                          ببین مثلا ولتاژ 433 میلی ولت رو AD7190 میده 413 و ولت متر میده 433.حالا اینو می کنم 435 ولت متر میده 435 و AD7190 هم دقیقا همین عدد رو میده با دقت خیلی زیاد.
                          نمی دونم این وسط چی هست که این اتفاق می افته.
                          یا مثلا میدم -635 و AD7190 میده -655 و وقتی یه خرده تغییر میدم مثلا یه میلی ولت درست میشه.....

                          دیدگاه


                            پاسخ : مبدل آنالوگ به دیجیتال AD7190

                            نوشته اصلی توسط vishy71
                            خوب MSB LSB هستش دیگه. :eek: از چپ به راست.
                            ورودی رو اتصال کوتاه هم می کنم واسا.
                            ولتاژ اندازه گیری شده با ولت متر: 0.06 میلی ولت
                            ولتاژ اندازه گیری شده با AD7190 هم اینه: 0.06104 میلی ولت.
                            که دقیقا عین هم هستن.
                            ببین مثلا ولتاژ 433 میلی ولت رو AD7190 میده 413 و ولت متر میده 433.حالا اینو می کنم 435 ولت متر میده 435 و AD7190 هم دقیقا همین عدد رو میده با دقت خیلی زیاد.
                            نمی دونم این وسط چی هست که این اتفاق می افته.
                            یا مثلا میدم -635 و AD7190 میده -655 و وقتی یه خرده تغییر میدم مثلا یه میلی ولت درست میشه.....
                            چی؟
                            MSB LSB بایستی از جنس Char باشند

                            یعنی بدون اعشار
                            و اگه هم بصورت مبنای شونزده بدی، هر کدوم بین صفر تا FF می تونند تغییر کنند
                            عددت در مبنای شونزده بیشتر از FFFF نمی تونه باشه.
                            برای کاری در حوزه اربعین نیاز به نیروی داوطلب هستیم.
                            http://hosseinwalkingday.com

                            دیدگاه


                              پاسخ : مبدل آنالوگ به دیجیتال AD7190

                              با اجازه از اقا مرتضی!
                              دوست گرامی اگر هر چند وقت یه بار پرش یا کاهش در مقدار دارید نشون دهنده ی ریپل در ولتاز رفرنس یا تغذیه هست !که اون پرش متناسب با اون ریپل هست
                              چون به صورت مطلق داری میخونید و رفرنس استفاده میکنید این ریپل تاثیر گذاره-البته باید ببینید این ریپل همیشه و منظم باشه!
                              میتونید برای تست خروجی ولتاژ رفرنس رو با ولت متر تست کنید ببینید هر چند لحظه ریپل داره یا نه که احتمال زیاد داره که در محاسبات تاثیر میذاره

                              دیدگاه


                                پاسخ : مبدل آنالوگ به دیجیتال AD7190

                                میشه با این آی سی تا نرخ 1kSPS هم نمونه برداری کرد ؟ اگر آره، تو این سرعت، دقت تا چند بیت میاد پایین ؟
                                ---------
                                .
                                .
                                ...........

                                دیدگاه

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