اطلاعیه

Collapse
No announcement yet.

* برنامه نویسی برای ADC خارجی

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

    * برنامه نویسی برای ADC خارجی

    با سلام .

    من با a/d داخلی کار کردم ولی اولین باره که میخوام از a/d خارجی با ic ADC0804 کار کنم . گیج شدم ooo

    اصلا نموی دونم چه طور باید براش برنامه بنویسم .. اگه نمونه برنامه ای(Codevision ) برای این IC دارید لطفا قرار بدهید . و روش توضیح بفرمایید .

    ممنون میشم اگه کمکم کنید . با سپاس .

    #2
    پاسخ : * برنامه نویسی برای ADC0804

    سلام
    دوست عزیز لطف کنید یک موضوع را دوبار در انجمن مطرح نکنید چون پست دیگر شما پاک خواهد شد.

    در مورد سوالتون باید بگم adc804 یک مبدل آنالوگ به دیجیتال 8 بیتی است پس دقت این مبدل 8 بیت است هر چه تعداد بیت آن بیشتر شود دقت آن بیشتر است.
    این آی سی 8 پایه دیتا دارد که این پایه ها به میکرو متصل می شوند اگر اشتباده نکنم پایه 11 تا 18 این آی سی
    دوتا پایه کنترلی وجود دارد که این پایه ها هم به میکرو متصل میشوند.
    1- wr : شما باید توسط میکرو یک لبه بالا رونده بدهید تا این آی سی نمونه گیری را آغاز کند.
    2- INT : این آی سی وقتی نمونه گیری به پایان برسد برای یک لحظه این پایه را یک می کند و شما می توانید بفهمید که نمونه گیری به پایان رسیده است.
    یک پابه ref دارد که ولتاژ ورودی شما با این پایه مقایسه می شود یعنی این ولتاژ مبنای شما است.
    هر چه این ولتاژ دقیق تر باشد نمونه گیری دقیق تر خواهد بود.

    دیدگاه


      #3
      پاسخ : * برنامه نویسی برای ADC خارجی

      پست اشتباه .

      دیدگاه


        #4
        پاسخ : * برنامه نویسی برای ADC0804

        سلام
        من با 8051 برنامه اش رو نوشتم و به زبان اسمبلی دوست داشتی بگو تا برات بزارم.

        دیدگاه


          #5
          پاسخ : * برنامه نویسی برای ADC0804

          سلام ...............

          نوشته اصلی توسط DIP.2020
          پایه ها رو می دونم .... برنامه نویسی اش رو مشکل دارم ...
          اگه یه برنامه ساده برام بذارید ممنون می شم .
          برنامه ی اون رو توی چه محیطی نیاز دارید؟ C یا بیسیک؟
          دوستان! مدتی کمتر به سایت میام ..

          دیدگاه


            #6
            * برنامه نویسی برای ADC خارجی

            با زبان c اگه باشه ، خیلی ممنون می شم .

            و اگه یکم رو برنامه نویسی اش هم توضیح ای بدهید . :redface: واقعا خسته نباشید و متشکر .

            دیدگاه


              #7
              پاسخ : * برنامه نویسی برای ADC0804

              نوشته اصلی توسط khazan

              با زبان c اگه باشه ، خیلی ممنون می شم .

              و اگه یکم رو برنامه نویسی اش هم توضیح ای بدهید . :redface: واقعا خسته نباشید و متشکر .
              :cry:

              دوستان ، لطف می کنید ، یه برنامه یا پروژه sample با زبان c برام قرار بدهید ، یک دنیا ممنون می شم .

              دیدگاه


                #8
                پاسخ : * برنامه نویسی برای ADC0804

                نوشته اصلی توسط khazan
                :cry:

                دوستان ، لطف می کنید ، یه برنامه یا پروژه sample با زبان c برام قرار بدهید ، یک دنیا ممنون می شم .

                ببینید خیلی از بچه ها مثل خودتون با adc داخلی کار کردن. چون هیچ وقت نیازی دیده نشده که با avr بخواهیم adc0804 رو راه اندازی کنیم.
                من یه برنامه به زبان اسمبلی دارم. میخوای اونو واستون بزارم. اگه اسمبلی یلد باشین میتونید به زبان c تبدیلش کنید.

                دیدگاه


                  #9
                  پاسخ : * برنامه نویسی برای ADC خارجی

                  خیلی ممنون .

                  من فقط می خوام با ADC خارجی کار کنم ... بعد به توصیه استادم ، آی سی ADC0804 رو برداشتم که ساده ترین باشه ، (8 بیتی )

                  اما اگه می تونید کمکم کنید ، برای شروع آی سی دیگری رو برنامه نویسی کنم ...( به عنوان مثال ADC0820 یا ...) ، فقط ساده باشه ، چون اولین برنامه ام برای ADC خارجی هست
                  و قبل از این فقط کار کردم که رجیستر ها رو مقدا ر بدم که ADC داخلی خود میکرو راه بیفته ..

                  من یه نمونه برنامه یا پروژه با adc خارجی می خوام ، هر چه ساده تر بهتر ..

                  من با AVR و با Codevision کار کردم ..( فقط هم همین رو بلدم ....)



                  * فقط چون شنیدم که adc خارجی راحت هم گیر نمی یاد ، لطفا و خواهشا روی یک ic صحبت کنید که توی بازار هم راحت گیر بیاد .. از توجه ولطف بچه های سایت ممنونم ...

                  دیدگاه


                    #10
                    پاسخ : * برنامه نویسی برای ADC خارجی

                    فقط چون شنیدم که adc خارجی راحت هم گیر نمی یاد ، لطفا و خواهشا روی یک ic صحبت کنید که توی بازار هم راحت گیر بیاد
                    اتفاقاً خیلی راحت گیر میاد. همه مدلهاش هست. این مدل 804 که دیگه فراون تو بازار ریخته.



                    اگر هدفت فقط یادگیری من کمک میکنم که برنامه رو خودتون بنویسین. ولی اگه هدفتون فقط انجام پروژه و تحویل پروژه به استاد مربوط است برنامه حاضری ندارم و بهتره تو اینترنت بگردین.

                    فرض رو بر این میگیریم که هدف یادگیری:
                    سخت افزار و مدار و تلاش از شما باشه کمک هم از طرف من و دوستان.

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




                    اینم فایل پروتئوسش

                    http://rapidshare.com/files/202779851/protus.rar.html


                    دیدگاه


                      #11
                      پاسخ : * برنامه نویسی برای ADC خارجی

                      نوشته اصلی توسط ___ بادامی ___


                      اگر هدفت فقط یادگیری من کمک میکنم که برنامه رو خودتون بنویسین.
                      بله ، هدفم یادگیریه ... تا بعد ها که بخوام یک adc خارجی 16 یا 24 بیت رو برنامه نویسی کنم . :smile:

                      من مدار بالا رو با adc0804 بستم ، البته ! دقیقا شکل زیر رو بستم ..( که فرقی هم نداره ، فقط به جای گذاشتن LED ها ، باید وصل کنم به پورت B میکروکنترلر . :agree: )



                      یک نکته ای هم که راجع به ولتاژی که به پایه VREF/2 ( پایه شماره 9 در ADC0804 ) باید بدهیم ، بهش برخورد کردم، می ذارم ....



                      l
                      l
                      l-----> به همین دلیل من پایه VREF/2 رو آزاد گذاشتم . :agree:


                      :question: :question: یه سوالی که دارم اینه که پایه INTO ( پایه 16 میکرو کنترلر ) دقیقا چیه ؟؟ و چرا به پایه INTR آی سی وصل شده است ؟؟

                      دیدگاه


                        #12
                        پاسخ : * برنامه نویسی برای ADC خارجی

                        ببینید طرز کار ADC به این صورته:
                        ابتدا باید cs=0 بشه تا آی سی فعال بشه. سپس برای تبدیل ولتاژ ورودی باید یه لبه پایین رونده به پایه WR بدیم تا مبدل شروع به تبدیل ولتاژ به اعداد دیجیتال بکنه. این تبدیل یه مدت زمانی طول میکشه(بستگی به اون مقاومت و خازنی که روی پایه های CLK ) گذاشته شده داره. بعد از اتمام عملیات تبدیل، پایه INT (پایه 5 تو ADC) صفر میشه. پس ما میتونیم این پایه رو به پایه اینتراپت میکروکنترلر وصل کنیم و از اتمام عملیات تبدیل مطلع بشیم.(البته حتماً نباید این پایه به اینتراپت وصل بشه. بلکه میتونیم اونو به هر پایه ای وصل کنیم و با چک کردن اون پایه از اتمام عملیات مطلع بشیم. ولی بهتره اینتراپت استفاده بشه تا تو پروژه های بزرگتر دچار مشکل نشید). بعد از اینکه عملیات تبدیل تموم شد باید حاصل تبدیل رو به خروجی ADC ارسال کنیم. برای اینکه حاصل تبدیل از بافر ADC به خروجی انتقال پیدا کنه باید پایه RD رو صفر کنیم. بعد از صفر کردن این پایه خیلی ساده میتونیم حاصل تبدیل ADC رو از پورت مورد نظر بخونیم.

                        حالا شاید سوالی که پیش بیاد این باشه که ما با این اعداد چکار کنیم؟
                        خوب این اعداد خروجی که خوندیم یه ضریبی از ولتاژ ورودی هستند. این ضریب هم بدین صورت بدست میاد:
                        VREF/256

                        تو همه مبدل ها این رابطه صادقه و در مبدلهای دقت بالا فقط مخرج عوض میشه(مثلاً تو مبدل 10 بیتی مخرج 1023 میشه). vref ما هر چقدر که بود باید در 2 ضربش کنیم. (مثلاً اگه ولتاژ رفلنس 1.28 داده باشیم مقدارش میشه 2.56). حالا فرض کنیم یه ولتاژ 1.28 به عنوان مرجع برای ADC0808 تامین کرده باشیم و بخواهیم پله تبدیل رو بدست بیاریم:

                        2.56/255=0.01



                        با این نتایج برنامه زیر رو تو پروتئوس امتحان کنید و نتیجه رو بگید.



                        #include <mega16.h>
                        #include <stdio.h>
                        #include <stdlib.h>
                        #include <delay.h>
                        // Alphanumeric LCD Module functions
                        #asm
                        .equ __lcd_port=0x15 ;PORTC
                        #endasm
                        #include <lcd.h>

                        #define RD PORTA.0
                        #define WR PORTA.1
                        #define INT PINA.2

                        char s1[8];
                        float a;
                        void main(void)
                        {
                        DDRA=0x03;
                        DDRB=0x00;
                        WR=1;
                        lcd_init(16);
                        while (1)
                        {
                        WR=0;
                        delay_us(2);
                        WR=1;

                        RD=0;
                        delay_ms(20);
                        a=PINB;
                        a=(a*0.010);
                        RD=1;

                        lcd_clear();
                        ftoa(a,2,s1);
                        lcd_puts(s1);
                        delay_ms(100);
                        };
                        }




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

                        http://rapidshare.com/files/202858983/ADC0804_test.rar.html

                        دیدگاه


                          #13
                          پاسخ : * برنامه نویسی برای ADC خارجی

                          l-----> به همین دلیل من پایه VREF/2 رو آزاد گذاشتم .

                          بهتره واسش یه ولتاژ مرجع فراهم بکنی. اگه از LM35 بخوای استفاده کنی بهترین ولتاژ 1.28 ولت

                          دیدگاه


                            #14
                            پاسخ : * برنامه نویسی برای ADC خارجی

                            سلام ، خیلی ممنون .

                            دارم برنامه رو کامل می نویسم که تست کنم ...

                            فقط یک سوال دارم ، ببخشید اگه مبتدی هستم .. :redface:

                            تو این قسمت برنامه :

                            کد:
                             while (1)
                               {
                               WR=0;
                               delay_us(2);
                               WR=1;
                                
                               RD=0;
                               delay_ms(20);
                               a=PINB;
                               a=(a*0.010);
                               RD=1;

                            1-- اصلا نیازی نیست که از INT که در ابتدای برنامه هم تعریف کرده ایم ، استفاده کنیم ؟؟؟ ( مگه اینطور نیست که : زمانی که پردازش تبدیل کامل شد پایه 5 (INT) صفر می شود و
                            زمانی که پایه 5 (INT) صفر شد ما باید پایه 2 ( RD ) را 0 کنیم تا خط انتقالی دیتای 0 تا دیتای 7 فعال شود و مقدار به دست آوردن ارسال شود . بلــــــه ؟؟

                            شرمنده ام ، من هنوز با وقفه ها آشنا نشده ام ؟؟؟


                            2- در اینجای برنامه :

                            کد:
                             
                               RD=0;
                               delay_ms(20);
                               a=PINB;
                            یعنی ما باید پایه 2 ( RD ) را 0 کنیم تا خط انتقالی دیتای 0 تا دیتای 7 فعال شود و مقدار به دست آمده ارسال شود و حالا مقدار پورت B را می خوانیم ( که مقدار تبدیل شده است ) .درسته ؟؟

                            --> چرا پس نوشته اید ، PINB ، مگه پورت B خروجی میکرو ما نخواهد بود ؟ .( خروجی دیجیتال؟ )

                            دیدگاه


                              #15
                              پاسخ : * برنامه نویسی برای ADC خارجی

                              1-- اصلا نیازی نیست که از INT که در ابتدای برنامه هم تعریف کرده ایم ، استفاده کنیم ؟؟؟ (INT) صفر می شود و
                              زمانی که پایه 5 (INT) صفر شد ما باید پایه 2 ( RD ) را 0 کنیم تا خط انتقالی دیتای 0 تا دیتای 7 فعال شود و مقدار به دست آوردن ارسال شود . بلــــــه ؟؟
                              بله نیاز هست. باید اینتراپت رو فعال کنی یا اصلاً اگر اینتراپت کار نکردی میتونی به یکی از پایه ها وصلش کنی و اون پایه رو چک کنی. مثلاً بگی:



                              if(INT==0) {
                              RD=0;
                              delay_ms(20);
                              a=PINB;
                              a*=0.01;
                              RD=1;
                              }





                              شرمنده ام ، من هنوز با وقفه ها آشنا نشده ام ؟؟؟
                              اینم جواب بدم؟ آخه تهش علامت سوال گذاشتین. وقفه ها یه بحث خیلی ساده ای هستن. تو سایت سرچ کنی مطالب زیادی دربارش هست.


                              --> چرا پس نوشته اید ، PINB ، مگه پورت B خروجی میکرو ما نخواهد بود ؟ .( خروجی دیجیتال؟ )
                              تو AVR اگه پایه ای به عنوان ورودی باشه بهش میگن PIN و اگه خروجی باشه میگن PORT. این ها دو تا ریجیستر مجزا هستند که توسط ریجیستر DDR تعیین می شوند که به عنوان ورودی استفاده بشن یا خروجی.



                              اون برنامه رو تست کردین؟ جواب گرفتین؟

                              دیدگاه

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