naja wie gesagt, das ist ja keine "normale LED"...
Druckbare Version
naja wie gesagt, das ist ja keine "normale LED"...
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
Okay, bin etwas weitergekommen. Ausgabe erfolgt jetzt mit Float-Werten.
Mir ist aufgefallen, dass die Werte jetzt bei 0..4,995 liegen und sehr schwanken. Ich habe einen 68nF Kondensator parallel zum Widerstand geschaltet und jetzt schwanken die Werte nicht mehr so sehr...
Die LED betreibe ich an 5V mit 68Ohm Vorwiederstand (58 errechnet). Natürlich bringt das mit der Photodiode einen Vollausschlag in meinen ADC. Ich versuche dann jetzt empirisch einen Vorwiderstand für die Photodiode zu ermitteln
Gut, mit Vorwiderständen 68k+12k = 80k liege ich im Wertebereich von 0..4,85V. Müsste so ziemlich das genaueste sein :-)
Dann puste mal Rauch hinein, oder gesünder, wenn Du zwei Polarisatoren hast dann kannst Du ja auch eine Kennlinie über dem Drehwinkel aufnehmen.
Manfred
hehe funktioniert jetzt ganz gut. Habe die Werte auch in's verhältnis gesetzt, sieht jetzt ganz schön aus :)
Danke für deine Hilfe Manf :-) Geht ja richtig zackig, wenn man weiß wo man drauf schauen muss :)
Freut mich, gib doch mal ein paar Werte an.
Meinst Du dass Du auch das mit den Polarisatoren schaffst?
Manfred
Hi Manf,
ja bis jetzt ist aber alles noch so Beta-Status. Ich habe gerade das Problem, dass ich in die erste Zeile Schreiben will "Abs.:"
In die zweite soll dann der Wert rein, aber das funktioniert nicht, weil jedesmal wenn ich versuche auf die 2. Zeile zuzugrifen fällt das Display aus.
Ich kann mir das im Moment absolut nicht erklären
Mein Beispiel-Code sieht jetzt mal so aus:
Wenn ich das for (;;) {} auskommentiere, dann flackert zwar das Display wie blöd, aber es wird alles angezeigt. Sobald das for drin ist, ist die 2. Zeile schwarz oder das Display geht ganz aus. Was soll das denn?Code:char Abs[8];
float Blank;
lcd_init(LCD_DISP_ON);
lcd_clrscr();
lcd_puts("bitte warten...\n");
lcd_puts("bitte warten2..");
for (;;){}
Hi,
so habe heute mal mein eigenes Testboard geätzt (die Lochrasterplatten gingen mir auf die Nerven wegen so hoher Störanfälligkeit) und mein Display angeschlossen. Funktioniert einwandfrei. Werde dann morgen den Rest anschließen und ein paar Messungen durchführen. Da ich kein Rauch habe und selbst auch nicht rauche muss es wohl reichen, wenn ich Werte angebe, die durch das Hineinschieben von einem Blatt Papier in den Strahlengang entstanden sind, oder ähnliches.
@Manf: kannst die Private Nachricht ignorieren. Was meintest du da eigetlich mit diesen Polarisatoren und Kennlinien? Was ist das?