اطلاعیه

Collapse
No announcement yet.

مشکل در نتیجه تبدیل ADC

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

    مشکل در نتیجه تبدیل ADC

    با سلام خدمت اساتید خبره انجمن.
    در یک برد آزمایشی از ADC استفاده کردم و در آن سر وسط یک پتانسیومتر را به ADC2 وصل کردم و دو سر دیگه رو به VCC و GND.
    اما نمیدونم چرا وقتی پتانسیومتر به میکرو متصل میشه تغییرات ولتاژش غیر خطی میشه. به این ترتیب که مثلا اگر در حالی که سر وسط پتانسیومتر از میکرو جدا باشه به ازای مقدار مشخص از چرخش آن (چه در ولتاژهای پایین و چه در ولتاژهای بالا) تغییرات ولتاژ سر وسط ثابته در حالی که بعد از اتصال آن به میکرو در ولتاژهای پایین(نزدیک به GND) تغییرات ولتاژ کم و در ولتاژهای نزدیک به VCC تغییرات ولتاژ زیاد میشه.
    تمام تنظیمات پیکربندی ADC و اتصال سخت افزاری رو هم با منابع مورد تایید چک کردم.
    لطفا اگه این مساله راه حل یا لم خاصی داره راهنمایی کنید.

    ممنون

    #2
    پاسخ : مشکل در نتیجه تبدیل ADC

    نوشته اصلی توسط mrr1361
    با سلام خدمت اساتید خبره انجمن.
    در یک برد آزمایشی از ADC استفاده کردم و در آن سر وسط یک پتانسیومتر را به ADC2 وصل کردم و دو سر دیگه رو به VCC و GND.
    اما نمیدونم چرا وقتی پتانسیومتر به میکرو متصل میشه تغییرات ولتاژش غیر خطی میشه. به این ترتیب که مثلا اگر در حالی که سر وسط پتانسیومتر از میکرو جدا باشه به ازای مقدار مشخص از چرخش آن (چه در ولتاژهای پایین و چه در ولتاژهای بالا) تغییرات ولتاژ سر وسط ثابته در حالی که بعد از اتصال آن به میکرو در ولتاژهای پایین(نزدیک به GND) تغییرات ولتاژ کم و در ولتاژهای نزدیک به VCC تغییرات ولتاژ زیاد میشه.
    تمام تنظیمات پیکربندی ADC و اتصال سخت افزاری رو هم با منابع مورد تایید چک کردم.
    لطفا اگه این مساله راه حل یا لم خاصی داره راهنمایی کنید.

    ممنون
    سلام
    ببین دوست عزیز
    شما ولتاژ مرجع رو گرفتید AVCC ...
    یعنی اینکه VCC چه ولتاژش 5 ولت یا 3 ولت باشه جواب فرقی نمیکنه ...
    موفق باشید
    [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
    معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
    معرفی نرم افزار Codewizard PWM
    با من بیشتر آشنا شوید

    دیدگاه


      #3
      پاسخ : مشکل در نتیجه تبدیل ADC

      ببخشید دوست عزیز، اما من مشکلم حل نشد
      من ADC رو به شکل زیر کانفیگ کردم
      ADMUX=(1<<REFS0)|(1<<MUX1);

      ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<A DIE)|(1<<ADPS2)|(1<<ADPS1);

      لطفا اگه ممکنه راه حل بدید

      دیدگاه


        #4
        پاسخ : مشکل در نتیجه تبدیل ADC

        نوشته اصلی توسط سامان اسدی
        سلام
        ببین دوست عزیز
        شما ولتاژ مرجع رو گرفتید AVCC ...
        یعنی اینکه VCC چه ولتاژش 5 ولت یا 3 ولت باشه جواب فرقی نمیکنه ...
        موفق باشید
        چه باید کرد؟

        دیدگاه


          #5
          پاسخ : مشکل در نتیجه تبدیل ADC

          الان شما ولتاژ مرجع رو دادید AVCC یعنی اینکه ولتاژ VCC رو بین 2.8 تا 5.5 ولت هم که بدید نتیجه فرقی نمیکنه ...
          شما میخواید چیکار کنید ؟؟
          بگید تا راهنمایی تون کنم ...

          اضافه شده در تاریخ :
          میشه کل برنامه را بگذارید ...
          کل برنامه ...
          ممنون
          [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
          معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
          معرفی نرم افزار Codewizard PWM
          با من بیشتر آشنا شوید

          دیدگاه


            #6
            پاسخ : مشکل در نتیجه تبدیل ADC

            نوشته اصلی توسط سامان اسدی
            میشه کل برنامه را بگذارید ...
            کل برنامه ...
            ممنون
            از توجهتون ممنونم دوست من.
            این متن برنامست و همونطور که مشخصه نتیجه ADC بصورت یک فرکانس روی port ظاهر میشه
            لازمه بگم من ولتاژ سر وسط پتانسیومتر رو با اسکوپ هم چک کردم و جالبه بدونید وقتی پتانسیومتر به پایه ADC وصل نیست تغییرات ولتاژ خطی و یکنواخته اما به میکرو که وصل میشه نتیجه تغییر میکنه.


            #define F_CPU 8000000UL
            #include <avr/io.h>
            #include <avr/interrupt.h>


            #define FRQ_MAX 800U
            #define FRQ_MIN 5U
            #define cbi(port, bit) (port) &= ~(1 << (bit))
            #define sbi(port, bit) (port) |= (1 << (bit))

            uint16_t frq_set=FRQ_MIN;

            ISR(ADC_vect)
            {
            static uint32_t adc_temp=0;
            static uint8_t n=0;

            adc_temp+=ADCW;
            if(++n==64U)
            {
            adc_temp=(adc_temp>>8U);

            frq_set=(uint16_t)(adc_temp);

            if (frq_set>FRQ_MAX) frq_set=FRQ_MAX;
            if (frq_set<FRQ_MIN) frq_set=FRQ_MIN;

            OCR2=(uint8_t)frq_set;

            n=0;
            adc_temp=0;
            }

            ADCSRA|=(1<<ADSC);

            }



            int main(void)
            {

            DDRA=0b11111111;
            PORTA=0b11;

            DDRB=0b11111111;
            PORTB=0;

            DDRC=0b11111000;
            PORTC=0b111;

            DDRD=0b11111110;
            PORTD=0b11111111;

            TCCR2=(1<<CS20)|(1<<CS21)|(1<<WG M21)|(1<<COM20);
            TCNT2=0;
            OCR2=250;

            ADMUX=(1<<REFS0)|(1<<MUX1);
            ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<A DIE)|(1<<ADPS2)|(1<<ADPS1);

            sei();

            while(1)
            {
            //TODO:: Please write your application code
            }
            }

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

            دیدگاه


              #7
              پاسخ : مشکل در نتیجه تبدیل ADC

              نوشته اصلی توسط mrr1361
              از توجهتون ممنونم دوست من.
              این متن برنامست و همونطور که مشخصه نتیجه ADC بصورت یک فرکانس روی port ظاهر میشه
              لازمه بگم من ولتاژ سر وسط پتانسیومتر رو با اسکوپ هم چک کردم و جالبه بدونید وقتی پتانسیومتر به پایه ADC وصل نیست تغییرات ولتاژ خطی و یکنواخته اما به میکرو که وصل میشه نتیجه تغییر میکنه.

              کد:
              #define F_CPU 8000000UL
              #include <avr/io.h>
              #include <avr/interrupt.h>
              
              
              #define FRQ_MAX 800U
              #define FRQ_MIN 5U
              #define cbi(port, bit) (port) &= ~(1 << (bit))
              #define sbi(port, bit) (port) |= (1 << (bit))
              
              uint16_t frq_set=FRQ_MIN;
              
              ISR(ADC_vect)
              {
              	static uint32_t adc_temp=0;
              	static uint8_t n=0;
              	
              	adc_temp+=ADCW;
              	if(++n==64U)
              	{
              		adc_temp=(adc_temp>>8U);
              
              		frq_set=(uint16_t)(adc_temp);
              
              		if (frq_set>FRQ_MAX) frq_set=FRQ_MAX;
              		if (frq_set<FRQ_MIN) frq_set=FRQ_MIN;
              
              		OCR2=(uint8_t)frq_set;
              		
              		n=0;
              		adc_temp=0;
              	}
              	
              	ADCSRA|=(1<<ADSC);
              	
              }	
              
              
              
              int main(void)
              {
              	
              		DDRA=0b11111111;
              		PORTA=0b11;
              	
              		DDRB=0b11111111;
              		PORTB=0;
              	
              		DDRC=0b11111000;
              		PORTC=0b111;
              	
              		DDRD=0b11111110;
              		PORTD=0b11111111;			
              		
              		TCCR2=(1<<CS20)|(1<<CS21)|(1<<WGM21)|(1<<COM20);	
              		TCNT2=0;
              		OCR2=250;
              	
              		ADMUX=(1<<REFS0)|(1<<MUX1);
              		ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);	
              
              		sei();
              	
              	while(1)
              	{
              		//TODO:: Please write your application code
              	}
              }
              اینم بگم که من تخصصم مکانیکه و حسب علاقه ای که به برنامه نویسی دارم شروع به یادگیری AVR کردم و اگه اشتباههای پیش پا افتاده تو کدهام میبینید صبوری کنید و راهنمایی.
              بازم ممنون.
              دوست عزیز
              شما اون پایه را خروجی تعریف کردید
              دیشب حدس زدم که یا مقاومت پول پ داخلی فعال شده یا خروجی شده ...
              کد:
                 DDRA=0b11111111;
                 PORTA=0b11;
              باید برنامه شما این دوخط را به کد زیر تغییر بدید :
              کد:
                 DDRA=0b11111011;
                 PORTA=0b0000011;
              اگر از کانال 2 بخوانید کد شما اینگونه می شود .
              موفق باشید
              [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
              معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
              معرفی نرم افزار Codewizard PWM
              با من بیشتر آشنا شوید

              دیدگاه


                #8
                پاسخ : مشکل در نتیجه تبدیل ADC

                نوشته اصلی توسط سامان اسدی
                دوست عزیز
                شما اون پایه را خروجی تعریف کردید
                دیشب حدس زدم که یا مقاومت پول پ داخلی فعال شده یا خروجی شده ...
                کد:
                   DDRA=0b11111111;
                   PORTA=0b11;
                باید برنامه شما این دوخط را به کد زیر تغییر بدید :
                کد:
                   DDRA=0b11111011;
                   PORTA=0b0000011;
                اگر از کانال 2 بخوانید کد شما اینگونه می شود .
                موفق باشید
                آقا خدا خیرت بده
                مشکل حل شد
                (عجب سوتی داده بودم)
                به خاطر وقتی که گذاشتید هم ممنون.
                موفق باشید

                دیدگاه


                  #9
                  پاسخ : مشکل در نتیجه تبدیل ADC

                  نوشته اصلی توسط mrr1361
                  آقا خدا خیرت بده
                  مشکل حل شد
                  (عجب سوتی داده بودم)
                  به خاطر وقتی که گذاشتید هم ممنون.
                  موفق باشید
                  خواهش میکنم ...
                  موفق باشید
                  [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
                  معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
                  معرفی نرم افزار Codewizard PWM
                  با من بیشتر آشنا شوید

                  دیدگاه

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