DMC.07 · Питание · ATmega328P
Задача
Считывать LM35 (10 мВ/°C) и включать сигнал при перегреве регулятора.
Алгоритм
T(°C) = отсчёт·Vref/1024/0.01. Сравнение с порогом включает светодиод/бузер.
Исходный код (C, avr-gcc)
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <avr/io.h>
#include <util/delay.h>
static uint16_t adc_read11(uint8_t ch){
ADMUX=(1<<REFS1)|(1<<REFS0)|(ch&0x0F); // опора 1.1В
ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
_delay_ms(1);
ADCSRA|=(1<<ADSC); while(ADCSRA&(1<<ADSC));
return ADC;
}
int main(void){
DDRB|=(1<<PB5);
const float VREF=1.1f, TH=70.0f;
for(;;){
float t = adc_read11(3)*VREF/1024.0f/0.01f;
if(t>TH) PORTB|=(1<<PB5); else PORTB&=~(1<<PB5);
_delay_ms(250);
}
}
Сборка: avr-gcc -mmcu=atmega328p -DF_CPU=16000000UL -Os файл.c -o файл.elf
Пояснения
Для точности лучше внутренний ИОН 1.1В (ADMUX REFS1|REFS0) — выше разрешение на малых напряжениях.