اطلاعیه

Collapse
No announcement yet.

راه اندازی ADCآی سی AVR مثلا mega32

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

    راه اندازی ADCآی سی AVR مثلا mega32

    سلام
    از دوستان کسی می تونه بگه با کدویژن چگونه ADC میکرو را راه اندازی میکنند؟ :-/ :-/
    البته یه چیزایی بلدم ولی درست نمی دونم به پایه های AVCC باید چی وصل کرد و براچی باید وصل کرد یا اصلا لازمه ؟ :-/ :-/
    در خود برنامه ای که نوشتم هم اخطار میده که فرمان :
    read_adc(i)
    را نمی شناسد.
    کل برنامه :

    #include <mega32a.h>

    #include <delay.h>

    #define ADC_VREF_TYPE 0xC0

    // ADC interrupt service routine
    interrupt [ADC_INT] void adc_isr(void)
    {
    unsigned int adc_data;
    // Read the AD conversion result
    adc_data=ADCW;
    // Place your code here

    }

    // Declare your global variables here

    void main(void)
    {
    // Declare your local variables here

    // Input/Output Ports initialization
    // Port A initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTA=0x00;
    DDRA=0x00;

    // Port B initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=0 State2=T State1=T State0=T
    PORTB=0x00;
    DDRB=0x08;

    // Port C initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTC=0x00;
    DDRC=0x00;

    // Port D initialization
    // Func7=Out Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=0 State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTD=0x00;
    DDRD=0x80;

    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 1000.000 kHz
    // Mode: Fast PWM top=0xFF
    // OC0 output: Non-Inverted PWM
    TCCR0=0x6A;
    TCNT0=0x00;
    OCR0=0x00;

    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: 125.000 kHz
    // Mode: Fast PWM top=0x00FF
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0x01;
    TCCR1B=0x0B;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;

    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: 1000.000 kHz
    // Mode: Fast PWM top=0xFF
    // OC2 output: Non-Inverted PWM
    ASSR=0x00;
    TCCR2=0x6A;
    TCNT2=0x00;
    OCR2=0x00;

    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    // INT2: Off
    MCUCR=0x00;
    MCUCSR=0x00;

    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x00;

    // USART initialization
    // USART disabled
    UCSRB=0x00;

    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;

    // ADC initialization
    // ADC Clock frequency: 1000.000 kHz
    // ADC Voltage Reference: Int., cap. on AREF
    ADMUX=ADC_VREF_TYPE;
    ADCSRA=0x86;
    SFIOR&=0xEF;

    // SPI initialization
    // SPI disabled
    SPCR=0x00;

    // TWI initialization
    // TWI disabled
    TWCR=0x00;

    // Global enable interrupts
    #asm("sei&quot

    while (1)
    {
    // Place your code here
    int i , s[5], x[5] , y[5] , m[5] ;
    s[i]=read_adc(i);

    }
    }
    هدف من خوندن خروجی سنسور روبات تعقیب خط با میکرو است. از پمپ راضی نیستم.می خوام ازADC استفاده کنم؟
    ممنون پیشا پیش عیدتونم مبارک :biggrin:
    اگر تنهاترین تنها شوم باز هم خدا هست.(شهید چمران)

    #2
    پاسخ : راه اندازی ADCآی سی AVR مثلا mega32

    سلام دوست من

    داخل کدویژه از سربرگ adc اونو فعال میکنی

    حالا تو همون جا باید ولتاژ مبنا(Volt.Ref) رو انتخاب کنی

    AREF : اگه این مورد انتخاب کنی ولتاژ مبنا از این پایه ایسی تامین میشه(پایه 32 در اتمگا16 و 32)
    AVCC : اگه این یکی رو انتخاب کنی ولتاژ مبنا از اینجا تامین میشه (پایه 30)
    اگر که گزینه Int,cap رو انتخاب کنی ولتاژ مبنا میشه 2.56 ولت
    0.0025*عدد خوانده شده از ADC=ولتاژ ADC <------تو این حالت
    برای محاسبه ولتازژ هم داریم:
    ماکزیمم عدد ADC/عدد خوانده شده از ADC * ولتاژ مبنا=VADC
    در ضمن اگه ای دی سی فعال کنی دیگه نمیتونی از اون پورت برای کاری غیر از ای دی سی استفاده کنی
    مثلا تو اتمگا 32 وقتی ای دی سی فعال بشه در واقع کل پورت a رو دیگه نمیتونی به عنوان خروجی یا ورودی استفاده بکنی و فقط میشه از اونا به عنوان ای دی سی استفاده کرد
    زندگي يه محيط برنامه نويسيه که خودمون برنامشو مينويسيم
    و هر لحظه امکان فشار روي کليک run هست
    پس ريسک نکنين خط به خط برنامتون رو چک بکنيد چون شايد ديگه فرصت دباگ کردن برنامه رو نداشته باشيد.
    الهم اغفر لنا ذنوبنا

    دیدگاه


      #3
      پاسخ : راه اندازی ADCآی سی AVR مثلا mega32

      سلام
      من این کار را کردم ولی وقتی فرمان میدم ADCرا بخواند و در آرایه مثلا s بریزد اخطار میدهد که این فرمان را نمی شناسد


      read_adc
      نمیشناسد
      :sad:
      اگر تنهاترین تنها شوم باز هم خدا هست.(شهید چمران)

      دیدگاه


        #4
        پاسخ : راه اندازی ADCآی سی AVR مثلا mega32

        سلام :bye
        به احتمال زیاد تو جزییات ایراد داره
        حالا برنامتو بزار تا ببینیم چی کار کردی :agree:
        این یه نمونه
        a=read_adc(0) 1
        itoa(a,s1) 2
        موفق باشی :nice:
        زندگي يه محيط برنامه نويسيه که خودمون برنامشو مينويسيم
        و هر لحظه امکان فشار روي کليک run هست
        پس ريسک نکنين خط به خط برنامتون رو چک بکنيد چون شايد ديگه فرصت دباگ کردن برنامه رو نداشته باشيد.
        الهم اغفر لنا ذنوبنا

        دیدگاه


          #5
          پاسخ : راه اندازی ADCآی سی AVR مثلا mega32

          با سلام.
          دوست عزیز شما تو برنامه تون ولتاژ مرجع رو در حالت داخلی قرار دادین و وقفه ADC رو هم فعال کردین. در حالتی که شما وقفه رو فعال می کنید در پایین همون قسمت یه گذینه Enable ظاهر میشه که با تیکدار کردن آن و تعیین ADC های مورد نظر برای چک شدن، خود میکرو مقادیر ADC رو گرفته و داخل یه ارایه قرار میده.
          استفاده از این روش برای مدارات رباتیک که در اونها سرعت اسکن خیلی مهمه فکر کنم بهتر باشه.
          اما اگر می خواین خودتون هر کانال رو که خواستین چک کنید دیگه نیازی به فعال کردن وقفه نیست.
          من در فایل زیر یه برنامه براتون می زارم که ADC0 رو با استفاده از دستوری که گفتین چک می کنه و مقدار اون رو روی LCD نمایش میده.و همچنین یه برنامه هم با روشی که گفتم براتون می زارم تا با طرز کار اون هم آشنا بشین.
          راستی تو زبان C متغیرها رو داخل حلقه while تعریف نمی کنن.
          در مورد پایه AVCC باید بگم که این پایه در حالت استفاده از ADC باید وصل بشه و حتی تو دیتاشیت گفته که در موقع استفاده از پورت A بدون استفاده از ADC هم لازمه.این پایه در حقیقت بخش تغذیه ADC هستش و اتصال اون الزامیه.
          موفق باشید


          فایل های پیوست شده
          چرا ناراحتی پاتریک!
          + امروز ی بچه دیدم سرچهارراه گل میفروخت
          - از دیدنش ناراحت شدی؟
          + نه
          پس چی ناراحتت کرده
          + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
          ------------------------------------------------------------------------------------------------------
          تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
          ------------------------------------------------------------------------------------------------------
          محصولات

          دیدگاه


            #6
            پاسخ : راه اندازی ADCآی سی AVR مثلا mega32

            سلام
            با دقت در برنامه ای که برام فرستادید فهمیدم که مشکل کار من کجا بوده من گزینه interrupt را میزدم که باعث شد دستور read_adc را نمی شناخت. چرا این طوری میشه؟می تونم ازتون خواهش کنم یه آموزش کامل از ای دی سی به صورتی که در برنامه کد ویژن است را بگزارید؟
            ممنون
            اگر تنهاترین تنها شوم باز هم خدا هست.(شهید چمران)

            دیدگاه


              #7
              پاسخ : راه اندازی ADCآی سی AVR مثلا mega32

              سلام به همه ی دوستان خوبم...
              ADC مخفف "Analog-Digital Converter" و به معنای مبدل آنالوگ به دیجیتال است.
              اگر بخواهیم این قابلیت را به صورت ساده توصیف کنیم، یک ولت متر دیجیتال است که بر روی پایهآ‌های میکروکنترلر نصب شده است و به وسیلهآ‌ی آن میآ‌توان ولتاژ پایهآ‌های ورودی را با دقت مناسبی اندازهآ‌گیری کرد. همانطور که میآ‌دانید ما تا به حال در هیچآ‌ آی سی نمیآ‌توانستیم شدت ولتاژ ورودی را به دقت اندازه گیری کنیم و فقط میآ‌توانستیم بدانیم آیا ولتاژ ورودی بالای 2.5 ولت است یا زیر 2.5 ولت، و ورودیآ‌هایمان را به صورت 0 و 1 برسی میآ‌کردیم.(آی سی ها ورودیآ‌های خود را منطقی میآ‌کنند)
              اما به کمک این قابلیتِ میکروکنترلرآ‌هایِ خانوادهآ‌ی AVR، ما میآ‌توانیم با دقت مناسبی ولتاژ ورودی خود را بررسی کنیم.
              یکی از کاربردآ‌های مهم ADC میآ‌تواند در رباتآ‌های امدادگر دانشآ‌اموزی برای تشخیص رنگ باشد. همانطور که میآ‌دانید هر رنگ، میزان مشخصی از نور را بازتاب میآ‌دهد و بقیهآ‌ را جذب میآ‌کند، ما با اندازهآ‌گیری مقدار نور بازتاب شده، میتوانیم رنگ را تشخیص دهیم. در اینجا ما برای اندازهآ‌گیری میزان شدت نور بازتاب شده، باید از ADC میکروکنترلر استفاده آ‌کنیم تا بتوانیم ولتاژ خروجی سنسور نوری خود را به دقت اندازهآ‌گیری کنیم.
              زیر پرچم سه رنگ/واسه پرچم سفید/مادرم دعا می کرد/پدرم می جنگید...

              دیدگاه


                #8
                پاسخ : راه اندازی ADCآی سی AVR مثلا mega32

                در زیر روش راه اندازی ADC از پایه توضیح داده شده است:
                ابتدا CodeWizard را باز کرده و در آن، لبهآ‌ی ADC را انتخاب میآ‌کنیم، و در لبهآ‌ی ADC، گزینهآ‌ی "ADC Enabled" را تیک میآ‌زنیم و سپس مانند شکل زیر تنظیمات را انجام میآ‌دهید :

                همانطور که میآ‌بینید، دومین قسمتی که تیک زده شده "Use 8 bits" است.در ادامه در مورد دلیل این کار توضیح داده شده است.
                همانطور که گفته شد، وظیفهآ‌ی ADC، اندازه گیری ولتاژی است که بر روی پایهآ‌ی ورودی قرار گرفته است. اما ADC عددی را که مولتی متر به ما نشان میآ‌دهد گزارش نمیآ‌کند، بلکه متناسب با ولتاژ پایهآ‌ی ورودی، عددی را در بازهآ‌ی 0 تا 255 به ما گزارش میآ‌کند. یعنی عدد 0 را به ولتاژ 0ولت اختصاص میآ‌دهد، و 255 را به 5 ولت؛ و هر ولتاژی بین 0 تا 5 ولت را، متناسباً، با عددی بین 0 تا 255 گزارش میآ‌کند. در حقیقت برای سهولت در محاسبه، می توانید فرض کنید اندازهآ‌ی ولتاژ ورودی بر حسب ولت، ضربدر 51، برابرست با عددی که ADC برای آن ولتاژ مشخص، به ما گزارش میآ‌کند.
                به عنوان مثالی دیگر، اگر خروجی مدار یک سنسور نوری را به پایهآ‌ی ورودی ADC متصل کرده باشید، و خروجی مدار سنسور 2 ولت باشد،آ‌ADC عدد 102 را به ما گزارش میآ‌کند.
                اگر تیکِ گزینهآ‌ی "Use 8 bits" را برداریم، بازهآ‌ی ما به 0 تا 1024، گشترش پیدا خواهد کرد و در حقیقت دقت اندازهآ‌گیری ما 4 برابر خواهد شد. یعنی 5 ولت ما، به جای 255، با عدد 1024 گزارش خواهد شد، و ولتاژهای بین 0 و 5 ولت نیز متناسباً با عددی بین 0 تا 1024 گزارش خواهند شد. اما در کارآ‌های ما نیازی به این دقت بالا نیست و معمولاً "Use 8 bits" را تیک میآ‌زنیم تا بازهآ‌ی ما بین 0 تا 255 باشد.
                زیر پرچم سه رنگ/واسه پرچم سفید/مادرم دعا می کرد/پدرم می جنگید...

                دیدگاه


                  #9
                  پاسخ : راه اندازی ADCآی سی AVR مثلا mega32

                  در میکرو کنترلر ATMEGA16 ، هشت پایه ی به ADC اختصاص داده شده، یعنی شما می توانید به صورت همزمان، خروجیِ 8 سنسور یا مدار جانبی را به میکروکنترلر خود وصل کنید و اطلاعات آن ها را به وسیله ی ADC دریافت کنید.
                  اما این 8 پایه کدام پایه ها هستند؟
                  این 8 پایه، پایه های مربوط به پورت A هستند که با فعال کردن ADC در CodeWizard، این پایه ها در اختیار ADC قرار می گیرند. دقت کنید که برای استفده از ADC حتماً باید قبلاً تنظیمات را در CodeWizard انجام داده باشید.
                  این 8 پایه طبق شکل زیر از ADC0 تا ADC7 نام گذاری شده اند.

                  چگونه از ADC در برنامه استفاده کنیم؟
                  هنگامیکه شما تنظیمات اولیه را برای فعال سازی ADC در CodeWizard انجام می دهید، به شما این امکان داده می شود که در هر قسمت از برنامه، مقدار هر یک از 8 ADC را بخوانید و از آن استفاده کنید. عبارت" (شماره یADC )" read_adcدر هر قسمت از برنامه، حاوی مقدار ADC مورد نظر شماست. مثلاً اگر بخواهیم مقدار ADC0 را بررسی کنیم که آیا از 100 بزرگتر است یا خیر، به شکل زیر عمل میآ‌کنیم:
                  if(read_adc(0) > 100)
                  یا مثلاً اگر بخواهیم مقدار ADC1 را در داخل یک متغیر نگه داری کنیم، به شکل زیر عمل می کنیم:
                  int a;
                  a= read_adc(1);
                  مبدل آنالوگ به دیجیتال، یکی از مهمترین قابلیتآ‌هایست که اکثر میکروکنترلرآ‌های خانوادهآ‌ی AVR آن را دارند. در میکروکنترلرآ‌های قدیمیآ‌تر، برای این کار، باید یک آی سی به صورت جداگانه بر روی مدار تعبیه میآ‌شد.
                  زیر پرچم سه رنگ/واسه پرچم سفید/مادرم دعا می کرد/پدرم می جنگید...

                  دیدگاه


                    #10
                    پاسخ : راه اندازی ADCآی سی AVR مثلا mega32

                    تو بیسکام هم میشه راهنمایی کنید؟
                    ممنون
                    من آن گلبرگ مغرورم که می میرم ز بی آبی ولی با خفت و خواری پی شبنم نمی گردم.

                    دیدگاه


                      #11
                      پاسخ : راه اندازی ADCآی سی AVR مثلا mega32

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

                      دیدگاه

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