Interne Referenz lesen

ATMega-Controller in BASIC programmieren

Interne Referenz lesen

Postby burkhard » Mon Oct 27, 2014 9:23 am

Nachtrag zur Folge 3:
Das ursprüngliche Programm sollte durch Messen der internen 1,1-V-Referenz die eigene Betriebsspannung ermitteln, was auch gut funktioniert hat.

'----------------------------------------
'UNO_AD3.BAS Vcc / 1.1 V
'----------------------------------------
$regfile = "m328pdef.dat"
$crystal = 16000000
$baud = 9600

Dim D As Word
Dim U As Single

Config Adc = Single , Prescaler = 64 , Reference = Avcc

Do
D = Getadc(14) 'Ref 1.1 V
U = 1023 / D
U = U * 1.1
Print "Vcc = ";
Print U ; " V"
Waitms 1000
Loop


Fritz Prenninger stellte folgendes Problem mit dem Lesen der internen Referenz (ADC14) fest: Wenn im gleichen Programm ADC0 gelesen wird ändert sich der gelesene Wert aus ADC14.


'----------------------------------------
'UNO_AD3_1a.BAS Vcc / 1.1
V
'----------------------------------------
$regfile =
"m328pdef.dat"
$crystal = 16000000
$baud = 9600

Dim D As
Word
Dim U As Single

Dim E As Word
Dim V As Single

Config
Adc = Single , Prescaler = 64 , Reference = Avcc ' 5,0V

Do
'E = Getadc(0)
V = E * 5.0
V = V / 1023
Print V ; " V"
Waitms 3000

D = Getadc(14) 'Ref 1.1 V
U = 1023 / D
U = U * 1.1
Print "Vcc = ";
Print U ; " V"
Waitms 1000
Loop

Etwas rumprobiert, das Problem konnte ich bestätigen. Zuerst hatte ich einen Rechenfehler in Bascom in Verdacht. Deshalb habe ich die Einstellungen für Hwstack, Swstack usw. eingefügt. Keine Änderung. Dann fiel auf, dass auch bei der funktionierenden Variante der erste Wert noch nicht korrekt ist. Neue Theorie: Das Messen von Kanal 14 schaltet die Referenz erst ein, andere Kanäle schalten sie wieder aus. Und es wird jedesmal etwas Zeit benötigt, bis die Referenz voll da ist. Von so einer Einschwingzeit steht auch etwas im Datenblatt. Also muss man in diesem Fall den Kanal AD14 zweimal messen, einmal zum Einschalten der Referenz und dann nach einer kurzen Pause für die eigentliche Messung. Jetzt funktioniert es korrekt.


'----------------------------------------
'UNO_AD3b.BAS Vcc / 1.1 V
'----------------------------------------
$regfile = "m328pdef.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 32
$swstack = 64
$framesize = 64


Dim D As Word
Dim E As Word
Dim U As Single
Dim V As Single

Config Adc = Single , Prescaler = 64 , Reference = Avcc ' 5,0V

Do
E = Getadc(0) 'int Ref off
V = E * 5.0
V = V / 1023
Print V ; " V"
Waitms 3000


D = Getadc(14) 'Ref on
Waitms 100
D = Getadc(14) 'Ref 1.1 V
U = 1023 / D
U = U * 1.1
Print "Vcc = ";
Print U ; " V"
Waitms 1000
Loop
burkhard
 
Posts: 9
Joined: Wed Jul 30, 2014 2:30 pm

Return to BASCOM-AVR-Kurs

Who is online

Users browsing this forum: No registered users and 1 guest