Atmega 8, kolísajúci prevod z AD prevodníka.

Čaute, robím teplomer s Atmega 8, lcd a čidlom lm 35cz. Mám taký problém výsledok z AD prevodu veľmi kolíše. Najprv som myslel, že je to tím čidlom, ale po pripojení trimra namiesto čidla som zistil, že je problém niekde inde :cry: A ja neviem nato prísť kde. Skúsil som ich viac Atmega 8 a zdroj napätia mám stabilizovaný.

Ak má niekto nápad, budem vďačný za každú radu.
teplomer.c (793 Bytes)
Atmega.bmp (1.33 MB)

Nejspíš nestabilní reference. Stabilizovaný zdroj není ještě záruka stability vhodné pro referenci AD převodu. Zkus použít vnitřní referenci ATMEGy a ne napájecí napětí.

Skusil som aj vnútornú a nepomohlo :cry:

A o kolik bitů to kolísá? Jak to máš zapojený? Na nepájivým poli? Nemáš tam půlmetrový dráty?
Dej tam menší děličku na 64. Spouštěj si AD převod sám a vypni free running a to přerušení.

Mám to na plošnom spoji žiadne drôty a kolíše to dosť, po pripojení toho čidla, ktoré má 10 mV na jeden stupeň to kolíše + - 3 stupne.

Skúšal som aj iný program s funkciou čítania určitého kanála ani to nepomohlo.#include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include <stdlib.h> #include <stdio.h> #include "lcd.h" unsigned int Read_ADC(unsigned char channel){ // vloz cislo kanala, vymaskuj nepouzite bity ADMUX &= 0xF0; ADMUX |= channel & 0x0F; // start conversion ADCSRA |= (1 << ADSC); // cakaj na priznak skoncenia konverzie while(ADCSRA & (1 << ADSC)); // navratova hodnota - vysledok ad prevodu return ADC; } int main(){ char text[32]; unsigned int u,adc; ADMUX |= (1 << REFS0); //referencia 5V // povolenie AD prevodnika, Interrupt flag //128 pri frekvencii hodin 8MHz ADCSRA |= (1 << ADEN) | (1 << ADIF) | (1 <<ADPS2) | (1 <<ADPS1) | (1 <<ADPS0); sei(); // povol globalne prerusenia lcd_init(LCD_DISP_ON); while(1){ adc = Read_ADC(0); // vypocet napatia v mV u = ((long)adc*5000/1024); sprintf(text,"ADC:%d \nU:%dmV",adc,u); lcd_clrscr(); lcd_gotoxy(0,0); lcd_puts(text); _delay_ms(500); } }

Taky aktualně řeším podobný problém. Měřím zhruba na 100V a lítá mi to o 0,6V. Mám tam ref. TL431. Původně to lítalo skoro o 1V, tak jsem odpájel na Arduinu Nano 100n kond na Aref, který asi rozkmitával tu referenci a zlepšilo se to.
Předdělička A-D je pro příkaz analogRead() 128, takže pomaleji už mi to nejde. Prve nastavím vstup MX, počkám a pak teprve čtu.
Poslední možnost co mi zbývá je uspávat mcu při převodu a posunout odporový dělič z externího modulu(15cm drátu) přímo na desku k Arduinu.

Ďakujem za dobrý tip :smiley: Vyhodil som ten 100nF kondenzátor s AREF a nahradil som ho 100uF. Teraz kolíše na poslednom bite čo je zanedbateľné a možno by stačil aj menší kondenzátor.