Forum: Mikrocontroller und Digitale Elektronik Referenzspannung zu klein?


von Ingo (Gast)


Lesenswert?

Ich habe vorhin in der Mittags noch schnell eine Schaltung mit einem 
TSic501 in Betrieb nehmen wollen. Die Temperatur wollte ich auf einem 
Standard LCD anzeigen soweit alles kein Problem. Da der TSic aber eine 
Ausgangsspannung von 0-1V habe ich eine externe Referenzspannung von 1V 
an den ARef angelegt. Aber als Ergebnis bekomme ich Werte die stark um 
500 schwanken +- 50LSB.  Die Ausgangsspannung des TSic beträgt auch 
0,5V, somit eigentlich 512LSB. Aber es schwankt wie Teufel. Da ich das 
eigentlich schon 100 mal gemacht habe, wundert es mich das es nicht 
geht! Kann es an der 1 referenzsspannung liegen? Diese ist zwar Super 
genau und sauber auf 1V eingestellt, aber nur 1V. Müsste doch eigentlich 
gehen oder? Wie gesagt, hatte bis jetzt noch keine große Möglichkeit 
nach dem Fehler zu suchen, bin nur grad an der theoretischen 
Fehlersuche!

von Ingo (Gast)


Lesenswert?

PUSH

von Kevin K. (nemon) Benutzerseite


Lesenswert?

Junge, es ist nicht einmal eine Stunde vergangen seit du den ersten 
Beitrag hier geschrieben hast. Erwartest du, dass hier sofort jeder 
springt und dein Problem löst? Wenn zwei Tage lang nichts kommt, kannst 
du mal nachfragen, aber so ist es schlicht unhöflich. Daher gibts auch 
ersteinmal keine Antwort von mir...

von Spess53 (Gast)


Lesenswert?

Hi

Welcher Controller? Welcher TSIC?

MfG Spess

von Ingo (Gast)


Lesenswert?

Atmega328, TSic501

von Spess53 (Gast)


Lesenswert?

Hi

>Kann es an der 1 referenzsspannung liegen?

1V ist die minimale Referenzspannung bei AVRs. Also hart an der Grenze.

Hast du den Kondensator (100n) am TSIC?

MfG Spess

von M. Н. (Gast)


Lesenswert?

[Zitat von gelöschtem Beitrag gelöscht]

1 Volt funktioniert bei mir mit 'nem mega32 (uralter Knochen).
Müsste also auch bei deinem Controller gehen.
Zur Not fahr halt die Referenzspannung ein bisschen hoch z.B. 2 Volt
Dann hast du halt nicht mehr ein so genaues Ergebnis nur noch von (0- 
512). Aber immer noch besser als gar keins :)

von René B. (reneb)


Lesenswert?

Kurz und bündig: Ja!
1V Referenz ist grad noch möglich für schnelle 8Bit oder langsame 
10Bit-Wandlung bei dem AVR. Aber wieso drauf anlegen, wenn es doch 
unnötig ist.
Wieso den Aufwand für 1V Referenz betreiben um den TSIC direkt 
anzuschließen und nicht direkt die interne Referenz nehmen und dann die 
Bauteile zur Verstärkung des TSIC Analogausgangs nehmen

Probiers mal hiermit:
- Vorverstärkung hochsetzen
- interne Referenz von 2,56V nehmen. So schlecht ist die nicht.
- Die Referenz hübsch mit Cs stabilisieren
- Nach der größeren Vorverstärkung einen RC-Filter an den ADC legen
- Mehr Samples mitteln, z.B. durch gleitenden Mittelwert.

Wenn du dann noch Probleme hast:
- Spannungsquelle prüfen (Restwelligkeit?)
 - vor allem des Sensors und direkt am µC
- Leitungslängen prüfen
- Leitungsverlauf prüfen (vorbei an Leitungen mit hohem Strom, usw...)

PS: Die Dinger haben doch auch nen Digitalausgang. Wieso den nicht in SW 
gegossen bedienen?

von B.A. (Gast)


Lesenswert?

Probiere es mal mit den internen 1.1V oder 2.56V, wenn das nicht geht 
ist was faul.

Miss mal die Spannung am Vref-Pin, vielleicht gibt es einen Kurzschluss.

Die analoge Versorgungsspannung musst du auch ordentlich abblocken, dazu 
gehört eine kleine 10µF Spule und ein paar Kondensatoren, je mehr desto 
besser.

Wie schaut dein Schaltplan aus?

von Harald W. (wilhelms)


Lesenswert?

B.A. schrieb:

> eine kleine 10µF Spule und ein paar Kondensatoren,

Und wieviel µH sollen die Kondensatoren haben?
:-)
Gruss
Harald

von Ingo (Gast)


Lesenswert?

Also, hier mal der Code zum initialisieren:
1
void Init_AVR ( void )
2
{
3
  // Mutecontroll, Mute ON
4
  DDRD |= ( 1<<PD2 );
5
  MUTECONTROL &= ~ ( 1<<MUTE );
6
  
7
  // Pullups for Buttons 
8
  PORTD |= ( 1<<PD6 ) | ( 1<<PD7 );  
9
10
  // Systemtimer
11
  TCCR0B |= ( 1<<CS00 ) | ( 1<<CS01 );  // Prescaler 64
12
  TIMSK0 |= ( 1<<TOIE0 );
13
  
14
  // ADC
15
  ADMUX =  7;
16
  ADCSRA |= ( 1<<ADPS1 ) | ( 1<<ADPS2 ) | ( 1<<ADEN ) | ( 1<<ADATE ) ;  // Prescaler 64
17
  ADCSRB |= ( 1<<ADTS2 );
18
19
  // Global Interrupt enable
20
  sei();
21
22
}

Der ADC wird immer angestoßen, wenn der Timer0 überläuft, mit etwa 
488Hz.
Der Mega läuft auf 8MHz.

Hier die Messfunktion, die in der Timerüberlauf ISR aufgerufen wird, um 
die Messung abzuschließen:
1
void Messen ( void )
2
{
3
  Temperatur.Messcounter = ++Temperatur.Messcounter & ( NR_OF_MIDDLE_VALUES-1 );
4
  while (ADCSRA & (1<<ADSC));        
5
  Temperatur.Buffer[Temperatur.Messcounter] = ADC;
6
}

Ich lasse mir derzeit noch den Temperatur.Buffer[0] ausgeben, und wie 
gesagt, die Were schwanken teilweise um 150LSB um die ~500 umher. Wenn 
ich die externe Referenzspannung erhöhe, schwankt es halt um einen 
kleineren Wert und das Schwanken wird kleiner, aber immernoch deutlich 
zu groß!

Was hab ich übersehen? Die Variablen sind alles volatile, die Ausgabe 
auf dem LCD erfolgt über ein Flag, das in der Timer-ISR gesetzt wird. 
Die Ausgabe mit einer Festen Ziffer funktioniert auch, is wie gesagt ne 
oft bewährte Routine von mir.


Ingo

von Ingo (Gast)


Lesenswert?

Ich messe übrigens an ADC7 und externe Referenz.

von Ingo (Gast)


Lesenswert?

Später will ich natürlich Mittelwerte bilden, aber bei diesen Messwerten 
hat das wenig sinn, die sind einfach noch zu unstabil!

von Dumpf Nilp (Gast)


Lesenswert?

Was soll's denn bringen mit so tiefer Referenz zu arbeiten ? Die Werte 
werden nicht besser, denn das absolute Rauschen bleibt gleich. Mach mal 
die interne Referenz, und einen 100nF an den AREF pin.

von Ingo (Gast)


Lesenswert?

Dumpf Nilp schrieb:
> Was soll's denn bringen mit so tiefer Referenz zu arbeiten ? Die Werte
> werden nicht besser, denn das absolute Rauschen bleibt gleich
Naja, die Auflösung wird halt besser. Rauschen auf den letzten Bits 
kriegt man durch Mittelung weg.

> Mach mal
> die interne Referenz, und einen 100nF an den AREF pin.
Is ne fertige Platine, is so ohne Weiteres nicht möglich

von Ingo (Gast)


Lesenswert?

Die Referenz steht jetzt auf 1,2V, sollte laut DB passen!

von Ingo (Gast)


Lesenswert?

So, jetzt läuft nur das hier in der while(1):
1
     _delay_ms(1000);
2
    ADCSRA |= (1 << ADSC );
3
    while (ADCSRA & (1<<ADSC));
4
    Temperatur.Buffer[0] = ADC;
5
    lcd_setcursor(1,1);
6
    lcd_formatierte_zahl( Temperatur.Buffer[0] , 4, 0 );

und ich kriege trotzdem schaukelnde Werte. Messung wird nun per Hand 
gestartet (in der Initialisierung den autotrigger ausgeschaltet) und die 
Wert schaukeln genau wie vorher!

von Dietrich L. (dietrichl)


Lesenswert?

Ingo schrieb:
> Is ne fertige Platine, is so ohne Weiteres nicht möglich

Kondensatoren kann man immer noch dazulöten...
Welche Platine ist das denn? Sollte man davor warnen? ;-)

Hast Du wenigstens eine Schaltung? Die Verdrahtung ist auch wichtig, 
besonders des GND. Geht der GND des TSic direkt (sternförmig) an den GND 
des µC (am besten der GND, der zu AVCC gehört)?

Teste mal mit einem C (100n) am ADC7 gegen GND.

Andere Testmöglichkeit: ein 10k Poti an der Referenz, Schleifer an ADC7.

Wenn die Ergebnisse dann stabil sind, kommt der Dreck vom TSic 
einschließlich seiner Versorgung und Deine µC-Schaltung ist OK.

Wenn nicht, liegt es am µC und/oder der externen Referenz.

Aber die Stabilität der Referenz kann man auch Testen, indem man mal die 
interne Referenz verwendet.

So kannst Du Stück für Stück mögliche Quellen ausschließen.

Gruß Dietrich

von Ingo (Gast)


Lesenswert?

Selbst mit kurzgeschlossenem ADC7 gegen GND, habe eine Messung 0LSB dann 
teilweise 80LSB dann z.B. 50, dann wieder 0 usw. langsam glaube ich der 
µC hat n Defekt...

von Dumpf Nilp (Gast)


Lesenswert?

>> Mach mal
>> die interne Referenz, und einen 100nF an den AREF pin.
>
>Is ne fertige Platine, is so ohne Weiteres nicht möglich

Ohne dieses C ist aber sowieso nichts...

von Ingo (Gast)


Angehängte Dateien:

Lesenswert?

Wer findet den Fehler, ich habe ihn gefunden :)

von Ingo (Gast)


Lesenswert?

Verbaut ist übrigens ein TLC272, kein TL062

von Kevin K. (nemon) Benutzerseite


Lesenswert?

100nF am Ausgang vom OpAmp?

von Dietrich L. (dietrichl)


Lesenswert?

Kevin K. schrieb:
> 100nF am Ausgang vom OpAmp?

... und deshalb schwingt er?

von Ingo (Gast)


Lesenswert?

Ja, so ist es. Sollten eigentlich 100pF sein, aber irgendwie hat sich da 
ein 100nF eingeschlichen... Und mit nem Oszi wurde es erst sichtbar. 
Hätte mit 100pF keine Schwingneigung erwartet, aber 100nF sieht halt 
böse aus!

von Purzel H. (hacky)


Lesenswert?

Und weshalb wurde nicht gleich die 2.5v referenz verwendet ?

von Ingo (Gast)


Lesenswert?

Weil der Sensor 0-1V ausgibt, somit ist eine 1V Referenz auflösender! Da 
der Sensor 0,1 Grad C genau ist, benötige ich eine Auflösung > 0,1V. Das 
erreiche ich mit ner 2,5V Referenz nicht...

von Spess53 (Gast)


Lesenswert?

Hi

>Und weshalb wurde nicht gleich die 2.5v referenz verwendet ?

Welche? ATMega48/88/168/328 haben eine interne 1,1V-Referenz.

MfG Spess

von Ingo (Gast)


Lesenswert?

Spess53 schrieb:
> Hi
>
>>Und weshalb wurde nicht gleich die 2.5v referenz verwendet ?
>
> Welche? ATMega48/88/168/328 haben eine interne 1,1V-Referenz.
>
> MfG Spess

Er meint den 4040-2,5

von René B. (reneb)


Lesenswert?

Allgemein:
Bitte die 100nF an den 10k/10k Spannungsteiler hinter der Z-Diode. Da 
die Referenz praktisch nicht belastet wird, könnte da auch der OpAmp 
aus. Der macht sowieso Ärger, wenn er eine so große Kapazität umladen 
soll.

Ich würde daher entweder:
- 100nF hinter dem OpAmp weg bzw. deutlich runtersetzen oder mit 
RC-Glied ergänzen

Oder (bevorzugt):
- Du hast da eine teure Referenzquelle eingebaut, die auch recht stabil
  sein  sollte. Ein zusätzlicher C am Teiler macht da den OpAmp
  berflüssig.
  10k/10k sind mit 0,125mA eigentlich ok. Kannst aber auch auf 2x3,3k
  gehen, wenn du damit ein schlechtes Gefühl hast.

Und insgesamt zur Vereinfachung:
Die 4040 gibt es in einer 3,00V-Version. Mit 3,3V-Versorgung wirds da 
zwar eng, aber wenn du irgendwo eine 5V-Versorgung hast (selbst wenn die 
stark schwankt), kannst du dir den Abgleich mit Verwendung von 3 
0,1%-Widerständen auch gleich schenken:
3V-Referenz über R an die 5V und mit drei gleichen 0,1%-Widerständen
runterteilen und ein C dranpacken.

Oder: Wenn du schon R/C/OpAmp verbaust:
Verstärke den Ausgang deines Sensors und nimm die interne Referenz des
Controllers. Da bitte an das C am VREF denken.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.