اطلاعیه

Collapse
No announcement yet.

کار با مد تفاضلی ADC

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

    کار با مد تفاضلی ADC

    سلام
    در موردش سرچ زدم ولی مطلب بدرد بخوری پیدا نکردم
    میخوام یه سنسور رو که بصورت پل وتستون هست رو با avr بخونم ولی تنظیماتش رو نمیدونم و اینکه چطور باید مقدار adc رو تو مد تفاضلی خوند؟
    تنظیمات هم اینه: گین 10 با ولتاژ رفرنس داخلی
    خواهشا هر کی کار کرده راهنمایی بکنه
    ممنون
    از سختی نترس! این سختی هاست که جایگاه و مقام انسان را بالا میبرد...

    #2
    پاسخ : کار با مد تفاضلی ADC

    رجیستر [s]فیوز بیت[/s] MUX رو باید دستکاری کنین



    باید MUX0-4 رو روی 01001 تنظیم کنین. بعد رجیستر [s]فیوز بیت[/s] های نتیجه رو بخونین.
    [glow=green,2,300][b]بشر ممکن الخطاست
    درخت هرچه پربار تر سر به زیر تر[/glow]

    دیدگاه


      #3
      پاسخ : کار با مد تفاضلی ADC

      مرسی از توجه
      یعنی به این شکل:
      [code=c]ADMUX=0x0b11001001;[/code]

      حالا مقدار رو چطوری بخونم؟
      برای یک خروجی مثلا صفر از این تابع استفاده میکنیم:
      [code=c]read_adc(0)[/code]
      برای تفاضلی چی؟؟؟
      از سختی نترس! این سختی هاست که جایگاه و مقام انسان را بالا میبرد...

      دیدگاه


        #4
        پاسخ : کار با مد تفاضلی ADC

        نوشته اصلی توسط Eh San
        مرسی از توجه
        یعنی به این شکل:
        [code=c]ADMUX=0x0b11001001;[/code]

        حالا مقدار رو چطوری بخونم؟
        برای یک خروجی مثلا صفر از این تابع استفاده میکنیم:
        [code=c]read_adc(0)[/code]
        برای تفاضلی چی؟؟؟
        ای وای! من چرا به رجیستر گفتم فیوز بیت؟!!!؟

        شما دیتا رو مستقیما از رجیستر های ADCH و ADCL بخونین بعد اون ها رو با شیفت دادن بزارین کنار هم که یه عدد 10 بیتی در بیاد. (البته اگه مد 10 بیتی هست!)
        ADCH مال باین پر ارزش هست و ADCL بایت کم ارزش.

        ولی یه نکته هست. بیت ADLAR تو رجیستر ADMUX رو باید بهش توجه کنین موقع خوندن. یه این شکل ها نگاه کنین.



        [glow=green,2,300][b]بشر ممکن الخطاست
        درخت هرچه پربار تر سر به زیر تر[/glow]

        دیدگاه


          #5
          پاسخ : کار با مد تفاضلی ADC

          جواب نمیده :angry:
          خروجی فقط صفر میده
          از سختی نترس! این سختی هاست که جایگاه و مقام انسان را بالا میبرد...

          دیدگاه


            #6
            پاسخ : کار با مد تفاضلی ADC

            نوشته اصلی توسط Eh San
            جواب نمیده :angry:
            خروجی فقط صفر میده
            شما نباید از هیچ تابعی استفاده کنین چون قراره از مد دیفرانسیلی استفاده کنین.

            یه نگاهی به رجیستر ADCSRA بندازین (شماره بیت ها رو نگفتم. خودتون از اینترنت پیدا کنین کدوم اسم ، کدوم بیته)

            ADCEN باید 1 باشه.
            ADATE باید 0 باشه.
            ADSC رو هر وقت خواستین مقدار بگیرین، 1 کنین. خودش هر وقت نمونه برداری تموم شد 0 میشه.
            هر وقت نمونه برداری تموم شد ADIF یک میشه.
            اگر ADIE رو 1 کنین مد وقفه ای ADC فعال میشه که فعلا احتیاجی بهش نداریم.

            بیت های ADPS0-2:
            برای prescaler باید فرکانس میکرو رو بر هر کدوم از این نسبت تقسیم ها تقسیم کنین. هر کدم بین 50KHz و 200KHz شد، همون رو انتخاب کنین.



            ____________________________________________

            رجیستر ADMUX:

            بیت های MUX رو که جدولشون بالا هست.

            بیت ADLAR رو 0 بذارین.

            بیت های REFS0-1 :


            ______________________________________________

            و سرانجام:

            حاصل رو از رجیستر های ACDH و ADCL بخونین.

            به این صورت :

            [code=c]
            uint16_t a =0;
            a=ADCH;
            a *= 256;
            a += ADCL;
            [/code]
            [glow=green,2,300][b]بشر ممکن الخطاست
            درخت هرچه پربار تر سر به زیر تر[/glow]

            دیدگاه


              #7
              پاسخ : کار با مد تفاضلی ADC

              ممنون واقعا
              با این کد تونستم جواب بگیرم ولی فقط یکبار نمونه برداری میکنه! و همونو هی تکرار میکنه

              [code=c]// ADC initialization
              // ADC Clock frequency: 500.000 kHz
              // ADC Voltage Reference: Int., cap. on AREF
              // ADC Auto Trigger Source: ADC Stopped
              ADMUX=0xC9;
              ADCSRA=0xC4;

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

              while (1)
              {
              // Place your code here
              ADCSRA |= 0x40;
              while ((ADCSRA & 0x10)==0);
              printf("ADC:%d\r\n",(ADCH<<8)+ADCL );
              delay_ms(100);
              }[/code]
              از سختی نترس! این سختی هاست که جایگاه و مقام انسان را بالا میبرد...

              دیدگاه


                #8
                پاسخ : کار با مد تفاضلی ADC

                نوشته اصلی توسط Eh San
                ممنون واقعا
                با این کد تونستم جواب بگیرم ولی فقط یکبار نمونه برداری میکنه! و همونو هی تکرار میکنه

                [code=c]// ADC initialization
                // ADC Clock frequency: 500.000 kHz
                // ADC Voltage Reference: Int., cap. on AREF
                // ADC Auto Trigger Source: ADC Stopped
                ADMUX=0xC9;
                ADCSRA=0xC4;

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

                while (1)
                {
                // Place your code here
                ADCSRA |= 0x40;
                while ((ADCSRA & 0x10)==0);
                printf("ADC:%d\r\n",(ADCH<<8)+ADCL );
                delay_ms(100);
                }[/code]
                خوب اگه اون یکبار رو درست انجام بده، اگه کل برنامه رو (اون دو خط مقدار دهی به رجیستر ها) تو while بزاری باید جواب بده.

                شما با کدویژن کار میکنین؟ من کد ها رو با اتمل استودیو نوشتم . البته اونی که نوشتم فرقی نمیکنه.
                [glow=green,2,300][b]بشر ممکن الخطاست
                درخت هرچه پربار تر سر به زیر تر[/glow]

                دیدگاه


                  #9
                  پاسخ : کار با مد تفاضلی ADC

                  بله با کدویژن کار میکنم
                  مشکل اینجاست که تو while میزارم همون نمونه برداری اول رو نمایش میده!!!
                  از سختی نترس! این سختی هاست که جایگاه و مقام انسان را بالا میبرد...

                  دیدگاه


                    #10
                    پاسخ : کار با مد تفاضلی ADC

                    مشکلم حل شد
                    باید از مد Free Running استفاده کنیم
                    برنامه رو میزارم برای کسایی که مثل من به مشکل خوردن
                    من با این کد جواب گرفتم:

                    [code=c]#include <mega32a.h>

                    #include <delay.h>
                    #include <stdio.h>

                    // Declare your global variables here
                    int i;
                    float x;

                    unsigned int read_adc(void)
                    {
                    ADCSRA|=(1<<ADSC);
                    while(!(ADCSRA & (1<<ADIF)));
                    return ADCW;
                    }

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

                    // USART initialization
                    // Communication Parameters: 8 Data, 1 Stop, No Parity
                    // USART Receiver: Off
                    // USART Transmitter: On
                    // USART Mode: Asynchronous
                    // USART Baud Rate: 9600
                    UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
                    UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
                    UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL);
                    UBRRH=0x00;
                    UBRRL=0x33;

                    // ADC initialization
                    // ADC Clock frequency: 500.000 kHz
                    // ADC Voltage Reference: Int., cap. on AREF
                    // ADC Auto Trigger Source: Free Running
                    ADMUX=0xC9;
                    ADCSRA=(1<<ADEN) | (0<<ADSC) | (1<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);
                    SFIOR=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);

                    while (1)
                    {
                    // Place your code here
                    for(i=0;i<10;i++)
                    x+=read_adc();
                    x/=10;
                    printf("ADC:%0.0f\r\n",x);
                    delay_ms(100);
                    }
                    }
                    [/code]

                    البته خروجی بصورت مکمل دو هست.
                    از سختی نترس! این سختی هاست که جایگاه و مقام انسان را بالا میبرد...

                    دیدگاه


                      #11
                      پاسخ : کار با مد تفاضلی ADC

                      آقای امیر حسین بیگدلی خیلی خیلی ممنون از کمکتون
                      از سختی نترس! این سختی هاست که جایگاه و مقام انسان را بالا میبرد...

                      دیدگاه

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