Lichtsensor über Getadc

Neuuser

Mitglied
11. Aug. 2008
465
0
16
Sprachen
Hallo Leute,
kennt einer ein Lichtsensor den Mann über Getadc auslesen kann ?

Gruß Neuuser
 
Hallo Neuuser,

Anfrage bzgl. "GETADC" ist auf BASCOM gemünzt. Richtig?

Was hältst Du von einem Lichtsensor der dem "Mann" in Abhängigkeit von Lich entsprechende Spannungswerte liefert?
Habe hier einiges bei TAOS gefunden. Setzte selbst einen solchen zur Lichtmessung ein.

Oder magst Du lieber basteln und einen Sensor verwenden der einen Strom liefert den Du über einen I/U-Konverter zum ADC gibst und auswertest?

Oder magst Du lieber .....

Sach mal lieber was Du genau vor hast, versorge uns mal a bissle mit Hintergrundinfos und dann kann man das Thema näher betrachten.

Grüße,
Ma
 
Hallo Markus,
da bist du ja wieder, es ist immernoch das Projekt was ich angefangen habe um meine Pumpe im Sommer zu steuern.
Habe mich nun schon etwas weiter entwickelt und die Ausmessung der Batterie, die Temperatur und nun habe ich ein Fotowiederstand mit ein Poti verwendet, die werte konnte ich dann nehmen zum schalten.
Soweit scheint alles zu funktionieren aber die Temperatur schwankt sekündlich um 7 stellen nach dem Komma.
alles schon durchgeschaut weiß aber nicht woran es liegt, denke aber es ist das Board.
Nun fehlt immernoch eine Zeiteinstellung um die Temperatur nur jede 5 Minuten an zu zeigen, ich denke das geht mit ein Interupt am besten, oder ?

Gruß Neuuser
 
Hallo Neuuser,

ich war doch garnicht weg oder habe ich was versäumt :)

Auf welchem Weg erfasst Du die Temperatur bzw. besser gefragt, welchen Sensor verwendest Du? Hmmmm, sorry für die Frage aber entweder hast Du mir das noch nicht verraten oder ich habe es in der Zwischenzeit schon wieder vergessen.
Egal, ich frag halt nochmals :eek:

Und wenn ich grad beim fragen binn dann verrate mir doch noch welches Board (Fertigbau oder Marke-Eigenbau). Für die Analyse der Temperaturschwankungen wäre ein Schaltplan oder Schaltplanauszug hilfreich. Oft bewirken ein paar unterschiedliche C's an den richtigen Stellen gleich Wunder. Dazu brauchen wir aber mehr Infos von Dir!

Nun ja und dann war da noch Deine Frage mit 5 Minuten & Co. Das ganze ist natürlich Geschmacksache aber folgender Gedankengang dazu:

Du wirst keinen Timer finden der Dir bei welchem Clock auch immer erst nach 5 Minuten einen Interrupt auslöst. Also musst Du mit Hilfsmitteln arbeiten. Z.B. Timer so konfig. das er alle Sekunde interrupted, Variable hochzählen und bei 300 die Temp anzeigen. Kann man machen. Aber....

Ich hatte Dir - soweit ich mich erinnern kann - in einer antwort von sectic erzählt. Du verwendest Doch in Deiner Software immer noch
Code:
CONFIG CLOCK
oder?

Dann schau Dir bitte in der BASCOM-Hilfe nochmals folgendes an:

Action
Configures the timer to be used for the TIME$ and DATE$ variables.

Syntax
CONFIG CLOCK = soft | USER [, GOSUB = SECTIC]

Remarks
Soft
Use SOFT for using the software based clock routines. Use USER to write/use your own code in combination with an I2C clock chip for example.
Sectic
This option allows to jump to a user routine with the label sectic.

Since the interrupt occurs every second you may handle various tasks in the sectic label. It is important that you use the name SECTIC and that you return with a RETURN statement from this label.

The usage of the optional SECTIC routine will use 30 bytes of the hardware stack. This option only works with the SOFT clock mode. It does not work in USER mode.

Da hast Du nämlich dann schon alles fertig mit bei! SECTIC kommt jede Sekunde, Du zählst bis 300 und zeigst die Temp an.

Nochmal was bzw. folgende Idee:
Erfasse jede Sekunde Deine Temperatur und addiere die Werte in single oder double Variable und bevor Du die Temperatur anzeigen möchtest teile den Wert einfach durch 300. 300 Messwerte geteilt durch 300 ergibt eine schöne über 5 Minuten gemittelte Temperatur. Oder nehme halt nur 60 Messwerte oder was auch immmer. Damit bekommst Du außerdem Schwankungen weg,
also los :eating:

Grüße,
Ma
 
Hi Markus,
nee, wech warst du bestimmt nicht und verpasst hatte auch nichts;)
Das sind ja schöne Sachen die du mir hier vor legst, hm also mit clock die Sache realisieren, wenn nicht immer das lästige englich wäre :D muss erst wieder verstehen wie clock mit sectic arbeitet wie beim getadc, dann ist alles nicht mehr schwer.
Erfasse jede Sekunde Deine Temperatur und addiere die Werte in single oder double Variable und bevor Du die Temperatur anzeigen möchtest teile den Wert einfach durch 300. 300 Messwerte geteilt durch 300 ergibt eine schöne über 5 Minuten gemittelte Temperatur. Oder nehme halt nur 60 Messwerte oder was auch immmer. Damit bekommst Du außerdem Schwankungen weg,
also los
hört sich gut an, hast du da irgendwo ein Beispiel, dann verstehe ich es leichter.

Das Board ist eine Vorlage von Roland Walter, ich hoffe du kennst es wen nicht kann ich ja mal ein Bild hoch schieben und hier meine soft.

Code:
'Mega8 intern 1Mhz
'KTY81-120 Temperaturfühler


$regfile = "m8def.dat"
$crystal = 1000000                                          'Externes Quarz    Mhz

$framesize = 128
$hwstack = 40
$swstack = 30

Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.1 , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5
Config Lcd = 20 * 2
Initlcd
Cursor Off
Cls

Config Portb = Output
Deflcdchar 0 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32            ' LCD-Sonderzeichen


Dim W0 As Word
Dim W1 As Word
Dim W2 As Word
Dim Volt As Single
Dim Licht As Single
Dim V As Single

Const Adc_multi = 0.004887585533
Const Refer = 2.0572                                        '1.1593 Fühler Konstante bei 0°C
Config Adc = Single , Prescaler = Auto , Reference = Avcc   ' interen 5V

Ddrc.0 = 0                                                  'AD Eingang für Mess
Ddrc.1 = 0                                                  'AD Eingang für Temp
Ddrc.2 = 0                                                  'AD Eingang für Licht
Ddrd.5 = 1
Relais Alias Portd.5                                        'Ausgang für Untersp.

Do
Start Adc
 W0 = Getadc(0)                                             ' auslesen des Span ADC0
 W1 = Getadc(1)                                             ' auslesen des Temp ADC1
 W2 = Getadc(2)                                             ' auslesen des Licht ADC2
Stop Adc

 Volt = W0 * Adc_multi                                      '5/1023 = 0.0048 Volt 10 Bit AD converter
 Volt = Volt * 2.73                                         '2,73 Faktor vom Spannungsteiler
 Volt = W0 * 0.014298

 Licht = W2

 V = W1 * Adc_multi                                         '5/1023 = 0.0048 Volt 10 Bit AD converter
 V = V - Refer
 V = V / 0.0077125                                          ' 0.0077125 fühler konstante pro grad °C
 V = V + 2                                                  '2te möglichkeit den fühler abzugleichen


If Volt > 12.8 And Licht > 900 And Relais = 0 Then Relais = 1
If Volt < 11.0 Then Relais = 0                              'Relais schaltet ab
If Licht < 850 Then Relais = 0                              '0-1023 bereich Relais schaltet ab

'------- LCD ANZEIGE-----------------------------------------------------------

 Locate 1 , 1
 Lcd "Volt= " ; Fusing(volt , "##.##")
 Waitms 100

 If Volt < 11.0 Then                                        ' ANZEIGE am LCD= voll oder leer
     Locate 2 , 1
     Lcd "Accu Leer"
     Else
  End If

  If Volt > 13.5 Then
     Locate 2 , 1
     Lcd "Accu Voll"
  Else
  End If

  Locate 1 , 14
 Lcd Fusing(v , "#.#") ; Chr(0) ; "C"                       ' ANZEIGE am LCD= Temperatur
 Wait 1
 'anzeige nur bei W0-W2

 'Locate 2 , 12
 'Lcd W0
 'Locate 2 , 16
 'Lcd W2
Loop
End
und der Plan
ansch2.gif


Gruß Neuuser
 
Hi Neuuser,

möchte kurz auf das Thema mit Deinen springenden Temperaturwerten eingehen. Also C's sind hier nicht möglich da Du einen simplen PTC als Temperaturmesser verwendest. Das hat aber noch lange nichts zu bedeuten:D

Der Linearitätsfehler des PTC dürfte im Temperaturbereich (0°C..+100°C) bei unter 1 Grad liegen. Man müsste nun nochmals einen Blick in die Auflösung und Genauigkeit des ADC's werfen aber vermutlich wird der ADC an der Grenze seiner Auflösung betrieben.
Du solltest die Sensorspannung einfach mehrfach messen, und dann aus diesen Messungen mittels Division der Summen den Durchschnitt berechnen. Auf diese Weise bekommst Du ein stabileres Messergebnis.
Ich vermute das Zappeln kommt durch das Quantisierungsrauschen des ADC's.

Die Beschaltung des PIN's AVCC ist auf jeden Fall gold richtig. Die Induktivität und die Kapazität bilden zusammen eine Art "Geräuschreduktion" wie sie auch als Referenz im Datenblatt zu den Megas abgebildet ist. Gut so!

Ach ja,noch was....
Ein Beispiel für Deine 300 Messergebnisse und Sekunden habe ich nicht. Aber das ist doch auch ganz einfach:

- Jede Sekunde in Sektic eine Variable COUNTER um 1 erhöhen.
- In der Hauptschleife COUNTER auf 300 (für 5 Minuten da 60x5=300) prüfen
- Wenn COUNTER = 300 dann Temperatur berechnen und ausgeben und temp auf NULL setzen.

So alles andere ist leidenschaft. Z.B. in SECTIC oder via Flag in der Hauptschleife (hängt von der Performance ab) einmal Temperatur aus ADC lesen und in Variable addieren z.B. temp = temp + neuer_adc_wert.

In 300 Sekunden sammeln sich dann 300 gesampelte ud aufaddierte Temperaturwerte an. Wenn die die so addierte Zahl durch 300 Teils bekommst Du einen Durchschnittswert / Mittelwert der Temperatur und damit deutlich mehr Ruhe in Dein Messergebnis.

Aberdas ist nur ein Beispiel von sehr vielen möglichen Lösungsansätzen. Du kannst auch 10x oder 20x hintereinander die Temperatur "ADCn" und dann den Mittelwert bilden.

Was meinst Du, kommst Du damit zurecht?

Grüße,
Ma
 
Hallo zusammen,

Man müsste nun nochmals einen Blick in die Auflösung und Genauigkeit des ADC's werfen aber vermutlich wird der ADC an der Grenze seiner Auflösung betrieben.

die Schwirkigkeit ein "sauberes" Messergebnis zu erhalten liegt auch daran, da man nicht den gesamten möglichen Eingangsspannungsbereich des ADC in dem zu messenden Temperaturbereich ausnutzt. Um eine möglichst gute Auflösung der Temperatur zu erhalten, muss man dann auch volle 10Bit des ADC ausnutzen. Störgrößen von aussen beeinflussen dann natürlich das Ergebnis eher, der ADC hat selbst auch Nichtlinearitätsfehler und Offsetfehler.

Du solltest die Sensorspannung einfach mehrfach messen, und dann aus diesen Messungen mittels Division der Summen den Durchschnitt berechnen. Auf diese Weise bekommst Du ein stabileres Messergebnis.
Ich vermute das Zappeln kommt durch das Quantisierungsrauschen des ADC's.

Das ist sinnvoll. Um den Mikrocontroller nicht zu sehr mit der Division zu beschäftigen, bietet es sich an 2 hoch n Messungen zu summieren und das Endergebnis dann n mal bitweise nach rechts zu shiften. In Bascom gibt es bestimmt einen entprechenden Shift Befehl (man könnte zum Beispiel 8 mal summieren und danach 3 mal shiften).

Noch ein Tipp: Man sollte während der Messung am Port, an dem der ADC-Multiplexer angeschlossen ist, nichts schalten. Dies kann auch das Messergebnis beeinflussen.

Grüße,
Dirk
 
Hallo Miteinander,
nun ja das Prinzip habe ich verstanden, die Messergebnisse sammeln und durch die Zeit teilen für ein Ergebnis,
aber ich weiß nicht wie ich es anfangen soll.
Daher fragte ich nach ein ähnliches Beispiel, wen ich es sehe lerne ich daraus.

Gruß Neuuser
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)