Hallo zusammen,
habe hier im Forum und im tutorial schon viele hilfreiche sachen
gefunden.
Anscheinend bin ich aber zu blöd den ADC meines Atmega8 richtig zu
verwenden.
Als rückgabewert meiner Funktion bekomme ich immer 0 egal in welcher art
ich es bis jetzt getestet habe.Den Wert lese ich über I²C aus. Das
funktioniert auch wunderbar mit anderen werten die ich von meinem
Foxboard G20 (I²C Maser) sende oder anfordere (z.B. PWM sollwert etc.).
Eventuell ist auch meine Verschaltung falsch?? Ich habe RN-VN2 DualMotor
board und will die Chiptemperatur einlesen. Diese gibt einen
Spannungswert zwischen 0 und 2,5V auf den ich auf Pin PC2 anlege. Als
Referenzspannung möchte ich die internen 2,56v benutzen.Da mir 8bit
genauigkeit dafür reichen und diese über den I²C auch leichter zu senden
sind habe ich mich für linksbündige anordnung entschieden und lese nur
das ADCH register aus.
Mein Atmega8 läft mit 8Mhz
Anbei noch meine beiden Funktionen:
void adc_init(void)
{
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1); // ADC einschalten
prescaler 64
ADMUX = (1<<REFS1) | (1<<REFS0) | (1<<MUX2) | (1<<ADLAR); //Interne
Referenzspannung, messen von PC2, linksbündige anordnung
/* Dummy-Readout des ersten Wertes */
ADCSRA |= (1<<ADSC);
while (ADCSRA & (1<<ADSC)) //auf Abschluss der Konvertierung warten
{
;
}
}
uint8_t read_channel(uint8_t no_samples)
{
int result = 0;
unsigned int i;
for (i=0; i < no_samples; i++)
{
ADCSRA |= (1<<ADSC); //einfache Konvertierung
while (ADCSRA & (1<<ADSC)) //auf Abschluss der Konvertierung warten
{
;
}
result += ADCH;
}
result /= no_samples;
return (uint8_t) result;
}
Ich bin für jede Hilfe dankbar.
MfG
Striker1985
Würde mal sagen des 1<<MUX1 sein sollte.
Danke für dein Antwort Hubert, du hast recht ich habe mich da anscheinend im Datenblatt vertan. Leider ändert das nichts das selbe Problem besteht weiterhin :-( . Zur Information ich möchte später an PC0-PC2 den DAC verwenden und es liegen auch schon an den pins die Spannungen an nur möchte ich es erst mal an einem Pin funktionierend haben. MfG Striker1985
Gast
#2258379
Probier mal, zuerst das low-byte (ADCL) und dann das high-byte (ADCH) auszulesen. Das low-byte kannst du ja danach verwerfen.
Gast
#2258907
Sebastian Kerber schrieb: > int result = 0; Probier mal uint statt int. Wieviele samples machst du? Mit MUX2 mißt du an PC4 und nicht PC2 Sebastian Kerber schrieb: > Mein Atmega8 läft mit 8Mhz Sicher?
Gast
#2258916
rudi schrieb: > Probier mal, zuerst das low-byte (ADCL) und dann das high-byte (ADCH) > auszulesen. Das low-byte kannst du ja danach verwerfen. Was soll das bringen? Im DS steht: When ADCL is read, the ADC Data Register is not updated until ADCH is read. Consequently, if the result is left adjusted and no more than 8-bit precision is required, it is sufficient to read ADCH.
Es könnte auch noch andere Gründe haben warum es nicht funktioniert. Wie sieht die Hardware aus, AVCC mit VCC verbunden, Kondensator an AREF ?
Danke für die vielen Antworten. Lutz schrieb: > Sebastian Kerber schrieb: >> int result = 0; > > Probier mal uint statt int. leider selbes Ergebnis > Wieviele samples machst du? Momentan mache ich 5 samples > Mit MUX2 mißt du an PC4 und nicht PC2 Das mit dem Mux hab ich behoben. Hatte mich wie gesagt vertan. > > Sebastian Kerber schrieb: >> Mein Atmega8 läft mit 8Mhz > > Sicher? Naja was heist sicher... Ich habe einen externen 8Mhz Quarz angeschlossen und die PWM läuft ja auch wie sie soll. Michael schrieb: > rudi schrieb: >> Probier mal, zuerst das low-byte (ADCL) und dann das high-byte (ADCH) >> auszulesen. Das low-byte kannst du ja danach verwerfen. > > Was soll das bringen? > > Im DS steht: > When ADCL is read, the ADC Data Register is not updated until ADCH is > read. Consequently, if the result is left adjusted and no more than > 8-bit precision is required, it is sufficient to read ADCH. Ja genau deswegen lese ich ja so aus. Hubert G. schrieb: > Es könnte auch noch andere Gründe haben warum es nicht funktioniert. > Wie sieht die Hardware aus, AVCC mit VCC verbunden, Kondensator an AREF > ? AVCC und VCC sind auf meinem Pollin Evaluationsboard direkt verbunden. Zwischen AREF und GND habe ich einen 100nF Keramikkondensator angeschlossen ansonsten liegen nur die Spannungen an PC0-PC2. Diese habe ich auch mit dem Multimeter schon nachgemessen. MfG Striker1985
Gast
#2259122
Spannung an AREF nachgemessen?
Tim schrieb: > Spannung an AREF nachgemessen? Ja habe ich gerade gemacht, da messe ich nur 440mV. Wenn ich den Kondensator entferne schwankt die Spannung sehr stark zwischen 200mV und 800mV. komischerweise funktioniert der ADC mit diesem Programm das ich beim googeln gefunden habe. Messwerte sind die selben an AREF.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
finde nur keine Unterschiede im setzen der Register MfG Striker1985
Ok Kommando zurück. Er funktioniert auch mit diesem programm nicht richtig, aber zumindest bekomme ich nicht immer 0 zurück. Als ich zum testen mal die Leitung zu PC2 gekappt hab hat er mir als Rückgabewert zahlen zwischen 100 und 180 gebracht. Wenn ich die Leitung angeschlossen habe sind die werte ziemlich genau die selben wie die ich durch das messen mit dem Multimeter erwartet habe. Ist das normal? MfG Striker1985
Gast
#2259160
>Als ich zum >testen mal die Leitung zu PC2 gekappt hab hat er mir als Rückgabewert >zahlen zwischen 100 und 180 gebracht. Ist doch OK. Wenn Das Pin in der Luft hängt, bekommst du durch Störeinflüsse alle möglichen werte.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.