Subversion Repositories HomeAutomation

Rev

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