Goniometer mit AT13           

von Gerd Sinning                       
Elektronik-Labor   Projekte   AVR 

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