Fórum témák

» Több friss téma
Cikkek » Nyolc lábbal AVR III. rész
Nyolc lábbal AVR III. rész
Szerző: Topi, ZsirosDani, idő: Nov 29, 2008, Olvasva: 44117, Oldal olvasási idő: kb. 3 perc
Lapozás: OK   4 / 5

A hőmérséklet érzékelés módszerét már ismerjük, ennek prociba való bevezetésével is megismerkedtünk. PWM-et is láttunk már az előző részekben, így újdonságot csak egy "karakterisztika" leprogramozása jelentheti.
Így ennek a kis résznek az a célja, hogy taglaljuk hogyan is lehet karakterisztika meredekségét, minimum, maximum pontokat definiálni. Hogy kell ezt korrektül, átgondolt, programozóhoz méltóan megírni.

Először is lássunk egy karakterisztikát, amit meg kell valósítanunk:

Látszik, hogy nagyjából 35°C-ig semmit nem csinálunk, 10%-os kitöltési tényezőn hajtjuk a ventillátort. Afölött, van egy lineáris szakasz, 50°C-ig. 50°C felett pedig 100%-os kitöltési tényezővel járatjuk a ventillátort. Direkt választottam ilyen meredek karakterisztikájúra, ugyanis HTPC-mben egy hasonló, ám de akkor még PIC-es VFD kijelzős vezérlő működik, és hála ennek a nagyon meredek karakterisztikának, a hőmérséklet minimális változására a rendszer jóval erőszakosabban válaszol. Így végeredményképpen a valóságban az egész HTPC-m összes melegedő alkatrésze jócskán 30-35°C alatt marad mindig, és ezt ugye síri csendben teszi. Most, mivel az NTC ekkora hőmérséklet tartományban már közel sem mondható lineárisnak, így ráadásul ezt az átmenetet még hirtelenebbé teszi.

Mivel általában kevés az egy ventillátor és az egy szenzor így most egy kétcsatornás fordulatszámszabályzott vezérlést mutatok be.

Mivel már ismerjük ismerjük nagyon jól (ugye?!) az ATtiny45-öt, így nem lesz nagy ördöngősség, hogy most ezt ATtiny13-al fogjuk megoldani.

ATtiny13-ban 1K Flash van, és csak egy Timer modul. Ám ez is bőven elég a ventillátor szabályzónkhoz.

Mivel 2-3°C eltérés nem számottevő, így áramkörünket kalibrálni sem létszükséglet, továbbá mivel nincs szüksége nagy áramokra, így a processzor táplálását egy sima Zéner diódával oldjuk meg.

A megépítendő kapcsolás a következő:

Darlingtonok vagy FET-ek is használhatók. Sőt, kisebb ventillátornál sima BC337-es NPN tranzisztor. Mivel kapcsolóüzembe működik majd a tranzisztor is, így melegedni nagyon nem fog.
Csak azért, hogy kihasználjunk minden lábat, tettem bele egy FULL_SPEED kapcsolót is. Ha ez be van kapcsolva, akkor mindkét ventillátor maximális sebességen, 100%-on működik.

Drótozzuk össze:

Nézzük a programot:

  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3.  
  4. #define PIN_OC0A    PB0
  5. #define PIN_OC0B    PB1
  6. #define PIN_FSBTN    PB2
  7.  
  8. #define    T35C        583            //mérés alapján
  9. #define    T50C        636         //mérés alapján
  10. #define TEMP_R        T50C-T35C    //tartomány
  11. #define DUTY_MIN    90            //min fordulatszám
  12. #define DUTY_R        255-DUTY_MIN //PWM tartomány
  13.  
  14. //-------------------------------------
  15. void m_delay_10ms(unsigned short val) {
  16. //-------------------------------------
  17.     while(val--) _delay_ms(10);
  18. }
  19.  
  20. //-------------------------------------
  21. void init() {
  22. //-------------------------------------
  23.     DDRB = (1<<PIN_OC0A)|(1<<PIN_OC0B);    //kimenetek
  24.     PORTB |= (1<<PIN_FSBTN);            //pullup
  25.  
  26.     //Init ADC
  27.     ADMUX = 0x00;
  28.     ADCSRA =  (1<<ADEN)
  29.            |  (0<<ADATE)
  30.            |  (0<<ADSC)
  31.            |  (1<<ADPS2)
  32.            |  (1<<ADPS1)
  33.            |  (1<<ADPS0)
  34.            ;
  35.     //Init Timer0
  36.     TCCR0A =  (1<<COM0A1)
  37.            |  (0<<COM0A0)    //Nem invert. PWM A
  38.            |  (1<<COM0B1)
  39.            |  (0<<COM0B0)   //Nem invert. PWM B
  40.            |  (1<<WGM01)
  41.            |  (1<<WGM00)        //Fast PWM
  42.            ;
  43.     TCCR0B = (0<<WGM02)
  44.            | (0<<CS02)
  45.            | (0<<CS01)
  46.            | (1<<CS00)        //div 8 -> 9.6/8/256 ~= 4,7 KHz
  47.            ;
  48.     //Start folyamat
  49.     OCR0A  = 0xFF;
  50.     OCR0B  = 0xFF;
  51.     m_delay_10ms(300);
  52. }
  53.  
  54. //-------------------------------------
  55. unsigned short ADConvert(unsigned char channel) {
  56. //-------------------------------------
  57.     ADMUX &= ~(1<<MUX1|1<<MUX0);
  58.     ADMUX |= channel;
  59.     ADCSRA |= (1<<ADSC);
  60.     while(ADCSRA & (1<<ADSC));
  61.     return ADC;
  62. }
  63.  
  64. //-------------------------------------
  65. int main(void) {
  66. //-------------------------------------
  67. unsigned int temp;
  68.     init();
  69.  
  70.     for(;;)  {
  71.         if(!(PINB & (1<<PIN_FSBTN))) {
  72.             OCR0A = 255;
  73.             OCR0B = 255;
  74.             continue;
  75.         }
  76.         //ADC2, CH0
  77.         temp = ADConvert(2);
  78.         if(temp<T35C) {
  79.             OCR0A = DUTY_MIN;
  80.         } else if(temp>T50C) {
  81.             OCR0A = 255;
  82.         } else {
  83.             temp -= T35C;
  84.             temp *= DUTY_R;
  85.             temp /= (T50C-T35C);
  86.             OCR0A = DUTY_MIN+temp;
  87.         }
  88.         //ADC3, CH1
  89.         temp = ADConvert(3);
  90.         if(temp<T35C) {
  91.             OCR0B = DUTY_MIN;
  92.         } else if(temp>T50C) {
  93.             OCR0B = 255;
  94.         } else {
  95.             temp -= T35C;
  96.             temp *= DUTY_R;
  97.             temp /= (T50C-T35C);
  98.             OCR0B = DUTY_MIN+temp;
  99.         }
  100.  
  101.         _delay_ms(60);
  102.     }
  103.  }

Mint látható, nagyon nem kell túlbonyolítani az egészet. Itt ennél az ATtiny13-nál, csak egyetlen timer van, tehát még válogatni sem válogathatunk, melyik PWM-jét használjuk. Persze azért sem, mert már a PWM kimenetek fixek.

Fontos: Mielőtt lefordítanánk a programot, állítsuk be a fordítónál, hogy az órajel 9600000 Hz, Optimalizáció Os, és programozásnál a CLKDIV8-at is vegyük ki.

Akár teljesen más eszköz, vagy nagyobb ventillátorokhoz is használható, felül a #define-oknál vannak a minimális fordulatszámok, a hőmérsékleti konstansok. Ezt átírva maximálisan személyre szabható.

Nem nagyon kommenteztem fel, minden ami elsőre nem érthető, másodszorra az lesz, adatlapot használva.


A cikk még nem ért véget, lapozz!
Következő: »»   4 / 5
É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