» Advertenties

Zo 20 Mei 2012, 07:38

Voorgaande
- De AVR
- RS232
- LCD

Inhoud
#1: Uitlezen

Hardware
File #133

Datasheets
- LM35
De LM35 stuurt een analoog signaal uit, dat evenredig is met de temperatuur. Het verband tussen temperatuur en analoge waarde: 10mV/1°C.
200mV staat dus voor 20°
Om de analoge waarde accurater te kunnen inlezen neem ik meerdere metingen, dan van die metingen neem ik het gemiddelde. Temperatuur is een traag variėrend iets, dat wil zeggen dat je geen 10 samples per seconden moet nemen. Om de paar minuten zou eigenlijk volstaan.

Om te testen dat je temperatuursensor juist werkt: de omgevingstemperatuur zit normaal rond de 20°. Op zolder in de zomer kan dan 25° zijn en meer. In de koude kelder zul je minder dan 20° meten. Als je de LM35 verwarmt met je vinger moet de uitgelezen temperatuur stijgen.
Als je ook een DS1631 (I²C temperatuur sensor) in de buurt hebt, kun testen of te beide temperaturen het zelfde zijn.

C code -
  1. #define F_CPU 8000000
  2.  
  3. #define LCD_LINES 4
  4. #define LCD_DISP_LENGTH 20
  5.  
  6. #define LCD_PORT PORTB   ///< port for the LCD lines
  7. #define LCD_DATA0_PORT LCD_PORT   ///< port for 4bit data bit 0
  8. #define LCD_DATA1_PORT LCD_PORT   ///< port for 4bit data bit 1
  9. #define LCD_DATA2_PORT LCD_PORT   ///< port for 4bit data bit 2
  10. #define LCD_DATA3_PORT LCD_PORT   ///< port for 4bit data bit 3
  11. #define LCD_DATA0_PIN 4   ///< pin for 4bit data bit 0
  12. #define LCD_DATA1_PIN 5   ///< pin for 4bit data bit 1
  13. #define LCD_DATA2_PIN 6   ///< pin for 4bit data bit 2
  14. #define LCD_DATA3_PIN 7   ///< pin for 4bit data bit 3
  15. #define LCD_RS_PORT PORTC     ///< port for RS line
  16. #define LCD_RS_PIN 7   ///< pin for RS line
  17. #define LCD_RW_PORT PORTC     ///< port for RW line
  18. #define LCD_RW_PIN 6   ///< pin for RW line
  19. #define LCD_E_PORT PORTC     ///< port for Enable line
  20. #define LCD_E_PIN 5   ///< pin for Enable line
  21.  
  22. #include "s/g.h"
  23. #include "s/rprintf.c"
  24. #include "s/lcd.c"
  25. #include "s/adc.c"
  26. #include "util/delay.h"
  27.  
  28.  
  29. //! bereken gemiddelde van x aan sampels op eenzelfde adc pin
  30. u16 avg(u08 adcChannel, u08 samples);
  31.  
  32.  
  33. //! main functie, start programma, moet altijd aanwezich zijn
  34. int main(void){
  35.   uartInit(UART_FULL, 19200);
  36.   rprintfInit(uartSendByte);
  37.   rprintf("UART PRESENTn");
  38.  
  39.   lcdInit(LCD_DISP_ON);
  40.  
  41.   adcInit(ADC_P128, ADC_AVCC);
  42.  
  43.   u16 adcLm35;
  44.   u08 buffer[4];
  45.  
  46.   rprintf("LM35 at ADC5n");
  47.   while(1){
  48.     // ADC waarde lezen, dan via u32 cast 32bit integer van maken
  49.     // want 1024 * 5000 > 16bit, na de bewerking volstaat u16 weer
  50.     adcLm35 = (u16)(((u32) avg(5, 5) * 5000) / (1024));
  51.  
  52.     // ADC heeft een resolutie van ongeveer 5mV, de LM35 is tot op
  53.     // 0,5°C naukeurig, daarom afronden tot op 0,5°
  54.     // Eerst eenheden laten vallen door /10 en dan *10 te doen
  55.     // daarna kijken of de eenheden groter of gelijk aan 5 waren,
  56.     // zoja +5 anders +0
  57.     adcLm35 = ((adcLm35/10) * 10) + (((adcLm35%10) >= 5) ? 5 : 0);
  58.  
  59.     rprintf("LM35: %d,%dn", (adcLm35/10), (adcLm35%10));
  60.  
  61.     lcdClr();
  62.     lcdPuts("LM35 at ADC5");
  63.     lcdGotoXY(0, 1);
  64.     // alles wat voor de komma staat, hetgeen erachter staat (eenheden)
  65.     // laten vallen door het getal te delen door 10
  66.     lcdPuts( itoa((adcLm35/10), buffer, 10) );
  67.     lcdPuts(",");
  68.     // na de komma, de eenheden, deze kunnen we uit de variable adcLm35
  69.     // halen door er de module van 10 van te nemen
  70.     lcdPuts( itoa((adcLm35%10), buffer, 10) );
  71.     // LCDs ondersteunen niet alle karakters, het graden-teken wordt oa
  72.     // niet ondersteunt daarom maar een enkel aanhalingsteken
  73.     lcdPuts("'");
  74.  
  75.     // temperatuur verandert niet zo snel... daarom kunnen we hier heel
  76.     // wat delay nemen. Als we sneller gaan, gaan we meer storingen
  77.     // krijgen. Het is niet de bedoeling dat de temperatuur tussen
  78.     // 24,0 en 24,5 staat te verspringen
  79.     _delay_ms(2000);  
  80.   }
  81.  
  82.   return 0;
  83. }
  84.  
  85. /**
  86.  *   @param     adcChannel     AVR hardware ADC channel
  87.  *   @param     samples       Aantal te nemen sampen en dan gemmidelde berekenen
  88.  *   @return     het gemiddelde van het aantal genomen sampels
  89.  */
  90. u16 avg(u08 adcChannel, u08 samples){
  91.   // dit is voor een meer stabiele temperatuursmeting te krijgen
  92.   u32 tmp = 0;
  93.   for(u08 i=0; i<samples; i++){
  94.     tmp += (u32) (adcGet(adcChannel));
  95.   }
  96.   return (u16) (tmp/samples);
  97. }
Nog geen reacties.
Naam
a-z A-Z 0-9 _

 
E-mail
Wordt niet getoont.
  (niet verplicht)
 
Mail sturen als
(optie)
Smoerijf reageerd
Eender wie reageaard
Nooit
 
Mail sturen
(optie)
Enkel mailen bij eerste reactie
Bij elke reactie mailen
 
Reactie
Laatste wijziging: Wo 15 April 2009, 21:14