Атмега8
Мучаю аналоговый датчик температуры типа LM35, характиристика 1град/10мВ.
Внутреннее опорное напряжение. АЦП 10 бит.
2560мВ/1024=2,5мВ (шаг измеряемого напряжения) получается измерить 1мВ невозможно?
В итоге работы очень хочется видеть десятые доли градуса, сейчас они скачут через 2-3 значения.
Осциллографом смотрю шумы на выходе с датчика, они составляют порядка 20мВ.
Вычитал про спец спящий режим ADC noise reduction, однако примеров использования не нашел.
Используя генератор начального кода в cvavr подсмотрел как усыплять контроллер, при этом шум уменьшается в два раза. Однако как разбудить его, непойму.
Привожу часть кода
Спойлер
Код: Выделить всё
#include <mega8.h>
#include <delay.h>
unsigned int indication,vol;
unsigned char ADC_TIMER, tic;
unsigned char takt;
unsigned char SET;
unsigned int temp;
unsigned char i;
unsigned int j;
unsigned int read_adc(void)
{
ADMUX=0xE5;;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
#asm
in r30,mcucr
cbr r30,__sm_mask
sbr r30,__se_bit | __sm_adc_noise_red
out mcucr,r30
sleep
cbr r30,__se_bit
out mcucr,r30
#endasm
return vol;
}
interrupt [ADC_INT] void adc_isr(void) //Прерывание по окончанию АЦП
{
read_adc();
//vol=ADCW/25;
}
// Read the AD conversion result
// with noise canceling
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
ADC_TIMER++;
if (ADC_TIMER==50) // временными промежутками задаем некоторые существенные отрезки времени
{
ADCSRA|=0x40; // Запускаем преобразование
ADC_TIMER=0;
}
}
// Timer1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
}
void main(void)
{
PORTB=0x81;
DDRB=0x3E;
PORTC=0x00;
DDRC=0x1F;
PORTD=0x58;
DDRD=0xB9;
TCCR0=0x03;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x03;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x20;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
TIMSK=0x11;
ADMUX=0xE5; // Выбираем АЦП канал (PortC.5-ADC5)
ADCSRA=0x8F; // Настройка АЦП
eeptoflash();
#asm("sei")
while (1)
{
}
}


