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!
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...
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
[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 :)
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?
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?
B.A. schrieb: > eine kleine 10µF Spule und ein paar Kondensatoren, Und wieviel µH sollen die Kondensatoren haben? :-) Gruss Harald
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
Später will ich natürlich Mittelwerte bilden, aber bei diesen Messwerten hat das wenig sinn, die sind einfach noch zu unstabil!
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.
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
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!
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
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...
>> 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...
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!
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...
Hi
>Und weshalb wurde nicht gleich die 2.5v referenz verwendet ?
Welche? ATMega48/88/168/328 haben eine interne 1,1V-Referenz.
MfG Spess
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.