پروژه کنترل سرعت چرخش فن با توجه به دما – قسمت سوم - وب سایت رضا احمدی

پروژه سرعت چرخش فن با توجه به دما

پروژه کنترل سرعت چرخش فن با توجه به دما – قسمت سوم

سوال: pwm  چگونه سرعت موتور را کنترل میکند!؟( میکروکنترلر avr )

ابتدا فرکانس تایمر را حساب میکنیم و میبینم ک هر پالس میتواند چقد طول داشته باشد.

F_cpu=10MHz; à  F_timer=F_cpu/64=156.250 KHz

timer=1/156.250k=64 us

دقت نمایید که در این پروژه از یک کریستال خارجی ۱۰ مگاهرتزی به عنوان کلاک میکروکنترلر avr در نظر گرفته شده است.

جدا از عملکرد عادی تایمر، هر سه تایمر در سه مد کاری می توانند کار کنند:

    مد نرمال،

    مد CTC

    مد PWM

یعنی محتوای رجیستر TCNT0 هر۶۴ میکرو ثانیه یکبار افزایش می یابد. پس یک دوره کامل شمارش یا همان دوره تناوب پالس برابر با ۲۵۵*۶۴ یعنی ۱۶٫۳۲۰ میلی ثانیه. و دیوتی سایکل یا همان زمان وظیفه را رجیستر OCR0 تنظیم میکند که میتواند بین ۰ تا ۲۵۵ به آن نسبت داد.

fast-pwm
avr – timer 0 – fast pwm

به شکل خروجی پایه oc0 در چند دمای مختلفت دقت نمایید.(اگر ماکسیمم دما روی ۵۰ درجه باسد).

وقتی دما ۲۰ درجه باشد آنگاه زمان وضیفه برابر ۲۰/۵۰ یعنی ۴۰% dc= میباشد:

pwm-duty-cycle-percent
pwm-duty-cycle-percent

هرگاه ولتاژ به موتور اعمال شود شروع به چرخیدن می کند، و هرگاه ولتاژ اعمالی صفر شود رو به توقف می رود اما فوراً متوقف نمی شود، بلکه مدتی طول می کشد تا به طور کامل بایستد. اما قبل از این که کاملا متوقف شود، دوباره ولتاژی به موتور اعمال شده و شروع به چرخیدن می نماید. اما باز هم نیاز به زمانی دارد تا به سرعت نهایی برسد ولی قبل از آن دوباره ولتاژ صفر می شود و این روال به همین ترتیب تکرار و تکرار می شود. در نهایت تاثیر چنین ولتاژی بر روی موتور بدین صورت است که موتور همواره در حال چرخش است ولی در سرعتی کمتر از سرعت نهایی اش. هرچه زمان وظیفه بیشتر باشد سرعت چرخش موتور نیز بیشتر است.

کد کامل برنامه نوشته شده:

این سورس برای محیط کدویژن ( ۳٫۱۲ ) نوشته شده است. و میکرو کنترلر avr انتخاب شده atmega16a می باشد.

  1. /*
  2.  * avr-lm35-dc-fan.c
  3.  *
  4.  * Created: 2016/12/10 08:24:39 ق.ظ
  5.  * Author: Reza.Ahmadi	
  6.  * url: mrzx.ir  
  7.  */
  8.  
  9. #include <io.h>
  10. #include <delay.h>
  11.  
  12. #asm
  13.     .equ __lcd_port=0x15 ;//PORTC
  14. #endasm
  15. #include <lcd.h>
  16. #include <stdio.h> //for using Sprintf
  17.  
  18. #define Fan1 OCR0;
  19. #define Fan2 PORTB.1
  20.  
  21. #define up  PIND.2
  22. #define down PIND.3
  23.  
  24. float T=0.0;
  25. unsigned int PW=0;
  26. unsigned char strLCD[16];
  27. unsigned char Max_tmp=50;
  28.  
  29. void adc_init();
  30. unsigned short int read_adc(unsigned char input_pin);
  31. float read_temp();
  32.  
  33. void Timer0_init();
  34. interrupt [TIM0_OVF] void  timer0_isr();
  35. void set_pw();
  36.  
  37. void set_max_tmp();
  38.  
  39. void def_chr(flash unsigned char* data,unsigned char chrcounter);
  40. flash unsigned char degree[]={0x0e,0x11,0x11,0x11,0x0e,0x00,0x00,0x00};
  41. void main(void)
  42. {
  43.  
  44. DDRD=0x00;
  45. lcd_init(16);
  46. def_chr(degree,0);
  47. lcd_putsf("-----Hello-----");
  48. lcd_gotoxy(0,1);
  49. lcd_putsf("MRZX.ir");
  50. delay_ms(4000);
  51. lcd_clear();
  52. adc_init();
  53. Timer0_init();
  54. #asm("sei");
  55. lcd_gotoxy(0,1);
  56. sprintf(strLCD,">Max Temp=%d   ",Max_tmp);
  57. lcd_puts(strLCD);
  58. while (1)
  59.     {
  60.     read_temp();
  61.     set_pw();
  62.     set_max_tmp();
  63.     }
  64. }
  65.  
  66. void adc_init()
  67. {
  68.     ACSR=0x80;
  69.     SFIOR=0x00;
  70.     ADMUX=(1<<REFS1)|(1<<REFS0);//using interenal 2.56v Voltage reference...
  71.     ADCSRA=(1<<ADEN)|(1<<ADPS2)|(0<<ADPS1)|(0<<ADPS0);//Enable ADC with Prescalar=Fcpu/16
  72. }
  73.  
  74. unsigned short int read_adc(unsigned char input_pin)
  75. {
  76. ADMUX |=(input_pin&(0x07))|(1<<REFS1)|(1<<REFS0);
  77.    //Start Single conversion
  78.    ADCSRA|=(1<<ADSC);
  79. //Wait for conversion to complete
  80.    while(!(ADCSRA & (1<<ADIF)));
  81. //Clear ADIF by writing one to it
  82.    ADCSRA|=(1<<ADIF);
  83.     return (ADCW);
  84. }
  85.  
  86. float read_temp()
  87. {
  88. T=(read_adc(0)*2.56/1024)*100 ;
  89. return T;
  90. }
  91.  
  92. //***********************//
  93. void Timer0_init()
  94. {
  95. TCNT0=0x00;
  96. TCCR0 |=(1<<CS00)|(1<<CS01) | (1<<WGM00)|(1<<WGM01)|(1<<COM01);//fcpu/64
  97. TIMSK |= (1 << TOIE0);
  98. DDRB=0xff; 
  99. }
  100. interrupt [TIM0_OVF] void timer0_isr()
  101. {
  102. static int delay=0;
  103.  
  104. TCNT0=0x00;
  105. TCCR0=0x00;
  106. if(delay++>=1000)
  107. {   
  108.     lcd_gotoxy(0,0);
  109.     sprintf(strLCD,">Temp=%0.2f ",T);
  110.     lcd_puts(strLCD);
  111.     lcd_putchar(0);lcd_putchar('C');
  112.     delay=0;
  113. }
  114. OCR0=PW;
  115. TCCR0 |=(1<<CS00)|(1<<CS01) | (1<<WGM00)|(1<<WGM01)|(1<<COM01);//fcpu/64
  116. }
  117.  
  118. void set_pw()
  119. {   if(T<=(Max_tmp/3))
  120.      {
  121.       PW=1;
  122.       Fan2=0;  
  123.       }
  124.     else if(((Max_tmp/3)<T) && (T<Max_tmp) )
  125.     {
  126.     PW=(T/Max_tmp)*255;
  127.     Fan2=0;
  128.     }
  129.     else
  130.     {
  131.     PW=254;
  132.     Fan2=1;
  133.     }
  134. }
  135.  
  136. void def_chr(flash unsigned char* data,unsigned char chrcounter)
  137. {
  138. 	unsigned char adrs;
  139.     char i=0;
  140. 	//unsigned char adrs=0x40;
  141. 	adrs=(chrcounter<<3)|0x40;
  142. 	for(i=0;i<8;i++)
  143. 	lcd_write_byte(adrs++,*data++);
  144. }
  145.  
  146. void set_max_tmp()
  147. {
  148. if(down==0)
  149. {
  150.     if(Max_tmp>=10)
  151.        {
  152.          Max_tmp -=5;
  153.         lcd_gotoxy(0,1);
  154.         sprintf(strLCD,">Max Temp=%d   ",Max_tmp);
  155.         lcd_puts(strLCD);
  156.         while(down==0);  
  157.         }
  158. }
  159. if(up==0)
  160.     if(Max_tmp<=85)
  161.         {
  162.          Max_tmp +=5;
  163.         lcd_gotoxy(0,1);
  164.         sprintf(strLCD,">Max Temp=%d   ",Max_tmp);
  165.         lcd_puts(strLCD);
  166.         while(up==0);       
  167.         }
  168. }

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دیدگاه های ثبت شده

    محمد | ۲۴ اسفند ۱۳۹۸

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


    جمشیدیان | ۲۵ مرداد ۱۳۹۹

    سلام. میشه لطفا فایل شبیه سازی با ادوات الکترونیکی (فایل پروتئوس یا التیوم) این پروژه را برام بفرستید؟ خواهش میکنم، احتیاج دارم

      رضا احمدی | ۲۵ شهریور ۱۳۹۹

      با سلام
      شماتیک مدار بصورت کامل توضیح داده شده . اونو توی پروتئوس رسم کنیدو و اجرا کنید .


    الی | ۰۲ آذر ۱۳۹۹

    سلام ممنون از جوابتون
    متاسفانه دکمه پاسخ در سایتتون کار نمی کنه و به خاطر این تشکر از جوابتون رو در یک دیدگاه دیگر نوشتم.