اطلاعیه

Collapse
No announcement yet.

مشکل در برنامه برای LM35

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

    مشکل در برنامه برای LM35

    سلام
    یه lm35 رو زدم به پایه 40 مگا 32 ولی با برنامه زیر کار نمیکنه؟
    کد:
    #include <mega32a.h>
    #include <delay.h>
    #include <stdio.h>
    #include <lcd.h>
    #asm
     .equ __lcd_port=0x18
     #endasm
     #define ADC_VREF_TYPE 0xC0
     unsigned int read_adc();
     char code[20];
     void main(void)
     {  
     int data;
     float temp;
     PORTA=0x00;
     DDRA=0x00;
     ADMUX=ADC_VREF_TYPE;
     ADCSRA.7=1;
     ADCSRA.5=0;
     ADCSRA.3=0;
     ADCSRA.2=1;
     ADCSRA.1=1;
     ADCSRA.0=1;
     lcd_init(16);
     while (1)
       {
       data=read_adc();
       temp=data/4;
       lcd_clear();
       lcd_gotoxy(0,0);
       sprintf(code,"Temp=%f C",temp);
       lcd_puts(code);
       delay_ms(1000);
       };
     }
     unsigned int read_adc()
     {
     ADMUX=ADC_VREF_TYPE;
     ADCSRA.6=1;
     while (!(ADCSRA.4));
     ADCSRA.4=1;
     return ADCW;
     }

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

    کسی کمک/راهنمایی نمیکنه :cry2:.

    دیدگاه


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

      به جای
      کد:
         sprintf(code,"Temp=%f C",temp);
      این را بنویس
      کد:
         sprintf(code,"Temp=%4d C",(int)temp);
      باد می وزد ...
      میتوانی در مقابلش هم دیوار بسازی ، هم آسیاب بادی
      تصمیم با تو است ...

      دیدگاه


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

        نوشته اصلی توسط ATROBOT
        به جای
        کد:
           sprintf(code,"Temp=%f C",temp);
        این را بنویس
        کد:
           sprintf(code,"Temp=%4d C",(int)temp);
        روی ال سی دی فقط :temp= c رو نشون میده.

        دیدگاه


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

          سلام
          مقدار رجیستر ADCW رو که میریزی توی data باید طوری بنویسی که درجه رو نشون بده.
          دو خط آخر رو با کد زیر عوض کن:
          temp=((ADCW*2.56)/1024)*100;//convert ADC value to degree
          return temp;//return real temperature

          دیدگاه


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

            با این کد:
            کد:
            #include <mega32a.h>
            #include <delay.h>
            #include <stdio.h>
            #include <lcd.h>
            #asm
             .equ __lcd_port=0x18
             #endasm
             #define ADC_VREF_TYPE 0xC0
             unsigned int read_adc(int);
             float temp;
             int data;
             void main(void)
             {      
             char code[20];
             DDRA=0x00;
             PORTA=0x00;
             ADMUX=ADC_VREF_TYPE;
             ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
             lcd_init(16);
             while (1)
               {
               data=read_adc(data);
               temp=((data*2.56)/1024)*100;
               lcd_clear();
               sprintf(code,"Temp=%3d C",(int)temp);
               lcd_gotoxy(0,0);
               lcd_puts(code);
               delay_ms(1000);
               };
             }
             unsigned int read_adc(int data)
             {
             ADMUX=ADC_VREF_TYPE;
             ADCSRA|=0X40;
             while ((ADCSRA & 0x10)==0);
             ADCSRA|=0x10;
             data=ADCW;
             return data;
             }
            کار میکنه ولی دما رو درست نشون نمیده.مثلا دما رو 41-42 (هر ثانیه 1درجه بالا و پایین) نشون میده در حالی که باید 30 درجه باشه.

            دیدگاه


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

              > فیلتر مناسب یرای AVCC و AREF قرار بدهید
              > تغذیه فوق العاده مهمه
              > برای دقت بیشتر میانگین چند نمونه مختلف را نمایش بده (مثلاً 10 بار نمونه بگیر و میانگین این 10 با را برای دما استفاده کن)


              البته موارد فوق بارها توی انجمن مطرح شده؛ لطفا سرچ کنید
              موفق باشید
              امام علي (عليه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

              دیدگاه


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

                نوشته اصلی توسط optical illusion
                سلام
                مقدار رجیستر ADCW رو که میریزی توی data باید طوری بنویسی که درجه رو نشون بده.
                دو خط آخر رو با کد زیر عوض کن:
                temp=((ADCW*2.56)/1024)*100;//convert ADC value to degree
                return temp;//return real temperature
                خروجی این سنسور به ازای دمای صفر درجه سانتی گراد صفر ولته؟
                اگه ولتاز خروجی سنسور رو در 1024 ضرب کنیم و حاصل رو بر 2.56 تقسیم کنیم عدد دیجیتال مبدلمون نمیشه؟اگه همین عدد رو بر 4 تقسیم کنیم دما رو محاسبه نکردیم؟(convert ADC value to degree شما رو متوجه نمیشم).

                دیدگاه


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

                  نوشته اصلی توسط Abbas Sarami
                  > فیلتر مناسب یرای AVCC و AREF قرار بدهید
                  > تغذیه فوق العاده مهمه
                  > برای دقت بیشتر میانگین چند نمونه مختلف را نمایش بده (مثلاً 10 بار نمونه بگیر و میانگین این 10 با را برای دما استفاده کن)
                  البته موارد فوق بارها توی انجمن مطرح شده؛ لطفا سرچ کنید
                  موفق باشید
                  با اخرین کدی که گزاشتم حدودا با 10 درجه خطا دما رونشون میده.روی پایه Aref یه خازن 100 نانو گزاشتم.یعنی فیلتر و تغذیه میتونه اینقدر خطا رو تصحیح کنه؟

                  دیدگاه


                    #10
                    پاسخ : مشکل در برنامه برای LM35

                    نوشته اصلی توسط ((O-I-O))
                    با اخرین کدی که گزاشتم حدودا با 10 درجه خطا دما رونشون میده.روی پایه Aref یه خازن 100 نانو گزاشتم.یعنی فیلتر و تغذیه میتونه اینقدر خطا رو تصحیح کنه؟
                    بله،ممکنه خطا ایجاد کنه


                    اون روش میانگین گیری را هم استفاده کن، موثر هست
                    امام علي (عليه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

                    دیدگاه


                      #11
                      پاسخ : مشکل در برنامه برای LM35

                      تقریبا همین مشگل رو من چند روز پیش با LM35 داشتم خیلی روش کار کردم و آخر به نتیجه رسیدم.

                      1. بهتره از پایه AVCC به عنوان ولتاژ مرجع استفاده کنی.

                      2. از چند خازن برای صاف کردن ورودی ADC استفاده کن.

                      3. پایه های AREF و AVCC رو در برابر نویز بیمه کن.

                      4. از یه دماسنج جیوه ای برای تست و محاسبه خطا استفاده کن.

                      5. از میاگین گیری استفاده کن حداقل 50 بار بخون بعد میانگین بگیر.

                      من خیلی روش کار کردم و تست گرفتم و مقادیرو روی ال سی دی نمایش دادم در نهایت متوجه شدم که ایرار از خود ADC میکرو هستش و مقدار رجیستر ADCW بیشتر از اون چیزیه که باید باشه.
                      برای حل این مشگل خازنهای C1 C2 و C3 رو اضافه کردم که خیلی خوب جواب داد . الان هم یه کمی نویز داره اما به چشم نمیاد و راضی ام.

                      موفق باشی

                      دیدگاه


                        #12
                        پاسخ : مشکل در برنامه برای LM35

                        ممنون از دوستانی که کمک کردن با فیلتر مناسب و میانگین گیری 50 نمونه مشکل حل شد.

                        دیدگاه


                          #13
                          پاسخ : مشکل در برنامه برای LM35

                          نوشته اصلی توسط ((O-I-O))
                          ممنون از دوستانی که کمک کردن با فیلتر مناسب و میانگین گیری 50 نمونه مشکل حل شد.
                          ان شاالله همیشه موفق باشی :smile:

                          دیدگاه

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