Fórum témák

» Több friss téma
Cikkek » TinyTemp - Univerzális hőmérséklet szabályozó
TinyTemp - Univerzális hőmérséklet szabályozó
Szerző: Topi, idő: Máj 28, 2011, Olvasva: 30126, Oldal olvasási idő: kb. 2 perc
Lapozás: OK   3 / 4

A szoftver is az egyszerűség elvét követve készült. Igyekeztem a számolás részeket az értelmezést elősegítendő megfelelően kommentezni.

  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3.  
  4. #define TEMP_MIN    40
  5. #define TEMP_MAX    80
  6. #define PWM_MIN        90
  7.  
  8. #define T0_TMP        25        //ATtiny25 const
  9. #define T0_ADC        300
  10.  
  11. //=============================
  12. void init() {
  13. //=============================
  14.     //Init ADC
  15.     ADMUX = 0x8F;    //Internal 1V1, Temp Ch
  16.     ADCSRA = 0x80;
  17.  
  18.     //Init PWM
  19.     TCCR0A = (1<<COM0A1)|(1<<WGM01)|(1<<WGM00);    //FastPWM
  20.     TCCR0B = (1<<CS00);    //DIV1
  21.  
  22.     //Init PORT
  23.     DDRB |= (1<<PB0);
  24. }
  25.  
  26. //=============================
  27. unsigned short ADConvert(unsigned char ch) {
  28. //=============================
  29.     ADMUX = (ADMUX&0xF0) | (ch & 0x0F);
  30.     ADCSRA |= (1<<ADIF);    //Clear
  31.     ADCSRA |= (1<<ADSC);    //Start
  32.     while( ADCSRA & (1<<ADSC) );    //Wait
  33.  
  34.     return ADC;
  35. }
  36.  
  37. //=============================
  38. int main() {
  39. //=============================
  40.     unsigned short adc,tmp16;
  41.     unsigned char do_cnt;
  42.     unsigned char desired_pwm;
  43.  
  44.     init();
  45.  
  46.     do_cnt = 100;
  47.  
  48.     for(;;) {
  49.         //25°C = 300   85°C = 370
  50.         //k = dT/dADC = 60/70 = 0,857
  51.         adc = ADConvert(0x0F);
  52.         if(adc>T0_ADC) {
  53.             adc -= T0_ADC;
  54.             adc = T0_TMP+adc*60/70;
  55.         } else adc = 0;
  56.  
  57.         if(adc<=TEMP_MIN) desired_pwm = PWM_MIN; else
  58.         if(adc>=TEMP_MAX) desired_pwm = 0xFF; else {
  59.             //k = dT/dPWM
  60.             tmp16 = PWM_MIN + (adc-T0_TMP)*(0xFF-PWM_MIN)/(TEMP_MAX-TEMP_MIN);
  61.             if(tmp16>255) tmp16 = 255;
  62.             desired_pwm = tmp16;
  63.         }
  64.        
  65.         if(do_cnt) do_cnt--; else {
  66.             if(OCR0A>desired_pwm) OCR0A--; else
  67.             if(OCR0A<desired_pwm) OCR0A++;
  68.  
  69.             do_cnt = 100;        
  70.         }
  71.        
  72.         _delay_ms(0.1);
  73.     }
  74.  
  75. }

Az egyszerűségét mutatja az is, hogy az egész szoftver lefordítva a mikrovezérlőből 310 bájtot foglal el!

Szükség lehet a ventilátor - PWM paraméterek eltérő beállítására. Az alábbiakban a program elején #define részekben lévő konstans értékeket nézzük meg:

TEMP_MIN: Az a hőmérséklet, mely alatt a ventilátor a minimális PWM_MIN-nek megfelelő sebességgel forog.
TEMP_MAX: Az a hőmérsékleti pont, ami felett a ventilátornak 100%-os fordulatszámon kell üzemelnie (°C-ban)
PWM_MIN: Az a kitöltési tényező, amelynél a ventilátor még éppen forog, de légszállítása - és hangja - nagyon alacsony.

A forráskódot és a lefordított HEX állományt letöltheted itt: tinytemp.zip

Ha megnézzük az ATtiny25/45/85 adatlapját, láthatjuk hogy az analóg-digitál átalakító bemenetén lévő analóg multiplexer "1111" - utolsó állása, egy belső hőmérséklet szenzor jelét kapcsolja az átalakítóra. Az adatlapban leírtak alapján (a szenzor feszültség tartománya miatt) ekkor a belső 1.1V-os referenciát kell használnunk.

Így egy közel 1 LSB / °C változású digitális értéket kapunk eredményül az AD konverzió végén. A hőmérséklet szenzor által kiadott feszültség nem teljesen lineáris a hőmérséklet függvényében, de azon kis hőmérséklet tartományban, ahol mi használjuk, ezzel nem szükséges foglalkozni. Fontos érték továbbá a T0_xxx hőmérséklet és ADC érték, ez ugyanis egy viszonyítási pontot ad a számításoknál. Adatlapból származik a 25°C esetén 300-as ADC érték.

Vegyük figyelembe, hogy a belső 1.1V-os referencia pontossága 10%-os, a beépített hőmérséklet szenzor is 5-10%-os, így pontos hőmérséklet mérésre a belső hőmérő nem alkalmas!

Az adott hőmérséklethez tartozó kitöltési tényezőt arányszámítással határozzuk meg.

A programozáshoz szükséges szoftverekről és hardverekről az alábbi cikksorozatban adtam tájékoztatást: Nyolc lábbal I. rész

Következzen az utolsó lépés, a rögzítés.


A cikk még nem ért véget, lapozz!
Következő: »»   3 / 4
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem