Hi,
also ich habe jetzt folgendes Durchgeführt:
OPA2350:
Angelegte Spannung +5V
+: auf GND
-: Fotodiode BPX63. Mit 470kOhm mit Ausgang verbunden.
Out: Geht in den ADC5 des ATMega 8
Mega8:
VRef mit 100n auf Masse.
Source (z.T. geklaut von mikrocontroller.net:
Die Werte liegen zwischen 0 (bei Abdeckung) und 5 (wenn ich mit einem roten Laserpointer draufgehe). Das gefällt mir natürlich auf Anhieb noch nicht. Wie kann ich genauere Werte bekommen? (im Prinzip brauche ich float-Werte. Doch wie errechnet man die?)Code:#include <stdlib.h> #include <avr/io.h> #include <avr/iom8.h> #include <util/delay.h> #include "lcd.h" uint16_t ReadADC() { uint8_t i; uint16_t result; ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler // setzen auf 8 (1) und ADC aktivieren (1) ADMUX = 0b0101; // Kanal waehlen ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */ ADCSRA |= (1<<ADSC); // eine ADC-Wandlung while ( ADCSRA & (1<<ADSC) ) { ; // auf Abschluss der Konvertierung warten } result = ADCW; // ADCW muss einmal gelesen werden, // sonst wird Ergebnis der nächsten Wandlung // nicht übernommen. /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */ result = 0; for( i=0; i<4; i++ ) { ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion" while ( ADCSRA & (1<<ADSC) ) { ; // auf Abschluss der Konvertierung warten } result += ADCW; // Wandlungsergebnisse aufaddieren } ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2) result /= 4; // Summe durch vier teilen = arithm. Mittelwert return result; } int main(void) { uint16_t ADVal; char* str; lcd_init(LCD_DISP_ON); lcd_clrscr(); lcd_puts("bitte warten..."); for (;;){ ADVal = ((ReadADC()*5)/1023); sprintf(str, "Wert: %d", ADVal); lcd_clrscr(); lcd_puts(str); _delay_ms(500); } return 0; }
Viele Grüße,
Simon






Zitieren

Lesezeichen