Mám problém s nestabilním napětím z napěťové reference tl431 na pinu AREF viz obrázek
Měřím napětí na teplotním čidlu lm35 a hodnota vypadala spíš jako TIP sprot, a i po zprůměrování 64 hodnot je výstupní hodnota s rozkmitem cca 20mV.
Má někdo tušení kde dělám chybu?
Kód: Vybrať všetko
// ATMEGA 8A
#define F_CPU 1000000
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <stdio.h>
#include "lcd.h"
char text[32] = {0,}; // LCD
volatile uint8_t count= 0;
volatile uint8_t countADC= 0;
void zmer(uint16_t pole[]);// změří 5 hodnot a vrátí je v poli
uint16_t val[6];// pole pro výsledky měření
void zmer(uint16_t pole[]){
char i;
for(i=0;i<5;i++){
ADMUX = i;// nastavení měřeného kanálu
ADCSRA |= (1<<ADSC);// spustit převod
while(ADCSRA & (1<<ADSC)){}// čekej dokud je ADSC=1 (probíhá převod)
pole[i] = ADC;// ulož výsledek převodu
}
}
unsigned long int prumer( int*pole, int delka ){
unsigned long int sum = 0, x = 0;
for( x = 0; x < delka; x++ ){
sum += pole[x];
}
return sum/delka;
}
int main (void) {
DDRB = 0b11111111; // set IO
DDRD = 0b11011111; // set IO
PORTD |= (1 << PD5); // pull up
TCNT0 = 0;
TCCR0 |= (1<<CS01); // PRESCALER 8
TIMSK = (1<<TOIE0); //Timer/Counter0 Overflow Interrupt Enable
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1); // povolit ADC, clock pro ADC F_CPU/64
lcd_init(LCD_DISP_ON); //inicializace LCD
int temp = 0; // hodnota teploty v mV
char x =0; // počet uložených hodnot
unsigned int hodnoty[64] = {0,};
sei(); // povolení globálního přerušení
while(1){
if(count > 3){ // 6us, doba záknitů tlačítka
PORTD ^= (1 << PD0); // Invert
}
zmer(val);
hodnoty[x] = val[4] * 2.3763; // U REF = 2.4312
x++;
if ( x == 64 ){
temp = prumer( hodnoty, 64 );
lcd_clrscr();
sprintf(text,"TEMP=%d",temp);
lcd_puts(text);
lcd_gotoxy(0,0);
x = 0;
}
}
}
ISR (TIMER0_OVF_vect){ // 2048 us
if((PIND & (1 << PD5)) == 0){
if(count<200)
count++;
if(count==254)
PORTB |= (1 << PB2); // rele_off
}
else{
count=0;
}
}