اطلاعیه

Collapse
No announcement yet.

کتنرل دمای هیتر

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

    کتنرل دمای هیتر

    سلام بچه ها پروژه ی من کنترل دمای هیتر با PIDهست کسی میدوتنه برنامه ی پایین چیکار میکنه؟ترم آخرمه و زیاد بلد نیستم اگه پاس نشم بدبختیه تو رو خدا زودتر جواب بدین(اگه خط به خط گفتین که محشره!)مرسی

    interrupt [EXT_INT0] void ext_int0_isr(void){
    unsigned char t1=0,key=0,kk[2]={0,0};
    signed char i=0,l=3;
    #asm("cli&quot
    lcd_clear();
    lcd_putsf("SP="

    while(key!=11){
    key = keypad();
    if(i>=1) i=1;
    l=i+3;
    if(key==10){
    i=0;
    lcd_clear();
    lcd_putsf("SP="

    }else if(key!=(10|11)){ //ESC for keys * & #
    kk[i]=key;
    lcd_gotoxy(l,0);
    sprintf(buffer,"%d",kk[i]);
    lcd_puts(buffer);
    i++;
    }
    }

    t1+=kk[0]*10;
    t1+=kk[1];
    if (t1) SP=t1;
    #asm("sei&quot
    }

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

    نوشته اصلی توسط asal001
    سلام بچه ها پروژه ی من کنترل دمای هیتر با PIDهست کسی میدوتنه برنامه ی پایین چیکار میکنه؟ترم آخرمه و زیاد بلد نیستم اگه پاس نشم بدبختیه تو رو خدا زودتر جواب بدین(اگه خط به خط گفتین که محشره!)مرسی

    interrupt [EXT_INT0] void ext_int0_isr(void){
    unsigned char t1=0,key=0,kk[2]={0,0};
    signed char i=0,l=3;
    #asm("cli&quot
    lcd_clear();
    lcd_putsf("SP="

    while(key!=11){
    key = keypad();
    if(i>=1) i=1;
    l=i+3;
    if(key==10){
    i=0;
    lcd_clear();
    lcd_putsf("SP="

    }else if(key!=(10|11)){ //ESC for keys * & #
    kk[i]=key;
    lcd_gotoxy(l,0);
    sprintf(buffer,"%d",kk[i]);
    lcd_puts(buffer);
    i++;
    }
    }

    t1+=kk[0]*10;
    t1+=kk[1];
    if (t1) SP=t1;
    #asm("sei&quot
    }
    خوب دوست عزیز
    تا یه حدی کمک میکنم
    1- امدی و وقفه خارجی را تعریف کردی (int 0 ) -وقفه های خارجی با فعال کردن ریجستر های مربوط به اون
    2-یه متغیر تهریف کردی از نوع unsigned char با نام t1 , و kk که مقدار دهی کردی اولی صفر دادی
    3- دوتا متغیر دیگه نام برددی از نوع signed char و مقدار دادی اولی i=0 و l=3
    4-با این دستور وقفه سراسری غیر فعال میشه .
    5-ال سی دی پاک میشه
    6- "SP=" را داخل حافظه فلش ال سی دی کردی برای نشون دادن این کلمه بعدا روی ال سی دی
    7-یه حلقه شرطی درست کردی که دستور شرطی بهش دادی
    8- خروجی و اعداد گرفته شده از کیپد را درون متغییر کیپد ریختی
    9-از دستور if استفاده کردی که اگر i مساوی یا بزرگتر از L شد L مساوی I میشه
    10-بعد I + 3 میکنی و میزاریش تو متغیر L
    11- باز از دستور IF استفاده کردی خودت دیگه متوجه میشی برای چی
    12-الی اخر ودر اخر از دستور فعال کردن وقفه سراسری استفاده کردی
    اگه مشکلی بود و من هم بودم در خدمتم

    دیدگاه


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

      وااااااااااقعا ممنون.ولی فک کنم من سوالمو اشتباه پرسیدم چون جوابی که شمادادین رو میدونم ولی اینکه تو این برنامه چه کاربردی داره نمیدونم .کل برنامه رو میذارم اگه فهمیدید هر بخشی چیکار میکنه لطفا بگید.ضمنا بخشش کی پد به صورت جداگانه در یک فابیل دیگس که فراخوانی میشه(از سایت www.picpars.comدانلود کردم) رو word کپی کنید بهتره!ممممممرسی

      #include <mega32.h>
      #include <delay.h>
      #include <lcd.h>
      #include <stdio.h>
      #include <keypad.h>
      #asm
      .equ __lcd_port=0x15 ;PORTC
      #endasm
      char buffer[64];
      float SP=68,temp,error,last_error,last_iterm,kp=.025,ki= .0000075,kd=1;
      float pterm,iterm,dterm,D;
      unsigned int D2,LD,HD;

      interrupt [EXT_INT0] void ext_int0_isr(void){
      unsigned char t1=0,key=0,kk[2]={0,0};
      signed char i=0,l=3;
      #asm("cli&quot
      lcd_clear();
      lcd_putsf("SP="

      while(key!=11){
      key = keypad();
      if(i>=1) i=1;
      l=i+3;
      if(key==10){
      i=0;
      lcd_clear();
      lcd_putsf("SP="

      }else if(key!=(10|11)){ //ESC for keys * & #
      kk[i]=key;
      lcd_gotoxy(l,0);
      sprintf(buffer,"%d",kk[i]);
      lcd_puts(buffer);
      i++;
      }
      }

      t1+=kk[0]*10;
      t1+=kk[1];
      if (t1) SP=t1;
      #asm("sei&quot
      }

      interrupt [ADC_INT] void adc_isr(void){
      unsigned int adc_data;
      adc_data=ADCW;
      temp=(adc_data*2.56)/1023;
      temp=temp*100;
      }

      void main(void){
      lcd_init(16);

      GICR|=0x40;
      MCUCR=0x02;
      MCUCSR=0x00;
      GIFR=0x40;

      ADMUX=0xC0; //ch=0
      ADCSRA=0x8D;
      #asm("sei&quot
      ADCSRA=0xCD;

      while(1){
      error=SP-temp; //H1
      pterm=kp*error; //H2
      iterm=(ki*error)+last_iterm; //H3
      dterm=(error-last_error)*kd; //H4
      D=(pterm+iterm+dterm)*100; //H5
      if(D<1) D=1; //H6
      if(D>1020) D=1020; //H7
      last_iterm=iterm; //H8
      last_error=error; //H9
      D2=D; //H10
      HD=D2/256; //change to int val [xx xx] //H11
      LD=D2%256; //H12

      DDRD.4=1;
      DDRD.5=1;
      TCCR1A=0xE3;
      TCCR1B=0x0C;
      TCNT1H=0x00;
      TCNT1L=0x00;
      ICR1H=0x00;
      ICR1L=0x00;
      OCR1AH=0x00;
      OCR1AL=0x00;
      OCR1BH=HD;
      OCR1BL=LD;

      sprintf(buffer,"T=%3.1f\xdfC SP=%2.1f\nKp=%f\nKi=%f\nKd=%f",temp,SP,pterm, iterm,dterm);
      lcd_clear();
      lcd_puts(buffer);
      delay_ms(200);
      ADCSRA=0xCD;
      }
      }

      دیدگاه


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

        خوب یه بررسی اجالی کردم زیاد چیزی دست گیرم نشد ولی تا حدی که فهمیدم امده و با یه دونه ال سی دی 2×16 و یه میکرو اتمگا 32 و یک دونه کیپد 3×4 وبرنامه ای نوشته که بتونه دمای بیرون را بگیره و مقدار کم و زیاد و حداکثرش را با کیپد بنویسه و مقدار دهی کنه تا اگه دما روی این مقدیر امد نشون بده و چیزی را در بیرون فعال کنه
        البته چیزی که من فهمیدم . شاید هم درست متوجه نشدم .

        دیدگاه


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

          آره تو همون سایتم اینجوری نوشته!!!!!!!در واقع دمای محیط رو با دمای موردنظر مامقایسه میکنه و مقدار خطا رو با کنترل کننده های تناسبی مشتق گیر انتگرالی بهمون میده!ولی مشکل من فهم خود برنامس که مثلا هر قسمتش چیکار میکنه.
          فکر کنم 9 ترمه بشه :redface: !!!!!!!!!!!بازم ممنون به خاطر راهنماییتون.

          دیدگاه


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

            راستی کسی میدونه
            GICR|=0x40;
            MCUCR=0x02;
            MCUCSR=0x00;
            GIFR=0x40;
            یعنی چی؟یعنیGICRوMCUCSRوGIFR تو کدویژن مربوط به چین؟

            دیدگاه


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

              نوشته اصلی توسط asal001
              راستی کسی میدونه
              GICR|=0x40;
              MCUCR=0x02;
              MCUCSR=0x00;
              GIFR=0x40;
              یعنی چی؟یعنیGICRوMCUCSRوGIFR تو کدویژن مربوط به چین؟
              خوب دوست عزیز شما که فرمودین برنامه را میدونین ؟
              خط اول . مربوط است به این که برای استفاده از هریک از وقفه های خارجی باید بیت مربوط مون را فعال کنیم که این جا در ریجیستر GICR اتفاق می افته که کلا در این جا 8 تا بیت داریم از بیت صفر تا بیت 7 در کجا ؟ در ریجیستر GICR
              خط دوم هم ریجیستر های مربوط به وقفه هست که نوع تریگر شدن را در این ریجیستر مشخص میکنن
              و همچنین خط های بعدی همشون مربوط به ریجیستر های وقفه و بیت های پرچم هستند .
              و اگه بخوام اینا را توضیح بدم کلی وقت میبره .


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

              GICR=0b01000000; ;که INT 0 یا وقفه خارجیمون با این مقدار فعال میشه
              MCUCR=0b00000010 بااین مقدار دهی شکل و مد ریجیسترمون بهصورت Falling Edge باید تریگر بشه تا میکرو بتونه بفهمه که کی و چند تا پالس وارد پایه مربوطه شده .که Falling Edge پالس مربوطه هم باید ازیک به صفر باشه
              یعنی پالس مربوطه باید از مثبت به صفر بره . تا تشخیص داده بشه

              دیدگاه


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

                بزرگترین و بهترین راهنمایی اینه که ایشون بره یه کتاب C/C++ و یه کتاب AVR بخونه. چون هر قدر که ما بهش جواب بدیم بازم سوال تو در تو به وجود میاد.

                دیدگاه


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

                  نوشته اصلی توسط rozeh
                  بزرگترین و بهترین راهنمایی اینه که ایشون بره یه کتاب C/C++ و یه کتاب AVR بخونه. چون هر قدر که ما بهش جواب بدیم بازم سوال تو در تو به وجود میاد.
                  اول خیلی ممنونم ازآقاaawww!!
                  در ثانی آقا rozeh من کتاب آقای امیر ره افروزو خوندم سطح بالا بود!چن تام فایل آموزشی خوندم ولی زیاد به دردم نخورد آخه من در طول ترم کار نکردم 20واحد دارم با پروژه خداییش همشم درسای تخصصیه!بعدشم این انتخاباتم واسه ماشد مسئله و ترما کوتاه شدخلاصه شدم شب امتحانی!بچه ها به نظرتون ترم آخر کارشناسی یه درسو بیفتیم پاس میکنن ؟میذارن بری ارشد؟
                  بعدشم آقاrozeh شما که اینقد خوب بلدین چی میشه حالا یه کم کمک کنید ؟بنی آدم...

                  دیدگاه


                    #10
                    پاسخ : کتنرل دمای هیتر

                    خوب البته کتاب آقای امیر ره افروزو کتاب خوب هست ولی اونم خیلی ریز توضیح نداده و ریزکاری ها را نگفته.
                    ولی این انجمن برای همینه دیگه من الان میام تو انجمن برای این که یه مطلبی که نمیدونم شاید هم پیش پا افتاده باشه و من ندونم یاد میگیرم .و در حین گشتم تو انجمن اگه کسی سوالی کرده بود و بلد بودم جواب میدم . دیگه نمیام به طرف بگم که شما برو دنبال کتاب و از این حرف ها .البته این چیز ها را خود طرف میدونه ولی برای این که سریع و خوب به جواب برسه عنوان میکنن مثل خودم . والبته هم درسته در این زمینه مخصوصا C اصلا کتاب و منبع خاصی که واقعا خوب باشه واز ابتدا تا انتها و دقیق و با مثال های زیاد تعلیم داده باشه من تا الان پیدا نکردم . و فکر هم نکنم باشه . در هر صورت من که این طوری هستم ودوستم هم دارم اگه سوالی مطرح کردم زود دوستان جواب بدن . نه این که بگن خوب کتابش هست برو بخون یا برو تو نت بگرد ببین پیاد میکنی . این حرف ها درسته . و منم میدونم ولی چی میشه جواب بدم . حتی با جواب دادن شاید اون مطالبی که یادمون میخواد بره و دیگه ازش استفاده نمیکنیم باز تو ذهنمون بیاد و ازنو فعال بشه و تا مدت ها یادمون بمونه .
                    که در این صورت هم به کسی کمکی کردیم وهم یه دوره دیگه از اون مطالب میکنیم . جای دوری نمیره .
                    گرچه میدونم جواب های منم هم دقیق و خوب نیستن که طرف متوجه بشه . دیگه در حد توانایی :icon_razz:

                    دیدگاه


                      #11
                      پاسخ : کتنرل دمای هیتر

                      نوشته اصلی توسط aawww

                      گرچه میدونم جواب های منم هم دقیق و خوب نیستن که طرف متوجه بشه . دیگه در حد توانایی :icon_razz:
                      کتاب برا وقتیه که آدم وقتشو داشته باشه بشینه مفصل بخونه!
                      الان با راهنمایی شما تا خط 54 فهمیدم ببخشید اینقد سوال میپرسم !!!!!!تو برنامه زیر که از مبدل آنالوگ به دیجیتال استفاده شده چرا ضربدر 2.56وتقسیم بر1023 شده ؟یه جایی خوندم 2.56 ولتاژمرجعه و این کارا برا اینه که دما برحسب درجه سانتی گراد بشه ولی دلیل ریاضیه اینکارو نمیدونم!

                      interrupt [ADC_INT] void adc_isr(void){
                      unsigned int adc_data;
                      adc_data=ADCW;
                      temp=(adc_data*2.56)/1023;
                      temp=temp*100;
                      }

                      دیدگاه


                        #12
                        پاسخ : کتنرل دمای هیتر

                        تو این برنامه از ولتاژ مرجع 2.56 و دقت 1023 بیت استفاده شده یعنی هر واحد adc برابر با 2.56 تقسیم بر 1023 هست که میشه 0.0025 ولت حالا برای اینکه ولتاژ روی پایه adc رو بفهمیم باید عدد adc_data رو در 0.0025 ولت ضرب کنیم و چون خروجی lm35 به ازای هر یک درجه ده میلی ولت هست عدد به دست امده رو در صد ضرب میکنیم تا دما بر حسب سانتی گراد به دست بیاد

                        دیدگاه


                          #13
                          پاسخ : کتنرل دمای هیتر

                          نوشته اصلی توسط aawww
                          والبته هم درسته در این زمینه مخصوصا C اصلا کتاب و منبع خاصی که واقعا خوب باشه واز ابتدا تا انتها و دقیق و با مثال های زیاد تعلیم داده باشه من تا الان پیدا نکردم . و فکر هم نکنم باشه
                          مهندس، هم شما و هم عسل خانوم رو چش ما هستین. :nerd:
                          چرا آتیشی میشین. من منظورم این بود که ایشون با این کارشون ریسک بزرگی میکنه. در مورد کتاب باید بگم کتاب های تالیفی دیتل واقعا کامله! یه کتاب دیگه هم بود که توی کتابخونه محلمون داشتیم که عالی بود. اگه وقت کردم اسم اونو هم می ذارم اینجا:


                          http://www.aghazeh.com/programing-la...h-edition.html

                          http://p30download.com/fa/entry/3546...8C%D8%AA%D9%84

                          دیدگاه


                            #14
                            پاسخ : کتنرل دمای هیتر

                            نوشته اصلی توسط rozeh
                            مهندس، هم شما و هم عسل خانوم رو چش ما هستین. :nerd:
                            چرا آتیشی میشین. من منظورم این بود که ایشون با این کارشون ریسک بزرگی میکنه. در مورد کتاب باید بگم کتاب های تالیفی دیتل واقعا کامله! یه کتاب دیگه هم بود که توی کتابخونه محلمون داشتیم که عالی بود. اگه وقت کردم اسم اونو هم می ذارم اینجا:


                            http://www.aghazeh.com/programing-la...h-edition.html

                            http://p30download.com/fa/entry/3546...8C%D8%AA%D9%84
                            سلام
                            نه بخدا جناب روزه . اصلا از حرف های شما ناراحت نشدم و خیلی هم خوبه که همچین بحثی پیش میاد . نه . فقط نتونستم قشنگ جواب شما را بدم . در هر صورت معذرت میخوام اگه بهتون بر خورد . من مخلص شما هستم شما هرچی بگی من ناراحت نمیشم . برداشت خودت این طوریه . فقط در حد جواب بود .
                            در ضمن اگه کتابه را پیدا کردی اسمش را بگو . من خودم هنوز تو سی مشکل دارم .

                            دیدگاه


                              #15
                              پاسخ : کتنرل دمای هیتر

                              سلام بچه ها
                              میشه یک توضیح درباره کنترل موتور با مد PID بدید
                              تا اونجایی میدونم که میان با استفاده از PWM سرعت موتور رو تعیین میکنند و ازسیستم feedBack که با استفاده از A/D است بر سر ولتاژ موتور است میان و
                              در مقدار PWM تغییر ایجاد میکنند تا سرعت موتور ثبات پیدا کنه

                              دقیقا نمیدونم چند درصد حرفام صحیح هست...
                              شما کاملش کنید : دی

                              دیدگاه

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