Главная » Микроконтроллеры » ATtiny13 — регистратор температуры с использованием LM35 и UART

ATtiny13 — регистратор температуры с использованием LM35 и UART

Этот проект посвящен простой системе регистрации температуры с использованием микроконтроллера ATtiny13 и программного обеспечения UART.

Система считывает температуру каждую секунду и отображает ее в монитор последовательного порта (скорость передачи 19200, настройки 8N1).

Температура отображается в градусах Цельсия. Датчиком температуры является микросхема LM35. Полный пример кода находится на GitHub.

Датчик температуры LM35

LM35 — трехконтактный линейный датчик температуры. Может измерять температуру от -55 °C до + 150 °C. Выходное напряжение LM35 увеличивается на 10 мВ при повышении температуры на градус Цельсия.

LM35 может работать от источника питания 5 В, а ток потребления в режиме ожидания составляет менее 60 мкА. Распиновка выводов LM35 показана на рисунке ниже:

Распиновка выводов LM35

Необходимые компоненты

Принципиальная электрическая схема

Принципиальная электрическая схема

Код программы

Этот код написан на C и может быть скомпилирован с помощью avr-gcc. Более подробная информация о том, как скомпилировать этот проект, находится здесь.

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "uart.h"

#define	LM35_DATA_PIN	PB4

static void LM35_init(void);
static int LM35_read(void);
static int analog_read(uint8_t pin);
static void uart_puttemp(int temp);

int
main(void)
{
  int temp;

  /* setup */
  LM35_init();

  /* loop */
  while (1) {
    temp = LM35_read();
    uart_puttemp(temp);
    _delay_ms(1000);
  }
}

void
LM35_init(void)
{

  DDRB &= ~_BV(LM35_DATA_PIN); // установить контакт данных как INPUT
}

int
LM35_read(void)
{
  int temp;

  temp = analog_read(LM35_DATA_PIN); // считать аналоговое значение с датчика
  temp = ((((uint32_t)temp * 1000UL) >> 10) * 5); // конвертировать значение
  using euqation temp = Vin * 1000 / 1024 * Vref [milivolts]

  return temp;
}

int
analog_read(uint8_t pin)
{
  uint8_t low, high;

  switch(pin) {
  case PB2: ADMUX = _BV(MUX0); break; // ADC1
        case PB4: ADMUX = _BV(MUX1); break; // ADC2
        case PB3: ADMUX = _BV(MUX0)|_BV(MUX1); break; // ADC3
        case PB5: // ADC0
  default: ADMUX = 0; break;
  }

  ADMUX &= ~_BV(REFS0); // VCC в качестве опорного напряжения (5В)
  ADCSRA |= _BV(ADEN);  // Включить АЦП
  ADCSRA |= _BV(ADSC);  // Выполнить однократное преобразование
  while(bit_is_set(ADCSRA, ADSC)); // Ждать выполнение преобразования

  // Read values
  low = ADCL;
        high = ADCH;

        // combine two bytes
        return (high << 8) | low;
}

void
uart_puttemp(int temp)
{
  int value = temp / 10;
  uart_puts("temp=");
  uart_putu(value);
  uart_putc('.');
  uart_putu(temp - (value * 10));
  uart_putc('\n');
}

Источник

Оставить комментарий

Ваш email нигде не будет показан. Обязательные для заполнения поля помечены *

*