Subversion Repositories HomeAutomation

Rev

Rev 488 | Blame | Compare with Previous | Last modification | View Log | SVN | RSS feed

  1. /*
  2.  * TC1047 temperature sensor
  3.  *
  4.  * Using ADC for reading sensor value.
  5.  *
  6.  * Author: Erik Larsson
  7.  * Date: 2006-12-19
  8.  *
  9.  */
  10.  
  11. /*-----------------------------------------------
  12.  * Includes
  13.  * ---------------------------------------------*/
  14. #include <avr/io.h>
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17.  
  18. #include "tc1047.h"
  19.  
  20. /*----------------------------------------------
  21.  * Functions
  22.  * --------------------------------------------*/
  23.  
  24. /*
  25.  * Initiate ADC for reading temperature from sensor.
  26.  */
  27. void adcTemperatureInit()
  28. {
  29. #if defined(ADC0)
  30.     /* Enable ADC0 */
  31.     ADMUX &= ~((1<<MUX0)|(1<<MUX1)|(1<<MUX2)|(1<<MUX3));
  32. #elif defined(ADC1)
  33.     /* Enable ADC1 */
  34.     ADMUX |= (1<<MUX0);
  35.     ADMUX &= ~((1<<MUX1)|(1<<MUX2)|(1<<MUX3));
  36. #elif defined(ADC2)
  37.     /* Enable ADC2 */
  38.     ADMUX |= (1<<MUX1)|;
  39.     ADMUX &= ~((1<<MUX0)|(1<<MUX2)|(1<<MUX3));
  40. #elif defined(ADC3)
  41.     /* Enable ADC3 */
  42.     ADMUX |= (1<<MUX0)|(1<<MUX1);
  43.     ADMUX &= ~((1<<MUX2)|(1<<MUX3));
  44. #elif defined(ADC4)
  45.     /* Enable ADC4 */
  46.     ADMUX |= (1<<MUX2);
  47.     ADMUX &= ~((1<<MUX0)|(1<<MUX1)|(1<<MUX3));
  48. #elif defined(ADC5)
  49.     /* Enable ADC5 */
  50.     ADMUX |= (1<<MUX0)|(1<<MUX2);
  51.     ADMUX &= ~((1<<MUX1)|(1<<MUX3));
  52. #elif defined(ADC6)
  53.     /* Enable ADC6 */
  54.     ADMUX |= (1<<MUX1)|(1<<MUX2);
  55.     ADMUX &= ~((1<<MUX0)|(1<<MUX3));
  56. #elif defined(ADC7)
  57.     /* Enable ADC7 (only for TQFP package) */
  58.     ADMUX |= (1<<MUX0)|(1<<MUX1)|(1<<MUX2);
  59.     ADMUX &= ~(1<<MUX3);
  60. #else
  61.     #error No adc defined
  62. #endif
  63.  
  64.     /* Enable AVcc as Voltage Reference */
  65.     ADMUX |= (1<<REFS0);
  66.     ADMUX &= ~(1<<REFS1);
  67.  
  68.     /* Right adjust the result */
  69.     ADMUX &= ~(1<<ADLAR);
  70.  
  71.     /* Wake up ADC and enable it */
  72.     PRR &= ~(1<<PRADC);
  73.     ADCSRA |= (1<<ADEN);
  74.  
  75.     /* Make the first conversion (takes 25 ADC clock cycles) and throw away */
  76.     getTC1047temperature();
  77. }
  78.  
  79. /*
  80.  * Start reading and return the temperature value.
  81.  */
  82. uint32_t getTC1047temperature()
  83. {
  84.     uint32_t temperatureData;
  85.  
  86.     /* Start measurement (takes 13 ADC clock cycles) */
  87.     ADCSRA |= (1<<ADSC);
  88.  
  89.     while( ADCSRA & (1<<ADSC) ){ /* Wait for conversion to complete */ }
  90.  
  91.     /* Get the result, convert and return */
  92.     temperatureData = ADCW;
  93.  
  94.     /* Use 5 volt as reference */
  95.     temperatureData = temperatureData * 5;
  96.     temperatureData = (temperatureData * 100 / 1024) - 50;
  97.  
  98.     return temperatureData;
  99. }
  100.