PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ADC Batteriespannung messen



Asuro91
22.06.2010, 14:59
Hallo alle zusammen
ich hab mal wider ne frage
und zwar will ich zwei Spannungen überwachen die eine ist 9V die andere ist 36V, da man die meines wissen nicht direkt an den mega32 anschließen kan hab ich zwei Spannungsteiler, so das beide Spannungen auf 5V kommen. Meine Frage is jetzt ob man mit dem mega32 zwei Spannungen überwachen kan und wenn ja an welchen port man die Spannungen anschließen muss.
und wie man des in Bascom dan fest legt.

Danke schon mal
Lg micha

Willa
22.06.2010, 15:13
Hi,
Du schließt die auf 5V geteilten Spannungen (vorher nochmal mit dem Multimeter kontrollieren!) and einen ADC Pin deiner Wahl an. Wie das dann in Bascom weitergeht findest du in der Hilfe, Stichwort ADC.

Asuro91
22.06.2010, 16:31
hi
sorry war mein fehler ich hätte die frage en bissel anderst stellen sollen, ich hab schon en bascom code was mir noch nicht ganz schlüssig is wie weiß der microcontroller welchen adc port er auslesen soll.
lg micha




'Spannung.bas
$regfile = "m32def.dat"
$crystal = 16000000

'ADC einstellen, Vorteiler Automatisch wählen, Referenz Intern 5V
Config Adc = Single , Prescaler = Auto , Reference = Internal
Start Adc 'ADC starten

Declare Sub _betriebsspannung() 'Subroutine der Messung
Const Ref = 5 / 1023 'Auflösung berechnen 0.005V = 5mV
Dim Volt As Single
Dim Betriebsspannung As Single

Main: 'Endlosschleife
Do

Call _betriebsspannung() 'Rutine aufrufen
Print Volt ; "Volt" 'Spannung über RS232 ausgeben
Waitms 500 '500ms warten

Loop
End

Sub _betriebsspannung()

Local W As Word 'Variable die nur in der Sub benutzt wird
W = Getadc(6) 'Rohwert einlesen 0 bis 1023
Betriebsspannung = W * Ref 'auf V umrechen
Betriebsspannung = Betriebsspannung * 5.2941 'Spannungsteiler Verhältnis einbeziehen
Volt = Betriebsspannung 'Ausgabe in Volt

End Sub

peterfido
22.06.2010, 16:39
Dein Code liest den Pin 6 ein. GetADC(6). Dafür gibt es eigentlich eine sehr gute Bascom Hilfe. Wenn du die Spannung einer Batterie messen willst, sollte der Spannungsteiler recht hochohmig sein, sonst ist die Batterie schneller leer, als geplant.

Asuro91
22.06.2010, 18:31
hi
danke für die Antwort... also ich hab bei dem Spannungsteiler für die 36V 15kohm und 2,4kohm und für die 9V 7,5kohm und 9,1kohm ist des groß genug

peterfido
22.06.2010, 20:52
Sieh Dir mal das Ohmsche Gesetz an. Dann noch die Daten der Batterien und du kannst ausrechnen, wie lange die Batterien die nötige Energie liefern können.

JoeBlack
22.06.2010, 23:22
Ich hab das eben mal durchgerechnet mit den angegebenen Werten.
Du hättest bei 36V 4,965V am Abgriff und bei 9V 4,934V am Abgriff.
Ich hätte da recht viel angst um den Chip, weil die Leerlaufspannung eines Akkus deutlich über der angegebenen liegen kann.
Ausserdem haben Widerstände Toleranzen drin und wenn die ungünstig liegen kommst Du über die Betriebsspannung und dann gibt der Chip Rauchzeichen.

MfG JoeBlack

RoboHolIC
23.06.2010, 10:26
Zwar kenne ich die AVRs nicht, aber typischerweise kann man so vorgehen:
Wenn die Analogeingänge des Controllers nicht geclamped sind, dann je eine Schottkydiode vom ADC-Eingang in Richtung AVcc bzw. Vcc. Da die Meßspannungen über einen Serienwiderstand an den Controller kommen, sind die möglichen Ableitströme hier auf Daumenwert 0,5 bzw. 2 mA begrenzt.
Einzige Voraussetzung: Der fremd-eingespeiste Strom muß irgendwo hin fließen, also z.B. in der Schaltung verbraucht werden. Andernfalls baut sich doch eine Überspannung auf.

Asuro91
03.07.2010, 19:51
hi
allso ich hab jetzt mal die Spannug bei 9V mit den Widerständen gemessen die ich oben angegeben hatte und es ligen 5.10V an. Kann man den trotzdem an dem AVR anschließem oder tut des dem nicht gut ..?

Besserwessi
03.07.2010, 20:10
Beim AVR sind Clamp dioden an den ADC-Eingaängen, aber der Stromverbrauch ist sehr niedreig. Man braucht also auch den Widerstand nach GND, also ein vollständigen Spannungsteiler. Wenn der Spannungteiler hochohmig genug ist, hat man über die Dioden auch einen Schutz falls die Spannung nach dem Teiler noch mal über 5 V gehen würde. Oft kann man auch die interne Ref. nutzen und hat dann ohnehin noch eine Reserve von 2,5 V bis 5 V.

Die oben genannten Widerstände sind recht klein: da vielt realtiv viel Strom aus der Batterie.
Als grobe Fastregel kann man für den Widerstand nach GND 10-20 K nehmen, und den Widerstand zu zu messenden Spannung entsprechend anpassen. Für 9 V am Eingang wären 2 mal 22 K ganz brauchbar: Der Bereich wäre dann bis 10 V. Mit Hilfe eines Kondensators darf der Spannungsteiler auch noch deutlich hochohmiger werden.

PICture
03.07.2010, 20:27
Hallo!

@ Asuro91

Wenn die Spannung nur gelegentlich gemessen werden sollte, würde ich über durch z.B. CMOS Analogmultiplexer bzw. ein Pin vom µC zuschaltbaren Widerstandsteiler nachdenken.

MfG

Asuro91
03.07.2010, 21:50
danke für die schnelle antwort ich hab noch mal überlegt und ich nehm jetzt größere widerstände dan fließt nicht so viel strom und dan müsste es gehen

Asuro91
19.07.2010, 22:10
Hallo zusammen
ich hab noch mal ne Frage, vorab ich hab für das oben genannte Groblem jetzt einen Spannugsteiler deren Widerstände aus 240 kOhm und 330kOhm betsehn somit ist er hochohmig genug und die 5Volt werden auch nicht überschritten. Ich hab nun aber volgendes Problem wenn ich den Spannugssteiler überhauptnicht anschließ Zeigt gibt mir das Display schon 9V aus Schließ ich den Spannugsteiler an zeigt es mir 26V an. Hat jemand ne Ahnung was an meinem Programm vieleicht falsch ist. Danke schon mal im voraus.
LG micha


$regfile = "m32def.dat" 'für Mega32
$crystal = 16000000
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portc.1 , Db5 = Porta.3 , Db6 = Portc.2 , Db7 = Porta.4 , E = Porta.2 , Rs = Portc.0
Config Lcdbus = 4

'ADC einstellen, Vorteiler Automatisch wählen, Referenz Intern 5V
Config Adc = Single , Prescaler = Auto , Reference = Internal
Start Adc
Declare Sub _betriebsspannung() 'Subroutine der Messung
Const Ref = 5 / 1023 'Auflösung berechnen 0.005V = 5mV
Dim Volt As Single
Dim Betriebsspannung As Single

Main:
Do
Call _betriebsspannung() 'Routine aufrufen
Locate 4 , 1
Volt = Volt + 0.5
Volt = Int(volt)
Lcd Volt ; " Volt"
waitms 45


Loop

End

Sub _betriebsspannung()

Local W As Word 'Variable die nur in der Sub benutzt wird
W = Getadc(0) 'Rohwert einlesen 0 bis 1023
Betriebsspannung = W * Ref 'auf V umrechen
Betriebsspannung = Betriebsspannung * 5.2941 'Spannungsteiler Verhältnis einbeziehen
Volt = Betriebsspannung 'Ausgabe in Volt

End Sub

Kampi
19.07.2010, 22:21
Dein Widerstandsverhältnis, also diese Zeile:

Betriebsspannung = Betriebsspannung * 5.2941

Ist denk ich mal falsch. Damit verfünffachst du die gemessene Spannung.

Asuro91
19.07.2010, 23:16
hi
danke für die schnelle antwort ich hatte des Programmbeispiel aus so em Roboterbuch aber jetzt wo du es sagt des könnte hin kommen wen ich des veränder müsst ich auf 9V kommen. Is des richtig.
danke

Kampi
20.07.2010, 06:33
Jop das stimmt.

Asuro91
20.07.2010, 23:14
ja habs hin bekommen
danke war der falsche Wert zum umrechnen in Volt hab jetzt statt 5.2941 , 1.8 genommen und es werden jetzt 9V angezeigt
danke noch mal