Sida 1 av 1
Hitta spänningsreferens [Löst]
Postat: 28 november 2005, 12:13:35
av karlstedt
Nån som vet var man kan hitta en spänningsreferens i utrustning som man har hemma, typ moderkort, gamla cd-spelare och annat krafs... Bör vara runt 2 volt. Ej mindre.
Eller går det att göra en som är skapligt okänslig för temperatur... Antar att en vanlig spänningsdelning skulle bli oerhört temperaturberoende.. En opkoppling likaså pga motståndens "tempkoefficient"... Parallella motstånd kanske skulle dämpa temperaturdriften lite men det känns som att det blir för mycket fulhack...
Tack på förhand.
EDIT: Ska väl tilläga att jag behöver den för att jag inte får Internal Vref att fungera på ATmega32

Denna kod finns med i initieringen av ADCn:
Kod: Markera allt
//ADMUX |= (1<<REFS1); //set ref to internal 2.56V
//ADMUX |= (1<<REFS0);
Har även läst ADMUX-registret och verifierat att dom är satta.. Läsning av ADMUX gav 224. (11100000)
Nån som har erfarenheter/tips?
Postat: 28 november 2005, 12:32:54
av $tiff
Du ska ha referensspänningen till ADCn i en AVR. Påverkas inte själva ADCn också av temperaturförändringar?
Det finns små kretsar som jag antar är temepraturstabila att sampla, om det nu bara är ett experiment du bygger.
Men det lättaste är nog att få igång Vref i AVRen :)
Postat: 28 november 2005, 12:41:33
av Hedis
Hur har du kopplat Vref-pinnen?
Jag har använt Vref på 2,56v i en Mega32:a utan problem.
Fungerade kanon och var exact.
Jag avkopplade den med en kondensator extern. Behövs dock inte.
Kod: Markera allt
ldi temp,0b11000000 ;Init AD to 2.56v internal Aref
out admux,temp
Postat: 28 november 2005, 12:50:19
av karlstedt
Det finns små kretsar som jag antar är temepraturstabila att sampla
Jo, visst. Tanken var att jag skulle få tag på en snabbt. Jag kan lika gärna köpa en isf. Kostar bara några kronor.. Men ni vet ju hur det är då man håller på och labbar. Frakttider finns inte med i beräkningen
Hedis >
Jag har inte kopplat Vref nåt överhuvud taget.. Det sköts väl internt? Ansluter man man nåt till Vref så kortslutar man ju den. (förutom en kondning då kanske) och vad jag förstod av databladet så var det bra för "noise immunity". Bör väl fungera även utan?
EDIT: ...och min ADMUX ser ut som du beskriver sånär som på 1 bit som är "left adjust", men det vet vi båda att det inte ska påverka detta.
Postat: 28 november 2005, 16:03:43
av Hedis
Jepp då har du helt rätt.
Det borde fungera då.
Vad händer/händer inte?
Du initierar AD-n riktigt?
Sätter prescaler mm.
Väljer kanal i mux:en.
Ger den en kort stund på sig att stabilisera.
Startar sampling. (alternativt sätter den freerunning)
Läser ur registret o ser vad det blir.
Kod: Markera allt
ldi temp,0b11000001 ;choose channel 1 from adc
out admux,temp
ldi temp,0b11001111 ;set the register adcsr
out adcsr,temp
rcall delay2 ;Wain until ADC has stabilized
in temp,adcl ;read both adc register
in temp2,adch
lsr temp
lsr temp
lsl temp2
lsl temp2
lsl temp2
lsl temp2
lsl temp2
lsl temp2
or temp,temp2 ; ori, e.g. the 2 lsb bits gone->8 bits left
mov avgas,temp
Postat: 28 november 2005, 16:31:51
av karlstedt
Ja, alltså...förut fungerade det korrekt när jag hade valt Aref som referens och kopplat den till Vcc. Då hade jag rätt värden ut på LCD:n. Dum som man är vill man ju öka upplösningen och precisionen och därmed tänkte jag att jag skriver REFS1 och REFS1 i ADMUX till ettor för att använda Internal Vref på 2.56 V. Detta skulle funka fint eftersom min insignal aldrig överstiger 2 V.
När jag testat detta fick jag 0 volt ut på Vref. Jag hade inget inkopplat på Vref då. (tror jag

)Tydligen skulle man ju kunna mäta den spänningen med en "high impedance voltmeter", vad det nu är? Duger det inte med en vanlig hobby-multimeter?
Men nu är mina problem värre än så... Nu funkar fan ingenting.. (helt felaktiga värden) Måste nästan frågasätta om hårdvaran verkligen fungerar som den ska... Verkar nästan som om jag släppt ut lite rök ur min stackars mega32a.
Ska snygga upp koden lite och se om jag hittar nåt knas, annars postar jag kod här inom en snar framtid.
EDIT: Måste nog krypa till korset.
Så här ser koden ut
Kod: Markera allt
void ADC_INIT(void)
{
ADCSRA |= (1<<ADEN); //ADC enable
ADMUX |= (1<<ADLAR); //Left adjust result
ADMUX |= (1<<MUX0); //Use ADC1 as input
//ADMUX |= (1<<REFS1); //set Vref to internal 2.56V
//ADMUX |= (1<<REFS0);
ADCSRA |= (1<<ADSC); //Start conversion
ADCSRA |= (1<<ADPS2); //Prescaler set to 128
ADCSRA |= (1<<ADPS1); //
}
SIGNAL(SIG_ADC)
{
char*temp = "";
lcd_goto(0x8E);
uint8_t adc_inL = ADCL;
uint8_t adc_inH = ADCH;
float result = (adc_inH<<2)+(adc_inL>>6);
result = result*(5.18/1024);
dtostrf(result, 4, 3, temp);
lcd_puts(temp);
}
Man tycker inte att speciellt mycket ska kunna gå fel på den lilla biten?

Postat: 28 november 2005, 17:28:18
av Hedis
Borde fungera att mäta med vanlig multimeter. (Dom brukar väll ligga på 10Mohm)
Dock så måste du aktivera valet med 2,56v intärn Vref med avkoppling då den måste switcha till pinnen till vref:en.
Det fungerar alltså inte om du väljer extern Vref nu?
Jag har faktiskt lyckats grilla en adc-ingång en gång.
Tror jag råkade mata 15v från op´n till ingången.
Den fungerar men beter sig helskummt.
Hur fungerar det om du provar med en annan adc-ingång?
Postat: 28 november 2005, 17:51:50
av karlstedt
Just nu kör jag med extern Vref igen.
Har precis bytt från ADC0 till ADC1. Undra om man kan förstöra Vref och den biten i ADCn eftersom jag inte tycker att det fungerar att få fram 2.56 även fast ADMUX är riktig??
Grejen är den att det verkar fungera riktigt för att det som visas på displayen rör sig på ett rimligt sätt, om ni förstår vad jag menar. Det är bara det att värdena blir väldigt konstiga.
lägsta inspänningen 0.25 V ger 1.857 ut
och högsta inspänn. 1.922 ger 3.880 ut...
ser inget samband... hoppas nån annan gör det..
EDIT: Exakt samma på ADC2...
Postat: 30 november 2005, 09:02:15
av karlstedt
Slutrapporterar tråden lite för de som är intresserade...
Ett byte av uC gjorde att allt fungerade som det ska. Jag måste alltså ha haft nån extern spänning kopplad till Vref när jag valde intern Vref.
Men en ny mega32 och en kondning på utgången mäter den korrekt igen. Det går att mäta de 2.56(2.54) volt på Vref med en vanlig voltmeter, vilket inte gick på den förra jag testade med.
Tur att det inte var min programmering det var fel på
