Forum: Mikrocontroller und Digitale Elektronik ADC Wandlung "hängt"


von Thomas U. (morrie)


Lesenswert?

Hallo Leute,
ich habe mal wieder ein Problem und weiß nicht weiter. Ich arbeite 
gerade an einer eigentlich sehr einfachen Schaltung die eine IR Diode 
mit einem ADC ausliest um die Intensität einer IR Quelle zu messen. 
Dafür verwende ich einen Attiny85 mit 8Mhz. (Wandlerfrequenz ca. 100khz)
1
//Init
2
ADMUX |= (1<<MUX0) | (1<<MUX1) | (1<<ADLAR);
3
ADCSRA|= (1<<ADEN) | (1<<ADSC) | (1<<ADATE) | (1<<ADIE);
4
ADCSRB = 0;
5
6
//Auslesen der Daten
7
ISR(ADC_vect)
8
{
9
test = ADCH;
10
11
}

Die ADC Werte werden dann über die SPI Schnittstelle weitergegeben. Die 
Schnittstelle habe ich ausführlich getestet, die funktioniert.

Jetzt zu meinem Problem:
Das ganze funktioniert ganz gut, nur wenn ich mit der IR Quelle zu nahe 
komme, dann kommt nur noch das Ergebnis 255 raus und das Ergebnis ändert 
sic dann nicht mehr. Ab diesem Zeitpunkt hängt das Ergebnis bei 255. 
Erst nach einem Neustart der Schaltung funktioniert das ganze wieder.

Woran könnte das liegen?

morrie

von Helmut S. (helmuts)


Lesenswert?

Wie sieht denn deine Ansteuerschaltung für den ADC-Eingang aus?
Latchup wegen Übersteuerung?

von c.m. (Gast)


Lesenswert?

zeig mal schaltung bitte.

außerdem eventuell
1
Wenn eine Umwandlung abgeschlossen ist, befindet sich der gemessene Wert in diesen beiden Registern. Von ADCH werden nur die beiden niederwertigsten Bits verwendet. Es müssen immer beide Register ausgelesen werden, und zwar immer in der Reihenfolge: ADCL, ADCH. Der effektive Messwert ergibt sich dann …
https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Analoge_Ein-_und_Ausgabe

von Thomas E. (thomase)


Lesenswert?

c.m. schrieb:
> zeig mal schaltung bitte.
>
> außerdem eventuell
Nein:
>> (1<<ADLAR);

mfg.

von Julian B. (julinho)


Lesenswert?

In ADCSRA muss der Vorteiler über die ADPS-Bits gesetzt werden oder 
woher nimmst Du die 100Khz?

Die 255 kommen daher, dass Du  das LEFTADJUST-Bit gesetzt hast, und nur 
das H-Byte ausließt, dass ja maximal 255 werden kann.

von c.m. (Gast)


Lesenswert?

Thomas Eckmann schrieb:
> c.m. schrieb:
>> zeig mal schaltung bitte.
>>
>> außerdem eventuell
> Nein:
>>> (1<<ADLAR);
>
> mfg.

dann das vielleicht:
1
The ADC has its own interrupt which can be triggered when a conversion 
2
completes. When ADC access to the data registers is prohibited between 
3
reading of ADCH and ADCL, the interrupt will trigger even if the result is
4
lost
s 113
http://www.atmel.com/images/atmel-7598_automotive-microcontrollers-attiny25-45-85_datasheet.pdf

von Thomas U. (morrie)


Angehängte Dateien:

Lesenswert?

Hallo Leute,
vielen Dank für eure schnellen Antworten.
Anbei die Schaltung. Die IR Diode wird ganz normal mit einem OP 
verstärkt und dann an den MC Eingang gelegt. Der Eingang ist nicht gegen 
Überspannung geschützt. Hätte ich das tun sollen?
Zum Auslesen des ADC: Laut Datenblatt kann man, wenn das ADLAR Bit 
gesetzt ist nur das ADCH Bit auslesen und muss das ADCL Bit gar nicht 
auslesen.

Ich habe mal noch die Übergabe des Ergebnisses aus dem Interrupt mir 
dran gehängt. Vielleicht liegt es doch daran.

Da der Sensor keinen Platz mehr für ein CS pin für die SPI Schnittstelle 
gehabt hat, habe ich es so gemacht, dass sobald der letzte 
Flankenwechsel an der CLK Schnittstelle des SPI länger als 320µs her 
ist, dann beginne ich kontinuierlich in das SPI Register neue Daten zu 
schreiben.
Der Master muss bei dem Auslesen des Sensors also nur aufpassen, dass 2 
aufeinanderfolgende Lese Operationen mind. 320µs auseinander liegen.

1
uint8_t test;
2
3
// Initialisierung der Analogen Schnittstelle
4
ADMUX |= (1<<MUX0) | (1<<MUX1) | (1<<ADLAR);
5
ADCSRA|= (1<<ADEN) | (1<<ADSC) | (1<<ADATE) | (1<<ADIE);
6
ADCSRB = 0;
7
  
8
// Initialisierung der SPI Schnittstelle 
9
USICR = (1<<USIWM0) | (1<<USICS1);  // USI Interface: 3-wire mode.
10
11
12
13
// Hauptprogramm
14
while(1)
15
{
16
  if (SpiClkZaehler >= 40) USIDR = test;
17
  USISR |= (1<<USIOIF);
18
  _delay_ms(1);
19
}
20
21
22
// ADC Interrupt
23
ISR(ADC_vect)
24
{
25
test = ADCH;
26
}

mfg Thomas

von Julian B. (julinho)


Lesenswert?

Julian Baugatz schrieb:
> In ADCSRA muss der Vorteiler über die ADPS-Bits gesetzt werden oder
> woher nimmst Du die 100Khz?

Gelesen?

von Julian B. (julinho)


Lesenswert?

Test eventuell noch als volatile deklarieren.

von Thomas U. (morrie)


Lesenswert?

Hallo julian,
Alle ADPS bits auf 0 sind Divisions Faktor 2 also maximale 
Wandlerfrequenz. Laut Datenblatt müsste die Frequenz höher sein aber ich 
habe mit dem Oszi nachgemessen und bin auf eine ADC Frequenz von 
ca.100khz gekommen (oder waren es 200khz ???)

Das mit dem volatile werde ich noch checken. Danke für die Info.

Mfg

Thomas

von spess53 (Gast)


Lesenswert?

Hi

>Laut Datenblatt müsste die Frequenz höher sein aber ich
>habe mit dem Oszi nachgemessen und bin auf eine ADC Frequenz von
>ca.100khz gekommen (oder waren es 200khz ???)

Wo hast du das gemessen? Bei dem Prescaler sind es 4MHz ADC-Takt. Also 
jenseits von Gut und Böse.

MfG Spess

von Julian B. (julinho)


Lesenswert?

Bei prescaler 2 ist die adc Frequenz aber 4 mhz, bei 8 bit Auflösung 
sollte sie aber maximal 1mhz sein.

von Thomas U. (morrie)


Lesenswert?

Das dachte ich auch. Dann habe ich im ADC Interrupt einen Pin toggeln 
lassen und bin auf 100 oder 200 khz gekommen. Ich muss nochmal 
nachmessen.
Dann habe ich auf S127 eine Conversion Time von ca. 15 Cycles gefunden. 
Wenn man das noch mit dem prescaler von 2 multipliziert dan komme ich 
auf eine maximale frequenz von etwa 260khz bei 8mhz Prozessorfrequenz. 
Dann bin ich schon wieder näher bei meinen Ergebnissen.
Dann verstehe ich aber nicht wie man überhaupt auf 1mhz 
wandlungsfrequenz kommen soll von denen im datenblatt geschrieben wird.

Das habe ehrlich gesagt nicht verstanden.

Aber ich werde die Wandlerfrequenz noch runter nehmen und dann nochmal 
testen.
Das kann ich aber erst heut Abend machen, ich muss heut auf meine Kleine 
aufpassen :-)

Thomas

von spess53 (Gast)


Lesenswert?

Hi

>Das dachte ich auch. Dann habe ich im ADC Interrupt einen Pin toggeln
>lassen und bin auf 100 oder 200 khz gekommen. Ich muss nochmal
>nachmessen.

Da bekommst du die Sample-Rate, nicht den ADC-Takt. Der ist 13 mal 
höher.

MfG Spess

von Thomas U. (morrie)


Lesenswert?

Jetzt hab ichs verstanden. Dann bleiben ja nicht mehr so viel samples/s 
übrig.

Danke für die Info. Dann werde ich das heut Abend mal testen.

Thomas

von Thomas U. (morrie)


Lesenswert?

Hallo Leute,
jetzt habe ich einiges getestet es funktioniert immer noch nicht. Ich 
habe inzwischen bei der Schaltung einen definierte Resetschaltung 
hinzugefügt.

Aber ich habe nach vielen Stunden auch einiges herausgefunden. Die SPI 
Schnittstelle funktioniert korrekt.
Die ADC Wandlung funktioniert wenn ich 0V an die Schnittstelle anlege. 
Sobald ich die Spannung erhöhe, dann Resettet mein MC permanent. Ich 
habe schon einiges gegooglet konnte aber keinen Fall finden in dem 
jemand das selbe Problem hatte.

Hat jemand von euch eine Idee warum mein MC resettet sobald eine 
Spannung >0V anliegt?

Ich habe auf jeden Fall keine Idee mehr was ich noch testen kann.

Danke,

Thomas

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.