اطلاعیه

Collapse
No announcement yet.

مشکل دماسنج

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

    #16
    پاسخ : مشکل دماسنج

    رو دوتا میکرو امتحان کردم، هردوشون پین Aref حدود 1.26 ولت و ADC0 1.24!!! یعنی تا حالا کسی چنین مشکلی نداشته؟ :eek:
    عاشق الکترونیک

    دیدگاه


      #17
      پاسخ : مشکل دماسنج

      رجیسترهای ADMUX و ADCSRA رو چطور تنظیم کردی؟
      توی راه پایه پایه AVCC فیلتر گذاشتی؟ (مثل صفحه 196 دیتاشیت)

      دیدگاه


        #18
        پاسخ : مشکل دماسنج

        واقعا شرمنده، یه سوتی داده بودم البته در واقع مشکل از برد بورد بود، حالا همه چی درسته بجز عددی که روی سون سگمنت نشون میده.
        الان ولتاژ رفرانس شد 2.56 ولت، ولی سون سگمنت باز هم 88 رو نشون میده، فکر کنم شیوه ی تفکیک رقم های اول و دومم غلطه. این هم کد برنامه:
        کد:
        /*
         * GccApplication1.c
         *
         * Created: 4/7/2013 11:34:57 PM
         * Author: Mahdi
         */ 
        
        
        #include <avr/io.h>
        #include <avr/interrupt.h>
        void InitADC()
        {
        	ADMUX=(1<<REFS0)|(1<<REFS1);// AREF=internal 2.56v
        	ADCSRA=(1<<ADEN)|(1<<ADPS0)|(1<<ADPS1)|(1<<ADPS2);
        }
        
        uint16_t ReadADC(uint8_t ch)
        {
        	//Select ADC Channel ch must be 0-5
        	ADMUX|=ch;
        
        	//Start Single conversion
        	ADCSRA|=(1<<ADSC);
        
        	//Wait for conversion to complete
        	while(!(ADCSRA & (1<<ADIF)));
        
        	//Clear ADIF by writing one to it
        	ADCSRA|=(1<<ADIF);
        
        	return(ADC);
        }
        
        int main(void)
        {
        	char segment[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
        	DDRB=0xFF;//output
        	DDRD=0xFF;//output
        	sei();
        	InitADC();
          while(1)
        	{
        		int temp=ReadADC(0)/4;
        		PORTD=segment[temp%10];//last digit
        		PORTB=segment[(temp%100)-(temp%10)];//first digit
        	}
        }
        عاشق الکترونیک

        دیدگاه


          #19
          پاسخ : مشکل دماسنج

          سلام
          پیشنهاد می کنم برید سراغ آردوینو
          اینم یه مثالش:
          http://www.instructables.com/id/Arduino-Digital-7-Segment-Thermometer
          الکترونیک و رباتیک با طعم آردوینو !
          آمار آردوینو را از گوگل بگیرید...

          دیدگاه


            #20
            پاسخ : مشکل دماسنج

            نوشته اصلی توسط mmahdim
            واقعا شرمنده، یه سوتی داده بودم البته در واقع مشکل از برد بورد بود، حالا همه چی درسته بجز عددی که روی سون سگمنت نشون میده.
            الان ولتاژ رفرانس شد 2.56 ولت، ولی سون سگمنت باز هم 88 رو نشون میده، فکر کنم شیوه ی تفکیک رقم های اول و دومم غلطه. این هم کد برنامه:
            کد:
            /*
             * GccApplication1.c
             *
             * Created: 4/7/2013 11:34:57 PM
             * Author: Mahdi
             */ 
            
            
            #include <avr/io.h>
            #include <avr/interrupt.h>
            void InitADC()
            {
            	ADMUX=(1<<REFS0)|(1<<REFS1);// AREF=internal 2.56v
            	ADCSRA=(1<<ADEN)|(1<<ADPS0)|(1<<ADPS1)|(1<<ADPS2);
            }
            
            uint16_t ReadADC(uint8_t ch)
            {
            	//Select ADC Channel ch must be 0-5
            	ADMUX|=ch;
            
            	//Start Single conversion
            	ADCSRA|=(1<<ADSC);
            
            	//Wait for conversion to complete
            	while(!(ADCSRA & (1<<ADIF)));
            
            	//Clear ADIF by writing one to it
            	ADCSRA|=(1<<ADIF);
            
            	return(ADC);
            }
            
            int main(void)
            {
            	char segment[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
            	DDRB=0xFF;//output
            	DDRD=0xFF;//output
            	sei();
            	InitADC();
              while(1)
            	{
            		int temp=ReadADC(0)/4;
            		PORTD=segment[temp%10];//last digit
            		PORTB=segment[(temp%100)-(temp%10)];//first digit
            	}
            }
            شما چرا از روش polling استفاده میکنی؟؟؟نمیگم بده ولی کاربد خاص خودشو داره....
            اینجور جاها بهتره از وقفه استفاده کنی....اتمل بیچاره این همه واسه وقفه تدابیر اندیشیده! :read:
            من دماسنج رو هم با LM335 و هم با LM35 راه انداختم...با سون سگمنت و بدون هیچ مشکلی با دقت 1 درجه کار کرد...
            شما شیئه کدنویسیتو تغییر بده ...همینو با وقفه هم امتحان کن مطمئنا راه میفته...اگه نتونستی بگو کدشو بذارم
            در ضمن چون این سنسور ها بر اساس ولتاژ تغذیه خروجی میدن...در نتیجه باید ولتاژ ورودی مدارت بدون نویز و ثابت باشه
            همین ذماسنجو با برق USB کامپیوتر راه مینداختم دمایی که نشون میداد مرتب بالا پایین میشد اونم چندین درجه!!!
            با شارژر گوشی که راهش انداختم دقیق دقیق کار کرد!
            اینایی که گفتمو حتما امتحان کن... :bye
            تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

            www.intelart.ir


            ساخت کنترلر دما PID فازی با AVR [آموزشی]

            دیدگاه


              #21
              پاسخ : مشکل دماسنج

              خیلی ممنون، ولی نفهمیدم چطوری شیوه برنامه نویسیمو تغییر بدم؟ این polling و وقفه چیه؟ میشه توضیح بیشتری بدید؟ از کجا میتونم گیرش بیارم؟ تو دیتاشیت هست این polling و وقفه؟
              عاشق الکترونیک

              دیدگاه


                #22
                پاسخ : مشکل دماسنج

                شرمنده درسا فشار آورده دیگه زیاد نمیام
                این وقفه و این بحث ها همه ش داخل دیتاشیت میکرو هست...اگه بخونیش کامل متوجه میشی...کتاب های تو بازار هم اکثرا ترجمه دیتا شیت هستن!
                یه سر هم به اینجا بزن در مورد اینتراپت یا همون وقفه توضیح دادن...تو انجمن هم سرچ کنی کلی مطلب گیرت میاد...
                اینو هم دانلود کن ... هم با LM35 گذاشتم هم Lm335فایل پروتئوسشو هم گذاشتم...مرورش کنی همه چیز دستت میاد
                موفق باشی

                https://www.mediafire.com/?12rirxpdht2ctbu
                تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

                www.intelart.ir


                ساخت کنترلر دما PID فازی با AVR [آموزشی]

                دیدگاه


                  #23
                  پاسخ : مشکل دماسنج

                  آهان من با فارسیاش یکم مشکل داشتم وگرنه interrupt آشنا بود واسم. حالا یه چیز دیگه:
                  temp=temp/2-235;
                  اون تقسیم بر دو اش رو میدونم واسه چیه، (رزولوشن) ولی اون یکی منهای 235 واسه چیه دیگه؟ واسه همه رفرانس ها ثابته؟
                  SREG.7=1;
                  این یکی یعنی چی؟
                  هم چنین کاربرد این یکی رو نفهمیدم:
                  ACSR=0X80;
                  فکر کنم واسه کم کردن مصرف باشه.
                  خیلی ممنونم.
                  عاشق الکترونیک

                  دیدگاه


                    #24
                    پاسخ : مشکل دماسنج

                    نوشته اصلی توسط mmahdim
                    آهان من با فارسیاش یکم مشکل داشتم وگرنه interrupt آشنا بود واسم. حالا یه چیز دیگه:
                    temp=temp/2-235;
                    اون تقسیم بر دو اش رو میدونم واسه چیه، (رزولوشن) ولی اون یکی منهای 235 واسه چیه دیگه؟ واسه همه رفرانس ها ثابته؟
                    SREG.7=1;
                    این یکی یعنی چی؟
                    هم چنین کاربرد این یکی رو نفهمیدم:
                    ACSR=0X80;
                    فکر کنم واسه کم کردن مصرف باشه.
                    خیلی ممنونم.
                    سلام
                    1-اون عدد که باهاش جمع شده واسه کالیبره کردنش هست...(فکر کنم تو سنسور LM335 استفاده کردم ازش)...چون خروجی سنسور LM335 به تغذیه وابستگی بیشتری داره(داخلش بر مینای بایاسینگ یه دیود زنر و بایاس خارجی کار میکنه) باید آخر کار با آفست جمع بشه...مثلا من واسه کالیبره کردنش از یه مولتی متر که خودش دماسنج داشت استفاده کردم...همچنین میتونی سنسور رو کنار مخزن یه دماسنج جیوه ای یا الکلی بذاری جوری که هوا در حرکت نباشه و بعد مدتی که مطمدن شدی همدما هستند دمای دماسنج رو بخونی و باهاش سنسورت رو کالیبره کنی...
                    2-SREG.7=1 کاری که میکنه ست کردن فلگ I در رجیستر SREG هست...خب معلومه دیگه وقتی میخوای از اینتراپت استفاده کنی باید اینتراپت همگانی فعال باشه...با 1 کردن I در SREG میتونی اینکارو کنی...میتونی با دستور اسمبلی SEI هم همینکارو کنی...میتونی با SREG|=1<<I هم همینکارو کنی...راههای زیادی هست...دیگه باید یه جوری اون فلگ رو 1 کنی...
                    3-ASCR=0x80
                    نوشتن 1 در بیت 7 رجیستر ACSR باعث میشه که مقایسه کننده آنالوگ خاموش بشه...اینجا هم چون نیازی بهش نبود من خاموشش کردم!!

                    سوال دیگه ای بود بازم بپرس...
                    تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

                    www.intelart.ir


                    ساخت کنترلر دما PID فازی با AVR [آموزشی]

                    دیدگاه


                      #25
                      پاسخ : مشکل دماسنج

                      نوشته اصلی توسط punisher.x64
                      سلام
                      1-اون عدد که باهاش جمع شده واسه کالیبره کردنش هست...(فکر کنم تو سنسور LM335 استفاده کردم ازش)...چون خروجی سنسور LM335 به تغذیه وابستگی بیشتری داره(داخلش بر مینای بایاسینگ یه دیود زنر و بایاس خارجی کار میکنه) باید آخر کار با آفست جمع بشه...مثلا من واسه کالیبره کردنش از یه مولتی متر که خودش دماسنج داشت استفاده کردم...همچنین میتونی سنسور رو کنار مخزن یه دماسنج جیوه ای یا الکلی بذاری جوری که هوا در حرکت نباشه و بعد مدتی که مطمدن شدی همدما هستند دمای دماسنج رو بخونی و باهاش سنسورت رو کالیبره کنی...
                      2-SREG.7=1 کاری که میکنه ست کردن فلگ I در رجیستر SREG هست...خب معلومه دیگه وقتی میخوای از اینتراپت استفاده کنی باید اینتراپت همگانی فعال باشه...با 1 کردن I در SREG میتونی اینکارو کنی...میتونی با دستور اسمبلی SEI هم همینکارو کنی...میتونی با SREG|=1<<I هم همینکارو کنی...راههای زیادی هست...دیگه باید یه جوری اون فلگ رو 1 کنی...
                      3-ASCR=0x80
                      نوشتن 1 در بیت 7 رجیستر ACSR باعث میشه که مقایسه کننده آنالوگ خاموش بشه...اینجا هم چون نیازی بهش نبود من خاموشش کردم!!

                      سوال دیگه ای بود بازم بپرس...
                      ممنون، من کد رو تغییر دادم به این:
                      چون میخواستم از رفرانس داخلی 2.56 ولت استفاده کنم
                      کد:
                      #include <avr/io.h>
                      #include <avr/interrupt.h>
                      #include <util/delay.h>
                      #define F_CPU 8000000;
                      #define ADC_VREF_TYPE 0xff
                      
                      unsigned int read_adc(unsigned char adc_input)
                      {
                      	ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
                      	// Delay needed for the stabilization of the ADC input voltage
                      	_delay_us(10);
                      	// Start the AD conversion
                      	ADCSRA|=0x40;
                      	// Wait for the AD conversion to complete
                      	while ((ADCSRA & 0x10)==0);
                      	ADCSRA|=0x10;
                      	return ADCW;
                      }
                      
                      int main(void)
                      {
                      	int temp;
                      	ADMUX=ADC_VREF_TYPE & 0xff;
                      	ADCSRA=0x83;
                      	char segment[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
                      	DDRB=0xFF;//output
                      	DDRD=0xFF;//output
                      	sei();
                        while(1)
                      	{
                      		temp = read_adc(0);
                      		temp = temp/4;
                      		PORTD=segment[temp%10];//last digit
                      		PORTB=segment[temp/10];
                      		_delay_ms(1000);
                      	}
                      }
                      ولتاژ پین aref اندازه ی 2.51 ولت بود.
                      جالبیش اینجاست که سون سگمنت اعدادی رو نشون میده که اصلا معنی ندارند و سریع هم عوض میشن. سون سگمنت سالمه و با همین میکروکنترلر امتحان کردم قشنگ اعداد یک تا 100 رو نشون میداد.
                      پین ADC0 رو حتی قطع کردم ولی باز هم همون علامت های بی معنی رو نشون میده.
                      حتی کد رو طوری نوشتم که اگر temp بیشتر از 150 بود عدد 5 رو نشون بده، و عدد 5 رو نشون داد! :eek:
                      عاشق الکترونیک

                      دیدگاه

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