
Goniometer mit AT13
In der Bastelkiste sind viele Led's, aber wie verhalten sie sich?
Das will man doch gerne wissen und eine kleine Versuchsanordnung kann dabei
helfen das herauszufinden. Damit kann man die Intensität der Led in verschiedenen
Winkeln messen. Man braucht eine LED (das Versuchsobjekt), einen Servo der
das Ganze dreht und einen LDR oder eine BPW34 als Lichtempfänger. Ein
AT13 steuert den Servo, digitalisiert die LED bzw. LDR-Daten und sendet sie
über die serielle Schnittstelle an den Laptop, mit Hilfe eines USB-seriell-Wandlers.

Die Versuchsanordnung, schnell aufgebaut auf einem Brett (Brettboard)
Dann gibt es folgendes Messergebnis, z.B für eine red diffused LED:

Links ist die Intensität und unten der Raumwinkel aufgetragen, relative
Messungen.
Das Programm im AT13 testet zunächst den Servo von links nach rechts,
dann fährt der Servo auf die Mitte und sendet Daten über die Schnittstelle.,
z. B. 555, 356. Ein Terminalprogramm mit 9600,8,N,1 kann das lesen. Jetzt
kann man auf Maximum justieren. Nach einem Druck auf den Taster geht es zur
Messung von links nach rechts und die Messdaten werden übertragen, dann
bleibt der Servo stehen und die Datenübertragung endet. Jetzt sollte
man die Daten aus dem Terminalprogramm in ein spreadsheet kopieren und dort
auswerten. Hier in Openoffice mit einer XY Anzeige.
Nun ist es Zeit, eine neue LED einzusetzen. Ein weiterer Druck auf den Taster
fährt den Servo auf die Mitte zum Justieren, noch einmal und es startet
dann die nächste Messung. Die LED wird von einem variablen Labornetzteil
versorgt, so kann man dann jeweils 20 mA für die LED einstellen.
Die Pulsbreite für den Servo war, jedenfalls bei meinem AT13, von der
Clockfrequenz abhängig, am Besten ging AT13 mit 9.6 MHz. Ebenso muss
der Wert für den Servo Const Svmin = 60 und Const Svmax = 140 wohl angepasst
werden. Der Timer Interrupt für den Servo feuert alle 10 us, daher muss
man den Interrupt vor der Datenübertragung abschalten, sonst geht es
nicht sauber (kleine Falle).

Der Schaltplan, die Widerstände sind nur zur Sicherheit, kann man auch
weglassen. Drossel zum Entstören in Servo plus.


Das Brettboard mit der Schaltung
Hier nochmal die Versuchsanordnung von oben. Der LDR ist in einem Tischtennisball,
etwas wie eine Ulbricht Kugel für diffuse Lichtverteilung.

... und ein paar Messergebnisse:

blue clear LED, recht hell und kleiner Winkel

red clear led, zwei peaks, liegt wohl an der Linse der led
Man kann auch LDR und Led vertauschen, dann erhält man die in Datenblättern
angegebene Relative Radiant Sensitivity vs. Angular Displacement für
den LDR. Es ist auch möglich, einen Korrekturfaktor für die spektrale
Empfindlichkeit des LDR zu berücksichtigen (falls bekannt), dann werden
die Ergebnisse vergleichbarer. Hier ist es eben quick and dirty, aber man
sieht wie es geht. Viel Spass beim Basteln und Verbesserungen sind willkommen.
Literatur:
Datasheet AT13, Atmel.com
Download:
Gonio3.zip
'Goniometer detector with LDR or BPW34
'
'measures LED brightness vs angle
'servo turns LED 0 to 180 degrees
'
'ADC channel 3: +5V -LDR- PB3 -10k- -GND
'
'***************************************************************************
'
' Pinout ATtiny13/ATtiny13V 8-PDIP/SOIC
'
' (PCINT5/RESET/ADC0/dW) PB5 VCC
' (PCINT3/CLKI/ADC3) PB3 PB2 (SCK/ADC1/T0/PCINT2)
' (PCINT4/ADC2) PB4 PB1 (MISO/AIN1/OC0B/INT0/PCINT1)
'
GND PB0 (MOSI/AIN0/OC0A/PCINT0)
'
'***************************************************************************
' PB0 input Pushbutton
' PB1 output blink
' PB2 output Servo
' PB4 output COM1
' PB3 input ADC channel 3, connect LDR or BPW34
'***************************************************************************
$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 8
$swstack = 8
$framesize = 4
Const Svmin = 60
Const Svmax = 140
Const Svnull = 100
Const
Channel =
3
'ADC
Pushbutton Alias Pinb.0
Dim I As Byte , J As Byte
Dim Svpos As Byte
Dim W As Word , Avglight As Word
Portb = &B00000001
Ddrb = &B00010110
$asm
'turn on 9.6 MHz CLK
ldi R24,
&B10000000
'prescale en
Out Clkpr , R24
ldi R24,
&B00000000
'prescale 1
Out Clkpr , R24
$end Asm
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Didr0.adc3d = 1
Start Adc
Config Servos = 1 , Servo1 = Portb.2 , Reload = 10
'Acsr.acd
=
0
' switch off analog comparator
Open "comb.4:9600,8,n,1,INVERTED" For Output As #1
Enable Interrupts
For
I = Svmin To
Svmax
'test servo
Servo(1) = I
Waitms 30
Next
Do
'main loop
Servo(1) =
Svnull
' go to mid pos
Goagain:
' time to adjust
Avglight = Getadc(channel)
Toggle Portb.1
Disable Interrupts
Print
#1 , "555," ;
Avglight
'send data
Enable Interrupts
Waitms 100
If
Pushbutton = 1
Then
'push to continue
Goto Goagain
End
If
'check pin
Servo(1) =
Svmin
' go to start pos
Waitms 10
For I = Svmin To
Svmax
'test
Servo(1) = I
Waitms 100
Avglight = 0
For J = 1 To 4
W = Getadc(channel)
Avglight = Avglight + W
Next J
Shift Avglight , Right , 2
Disable Interrupts
Print #1 , I ; "," ;
Avglight
'send data
Enable Interrupts
Next I
Waitmore:
'done, now wait
If Pushbutton = 1
Then
'for pushbutton
Goto Waitmore
End
If
'check pin
Waithigh:
'done, now wait
If Pushbutton = 0
Then
'for pushbutton
Goto Waithigh
End
If
'check pin
Loop
'main loop again
End
Elektronik-Labor Projekte AVR