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
:
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;
}
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?)
Viele Grüße,
Simon
Lesezeichen