ATmega8 + TO-92 (LM335), přečíst napětí z AD převodníku

čidlo:
vstup 2k R, 4.6 V (vic mi tam programator nedoda)
vystup: ADC0 , zem

Vref vnitrni 2,92 V
Vin 0.9 V (pouzivam delic 10 a 10 k R)
na Aref mam kondík, 2,5 V

1) A tady mam prvni háček, myslel sem, ze Vin by melo pri 20 C byt 2,93 V / 2 = 1.47 V
2) a kdyz sem na Vin dal interni napeti 1,3 V, tak misto 512 sem precet z prevodniku 495
3) zkatka potrebuji radu, jak precist napeti z AD prevodniku a jestli ta napětí tak mají být, nebo je tam blbost…

Díky za odpoved

moje zpatlane funkce:

void init_adc() {
ADMUX = 0b11001110; // 11 (vnitrni reference) 0 (zarovnat vpravo) 0 () 0000 (0000nulty kanal, 1110 interni napeti 1,3 V)
ADCSRA= 0b10000111; // 1 (zapnuty ad prevodnik) 0 (prevodem) 000 () 111 (pred-delicka 128)
}

unsigned int read_adc()
{
ADCSRA|= 0x40; // zacnu s prevodem
while ((ADCSRA & 0x10)==0);
ADCSRA |= 0x10; // kontrola vlajecky
return ADCL; // mozna si vracim blbost
}
:wink: :wink:

:arrow_right: administrator: přejmenováno z "atmega8 + TO-92 (LM335)"

Zkus takto:

[code]// mega8, 8MHz
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>

#define REF_AVCC (1<<REFS0) // reference = AVCC
#define REF_INT (1<<REFS0)|(1<<REFS1) // internal reference 2.56 V
#define REF_EXT 0 // external reference on AREF pin

// global variables
uint16_t adc_value;
char tempstr[9];

//------------------------------------------------------

void adc_init(void)
{
ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
}

//------------------------------------------------------

uint16_t adc_read(uint8_t channel)
{
ADMUX = REF_INT | channel; // set reference and channel
ADCSRA |= (1<<ADSC); // start conversion
while(ADCSRA & (1<<ADSC)){} // wait for conversion complete
return ADC;
}

//------------------------------------------------------

int main(void)
{
adc_init();

while(1)
{
adc_value = adc_read(0); // čti kanál ADC0
utoa(adc_value, tempstr, 10); // convert value to string
_delay_ms(200);
}
}[/code]
Pin AVCC je spojený s VCC.
Na pinu AREF je pouze kond 100k proti zemi.
Je zapnutá vnitřní reference 2,56 V.

Vyzkoušel jsem,
odchycene napeti z ADC 1.085 V
skutecne 0.95 V
podava to pribliznou hodnotu, i kdyz by to melo byt mnohem presnejsi
díky

Jen pro upřesnění pro použití interní reference 2,54V :
Na pinu AVCC má být 100n kondík a k VCC je připojen přes tlumivku 10uH.
Na pinu AREF má být 100n kondík.

Hodiny AD převodníku je třeba nastavit tak, aby výsledná frekvence byla v rozmezí 50-200kHz. Pokud nepožaduješ rozlišení AD převodníku 10-bitů, pak můhou být hodiny AD převodníku i vyšší pro rychlejší vzorkování.

Tolik datasheet.

i pro nizsi teplotu tam ta umera pres konstantu (spoctene / namerene napet) je. ale porad je tu spatne napeti z cidla

Referenční napětí Uref není přesně 2,56 V.
Podle datašítu může mít 2,3 až 2,7 V.
Přesnou hodnotu změř na pinu AREF a tuto hodnotu pak používej k výpočtu napětí.
Napětí = adc_value * Uref / 1024

Ale procentuální chyba musí být stále stejná.
<< a kdyz sem na Vin dal interni napeti 1,3 V,
<<tak misto 512 sem precet z prevodniku 495

Napětí 1,3 V odpovídá hodnota adc 520, ne 512.
Tady je chyba 495/520, tj. 0,952.

<<odchycene napeti z ADC 1.085 V
<<skutecne 0.95 V
A tady je chyba 1,085/0,95 tj. 1,142.

Vypadá to na nějakou chybu v měření nebo výpočtech.