Subversion Repositories HomeAutomation

Rev

Rev 243 | 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. //#error yo helt fel
  53. #elif defined(ADC6)
  54.     /* Enable ADC6 */
  55.     ADMUX |= (1<<MUX1)|(1<<MUX2);
  56.     ADMUX &= ~((1<<MUX0)|(1<<MUX3));
  57. #elif defined(ADC7)
  58.     /* Enable ADC7 (only for TQFP package) */
  59.     ADMUX |= (1<<MUX0)|(1<<MUX1)|(1<<MUX2);
  60.     ADMUX &= ~(1<<MUX3);
  61. #else
  62.     #error No adc defined
  63. #endif
  64.  
  65. #if defined(VREF_INT)
  66.     #error Internal referens voltage still not implemented and tested
  67.     // TODO fixa för böfvelen
  68. #endif
  69.     /* Enable AVcc as Voltage Reference */
  70.     ADMUX |= (1<<REFS0);
  71.     ADMUX &= ~(1<<REFS1);
  72.  
  73.     /* Right adjust the result */
  74.     ADMUX &= ~(1<<ADLAR);
  75.  
  76.     /* Wake up ADC and enable it */
  77.     PRR &= ~(1<<PRADC);
  78.     ADCSRA |= (1<<ADEN);
  79.  
  80.     /* Make the first conversion (takes 25 ADC clock cycles) and throw away */
  81.     getTC1047temperature();
  82. }
  83.  
  84. /*
  85.  * Start reading and return the temperature value.
  86.  */
  87. uint32_t getTC1047temperature()
  88. {
  89.     uint32_t temperatureData;
  90.  
  91.     /* Start measurement (takes 13 ADC clock cycles) */
  92.     ADCSRA |= (1<<ADSC);
  93.  
  94.     while( ADCSRA & (1<<ADSC) ){ /* Wait for conversion to complete */ }
  95.  
  96.     /* Get the result, convert and return */
  97.     temperatureData = ADCW;
  98.  
  99. #if defined(VREF_INT)
  100.     /* Use internal 1.1 volt as reference */
  101.     temperatureData = temperatureData * 11;
  102.     temperatureData = (temperatureData * 10 / 1024) - 50;
  103. #else
  104.     /* Use 5 volt as reference */
  105.     temperatureData = temperatureData * 5;
  106.     temperatureData = (temperatureData * 100 / 1024) - 50;
  107. #endif
  108.     return temperatureData;
  109. }
  110.