PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : BASCOM Temperaturauswertung mittels A/D Wadler



Digsta
05.05.2007, 15:33
Hallo zusammen,

ich möchte mittels eines Atmega8 einen Infrarottemperatursensor auswerten.
Der Sensor liefert mir eine Spannung von 0-5V.

Ich habe aber noch nie den A/D Wandler im Atmega8 benutzt und habe überhaupt keine Ahnung wie man den programmiert.

Kann mir bitte einer helfen.

Ich will ab einer bestimmten Spannung ( 2,601V) eine LED aufleuchten lassen,
wenn die Spannung dann steigt (ab 3,421V) die selbe LED blinken lassen, und wenn die Spannung dann noch weiter steigt (ab 3,734V), will ich eine 2 Led anschalten.
Wenn ihr meint die Schritte sind zu gering kann man den mittleren Schritt auch wegfallen lassen!

Es wäre super nett wenn mir einer bei der Programmierung und der verdrahtung Tips geben könnte.

Vielen Dank!
Und einen sonnigen Tag
O:)

Vitis
05.05.2007, 15:46
Hi Digsta,

die Anforderungen an den AD sind nicht zu hoch, die Schritte sind
ewig weit auseinander für den AD.
Rechnen wir mal,

also 0-5V ist prima, weil der Mega8 schön mit 5V betriben werden kann,
die Referenzspannung kann dann auch schön 5V sein.
Der AD hat eine Auflösung von 10 Bit, sprich von 0 bis Vollausschlag
währen es dann 2^10 Abstufungen, also 1023 währe dann 5V
am AD-Eingang.
Daraus ergibt sich eine Abstufung von 0,0048V je Digit,
also rund 4,8mV je Digit.

Digsta
05.05.2007, 15:51
Vielen Dank

Für die schnelle Antwort!

Das ist ja schon einmal gut zu hören. Jetzt brauche ich nur paar Tips zur Programmierung und zur Verdrahtung.

Vielen Dank noch einmal!

Gruss

Vitis
05.05.2007, 16:01
Programmierung ist per Bascom supereinfach.

erstmal:
config ADC etc.

dann:
getadc(x)
und schon haste den Wert, schau mal in die Bascomhilfe unter
Config ADC oder Getadc.

Verdrahtung ist einfach, AREF auf 5V und n paar 100nF Kondensatoren
an die Pins des µC für Spannungsversorgung um die Betriebsspannung
schön stabil zu halten.
Betriebsspannung am einfachsten auf 5V einregeln über Linearregler 7805
und fertig ist der Lack.

Digsta
05.05.2007, 21:54
Hallo Vitis

Ok das mir der Verdrahtung hab ich dann wohl geschafft!

Danke für die Tips aber mit dem Prog komm ich nicht wirklich weiter, hättest du etwas Zeit mir das genauer zu beschreiben.
Ich habe schon im Roland Walter AVR nachgelesen aber ich scheine das irgenwie nicht zu verstehen.

Sorry für die Frage !

Vielen Dank.

Vitis
06.05.2007, 11:39
ja, der Rowalt ist beim AD-Wandler n bissl zu schnell.
Ich finde es gut, dass er für die Meisten Funktionen nicht
die Bascom Highlevelbefehle verwendet, sondern die
Registeraktion, weil das eben immer funktioniert, auch
bei Bausteinen die nicht ganz alltäglich sind oder für
Funktionen, die eben irgendwie "ausser der Norm" sind,
aber für den Einstieg machen die Registeraktionen eben
das Leben etwas schwerer.
Bascom hat für den AD-Wandler nen bestimmten Befehlssatz.


in der Bascom Hilfe ist n einfaches Beispiel für die Verwendung
des internen ADC drin :



Config Adc = Single , Prescaler = Auto
'Now give power to the chip
Start Adc

'With STOP ADC, you can remove the power from the chip
'Stop Adc

Dim W As Word , Channel As Byte

Channel = 0
'now read A/D value from channel 0 to 7
Do
W = Getadc(channel)
Print "Channel " ; Channel ; " value " ; W
Incr Channel
If Channel > 7 Then Channel = 0
Loop
End

meldano
06.05.2007, 12:07
Also ich bin auch absoluter Einsteiger und kann das Buch von Roland Walter nur Empfehlen.

Hier mal ein ADC Beispiel für einen Tiny45:

'############ADC ################################################## #############

On Adc Onadc 'Interrupt für Adc Wert

Admux = &B00100010
' ^^-----------------Voltage Reference:00=Vcc
' ^----------------Left Adjust
' ^---------------Not Used
' ^^^^-----------Analog Channel:0010=ADC2 PB4

Adcsra = &B11111110
' ^-----------------Adc Enable
' ^----------------Adc Start Conversion
' ^---------------Adc Auto Trigger Enable
' ^--------------Adc Interrupt Flag
' ^-------------Adc Interrupt Enable
' ^^^----------Adc Prescaler Select Bits
'### Hauptschleife ##################################################
Dim Akku_low As Bit
Dim Analog As Word
Do

Loop
'### Analog Digital Converter ##################################################
Onadc: ' Interrupt ADC
Analog = Adch 'ADC Wert an Variable übergeben
If Analog < 15 Then
Akku_low = 1 'Akku_low Bit bilden
End If
If Analog > 20 Then
Akku_low = 0
End If
Return



Wenn der ADC Kanal einen neuen Wert empfängt, wird der Interrupt
ausgelöst, dort wird das Akku_Low Bit gebildet und kann in der Hauptschleife verarbeitet werden. Die Register Admux und Adcsra musst du auf deinen Controller bzw. verwendeten ADC Eingang anpassen.
Keine Angst vorm Datenblatt es ist sehr einfach die Register zu schreiben. Ich selbst benutze lieber die Register als Highlevelbefehle.


Gruß
Daniel

Digsta
07.05.2007, 06:41
Guten morgen,

noch einmal Danke für die Ideen, ich habe mal ein Programm geschrieben, weiss aber nicht ob es funktioniert, denn erstens scheint mein Sensor nicht so richtig zu arbeiten und 2 habe ich ein Problem, ich habe gelesen das der Pin 5 nur max 8 Bit beim A/D Wandler hat aber es funktioniert nur wenn ich es mit 10 Bit rechne, hier mal mein Code.
Sagt m,ir bitte was ihr davon haltet!
Die Led habe ich nur als Test erstmal geschaltet, damit ich verfolgen kann bei welchem Wert der Sensor gerade ist.


$regfile = "m8def.dat"
$crystal = 1000000
$baud = 9600

Ddrc = &B00000000

Dim Tempwert As Long

Config Pinb.2 = Output 'Rote LED
Led_red Alias Portb.2
Config Pinb.1 = Output 'Grüne LED
Led_green Alias Portb.1


Config Adc = Single , Prescaler = Auto

Do
Start Adc
Tempwert = Getadc(5)
If Tempwert < 541 Then 'entspricht 2,601V
Set Led_green
Set Led_red
Waitms 250
Reset Led_green
Reset Led_red
Waitms 250
Else
If Tempwert < 651 Then 'entspricht 3,128V
Set Led_green
Reset Led_red
Else
If Tempwert < 777 Then 'entspricht 3,734V
Reset Led_red
Set Led_green
Waitms 250
Reset Led_green
Waitms 250
Else
If Tempwert > 777 Then
Reset Led_green
Set Led_red
End If
End If
End If
End If
Loop