suche Spanungsüberwachung

Hicki

Mitglied
25. Feb. 2009
44
2
8
58
Sangerhausen/OT Grillenberg
Sprachen
  1. BascomAVR
Hi,

ich suche ein einfaches Programm zur Spanungsüberwachung(12V). Ich habe Board mit dem Mega2560 drauf. Spannungsteiler auf 5V gebaut. Ich weis nur, dass man den ADC verwenden muss.
Wer kann mir bitte helfen?

Gruß Andreas
 
Hallo Andreas,

du solltest erstmal genau schreiben, was du überwachen willst!
Wenn du z.B. den Ausfall der Spannung, Unterschreiten oder Überschreiten eines Schwellwertes überwachen willst, solltest du den Komparator verwenden. Wenn du den Istwert der Spannung überwachen / messen willst, solltest du den ADC verwenden, ein Spannungsteiler auf 5 V bringt hier nicht viel, besser ist ein Spannungsteiler, der deine zu messende Spannung auf einen Wert teilt, der etwas kleiner als die Referenzspannung (Datenblatt) ist, damit auch noch etwas "Luft" nach oben ist.

- gp177 -
 
Hallo Andreas,

du solltest erstmal genau schreiben, was du überwachen willst!
Wenn du z.B. den Ausfall der Spannung, Unterschreiten oder Überschreiten eines Schwellwertes überwachen willst, solltest du den Komparator verwenden. Wenn du den Istwert der Spannung überwachen / messen willst, solltest du den ADC verwenden, ein Spannungsteiler auf 5 V bringt hier nicht viel, besser ist ein Spannungsteiler, der deine zu messende Spannung auf einen Wert teilt, der etwas kleiner als die Referenzspannung (Datenblatt) ist, damit auch noch etwas "Luft" nach oben ist.

- gp177 -

Danke für Deine Antwort,

ich habe meine zu messende Spannung(12V) mit einem Spannungsteiler auf 4,5V geteilt. Die Spannung soll überwacht werden, dass heißt, wenn die Spannung kleiner wird, soll durch LED´s optisch angezeigt werden. Mit 4 Stück bei 11V, 10V, 9V und 8V.

Gruß Andreas
 
0V entsprechen dem Wert 0, 5V entsprechen dem Wert 255, wenn du 8 bit wandelst. Nun musst du dir entsprechend überlegen, welche Spannung bei deinen 11,10,9,8V nach dem Spannungsteiler am Atmega anliegt. Diese Rechnest du in den Binärwert um.
Nun zur Programmierung, ADC kalibrieren + Dummy Readout und im Hauptprogramm dann messen. Über if (variable==wert) kannst du dann bei genau einem Wert deine LED auswählen.

Ich würde aber in deinem Fall lieber Bereiche anzeigen: 11,5 V - 10,5V LED1 , 10,49V - 9,5 V LED 2, usw.

Du hast immer noch nicht erwähnt welchem Chip du programmieren möchtest, welche Programmiersprache du verwenden willst und die Beschaltung, falls da mehr ist als Spannungsteiler an ADC-Port x
 
Du hast immer noch nicht erwähnt welchem Chip du programmieren möchtest, welche Programmiersprache du verwenden willst und die Beschaltung, falls da mehr ist als Spannungsteiler an ADC-Port x

Danke für die Antwort,

der Chiptype steht in meinen ersten Beitrag. Ist der Mega2560.
Da ich noch nicht soviel Ahnung habe, hast Du ein Code-Beispiel für mich bitte.

Gruß Andreas
 
oh sorry, das habe ich leider Übersehen.

Speziell für deinen Chip habe ich kein Beispiel. Noch nie mit gearbeitet.

Code fürn Atmega

Code:
void ADC_Init (void)
{
		// Den ADC aktivieren und Teilungsfaktor auf 128 stellen
		ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
		// Interne Referenzspannung verwenden (also AVCC V), 8 bit einstellen
		ADMUX = ~(1<<REFS1) | (1<<REFS0) | (1<<ADLAR);
		// Den ADC initialisieren und einen Dummyreadout machen
		ADCSRA |= (1<<ADSC);
		while(ADCSRA & (1<<ADSC));
		
}

uint8_t readADC(uint8_t channel) {
	uint8_t i;
	uint8_t result = 0;

	// Kanal des Multiplexers waehlen
	
	ADMUX += channel; //| ~(1<<REFS1) | (1<<REFS0) | (1<<ADLAR);
	
	
	// Jetzt 3x die analoge Spannung and Kanal channel auslesen
	// und dann Durchschnittswert ausrechnen.
	for(i=1; i<3; i++) {
		// Eine Wandlung
		ADCSRA |= (1<<ADSC);
		// Auf Ergebnis warten...
		while(ADCSRA & (1<<ADSC));
		
		result = result + ADCW;
	}
	
	// ADC wieder deaktivieren
	ADCSRA &= ~(1<<ADEN);
	
	result = result / i;
	ADMUX -= channel;
	return result;
}

int main(void)
{
int AnalogSpannung;
ADC_Init();

    while(1)
    {				
				AnalogSpannung = readADC(0);	//Auslesen der analogen Spannungen an Pin 0,
											  // also ADC0. In result steht das Ergebnis.
			
				
    }
}

Verrate doch mal in welcher Programmiersprache du programmierst
 
oh sorry, das habe ich leider Übersehen.

Speziell für deinen Chip habe ich kein Beispiel. Noch nie mit gearbeitet.

Code fürn Atmega

Code:
void ADC_Init (void)
{
		// Den ADC aktivieren und Teilungsfaktor auf 128 stellen
		ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
		// Interne Referenzspannung verwenden (also AVCC V), 8 bit einstellen
		ADMUX = ~(1<<REFS1) | (1<<REFS0) | (1<<ADLAR);
		// Den ADC initialisieren und einen Dummyreadout machen
		ADCSRA |= (1<<ADSC);
		while(ADCSRA & (1<<ADSC));
		
}

uint8_t readADC(uint8_t channel) {
	uint8_t i;
	uint8_t result = 0;

	// Kanal des Multiplexers waehlen
	
	ADMUX += channel; //| ~(1<<REFS1) | (1<<REFS0) | (1<<ADLAR);
	
	
	// Jetzt 3x die analoge Spannung and Kanal channel auslesen
	// und dann Durchschnittswert ausrechnen.
	for(i=1; i<3; i++) {
		// Eine Wandlung
		ADCSRA |= (1<<ADSC);
		// Auf Ergebnis warten...
		while(ADCSRA & (1<<ADSC));
		
		result = result + ADCW;
	}
	
	// ADC wieder deaktivieren
	ADCSRA &= ~(1<<ADEN);
	
	result = result / i;
	ADMUX -= channel;
	return result;
}

int main(void)
{
int AnalogSpannung;
ADC_Init();

    while(1)
    {				
				AnalogSpannung = readADC(0);	//Auslesen der analogen Spannungen an Pin 0,
											  // also ADC0. In result steht das Ergebnis.
			
				
    }
}

Verrate doch mal in welcher Programmiersprache du programmierst

Danke für Deinen tollen Code, aber ich arbeite mit Bascom.

Gruß Andreas
 
Deine Suchbegriffe für die Hilfe sind "Config ADC", "Start ADC" und "Getadc", damit solltest Du es jetzt eigentlich auch selbst schaffen können...
 
Nun schau doch erstmal in die Hilfe, da ist bestimmt ein Beispielcode, den Du nur anpassen mußt.
Läßt sich am Telefon und ohne Bascom schlecht machen...
 
leider komme ich nicht weiter. Die Spannungsprüfung(Messung) liegt an Pin (ADC0)PF0 .

Code:
 $regfile = "m2560def.dat"                                  'Atmega 2560 einstellen
 $loadersize = 512
 $hwstack = 100
 $framesize = 64
 $swstack = 100
 $crystal = 16000000                                        'Quarzfrequenz


Config Adc = Single , Prescaler = Auto , Reference = Internal_2.56
Start Adc

Gruß Andreas
 
laut Datenblatt ist PF0=ADC0

Bascom scheint den ADC immer mit 10bit auszulesen (ADLAR=0), also entspricht die gewählte Referezspannung (2,56V) 1023 - folglich muß die Variable, die das Ergebnis aufnehmen soll (Variable=getadc(xyz)) auch entsprechend große Werte aufnehmen können (also 2 Bytes)
Ist der Aref-Pin auf dem Modul gegen Gnd geblockt? Wenn Du Dir das zutraust, kannst Du mal die dort anliegende Spannung messen - sollte 2,56V sein, klar.
Außerdem darf die zu messende Spannung nicht größer als die Referenz sein.

P.S.: Dein Mords-Mega scheint für einige Eingänge auch differentielle Messungen zu unterstützen, wobei dann ein "einstellbarer" Gain Amplifier (1x, 10x, 200x) mitgenutzt wird.
 
...Variable=getadc(xyz)...
"Variable" muß wie gesagt 2 Bytes aufnehmen können, also ein Word sein.
"xyz" ist die Nummer des ADC-Input, wie man dem Datenblatt entnehmen kann 0 für PF0, 1 für PF1.

"Variable" erhält damit logischerweise das ganzzahlige Ergebnis der Verhältnisgleichung 1023*(Eingangsspannung/Referenzspannung) zugewiesen.
Da Dich die tatsächliche Spannung nicht wirklich interessiert mußt Du den armen AVR nicht mit krummen Zahlen rumrechnen lassen, sondern kannst Du für Deine diskreten Schwell-Werte einfach mit derselben Verhältnisgleichung die dazugehörenden ADC-Schwell-Werte ausrechnen - und "Variable" dann mit diesen Werten vergleichen, und entsprechend die LEDs schalten.

Also wie im Beispiel aus der Hilfe, nur daß Du eben nur einen "channel" benutzt, und das Ergebnis nicht "print"-est, sondern mit vorher berechneten diskreten Werten vergleichst, und Deine LEDs entsprechend leuchten läßt...

Hilft Dir DAS weiter?
 
"Variable" muß wie gesagt 2 Bytes aufnehmen können, also ein Word sein.
"xyz" ist die Nummer des ADC-Input, wie man dem Datenblatt entnehmen kann 0 für PF0, 1 für PF1.

"Variable" erhält damit logischerweise das ganzzahlige Ergebnis der Verhältnisgleichung 1023*(Eingangsspannung/Referenzspannung) zugewiesen.
Da Dich die tatsächliche Spannung nicht wirklich interessiert mußt Du den armen AVR nicht mit krummen Zahlen rumrechnen lassen, sondern kannst Du für Deine diskreten Schwell-Werte einfach mit derselben Verhältnisgleichung die dazugehörenden ADC-Schwell-Werte ausrechnen - und "Variable" dann mit diesen Werten vergleichen, und entsprechend die LEDs schalten.

Also wie im Beispiel aus der Hilfe, nur daß Du eben nur einen "channel" benutzt, und das Ergebnis nicht "print"-est, sondern mit vorher berechneten diskreten Werten vergleichst, und Deine LEDs entsprechend leuchten läßt...

Hilft Dir DAS weiter?

Danke Dir. glaube nicht das es mir hilft. wie berechne ich die Werte? Hilf mir doch bitte mit dem Code und dokumentiere ihn. Dann kann ich es besser verstehen und nach voll ziehen.

Gruß Andreas
 
'Ne Verhältnisgleichung halt... Mathe Klasse 4 oder so...

Der ADC hat 10bit, also 2 hoch 10 -> 1024 -> [0..1023].
Dabei entspricht die Referenzspannung (bei Dir 2,56V) der Zahl 1023 (hättest Du die interne 1,1V-Referenz gewählt, entspräche 1,1V=1023).
Und 0V (AGND) der 0.
Der ADC vergleicht die Eingangsspanng mit der Referenzspannung, bzw stellt sie als Anteil der Referenspannung dar. Wie Prozente, nur eben nicht mit 100 Teilen (Pro-Cent), sondern mit 1024 (0..1023).

Eingangsspannung/Referenzspannung=ADC Wert/1023

kannste jetzt natürlich nach der Eingangsspannung oder dem ADC-Wert umstellen (der Rest macht ja keinen Sinn).
 

Ü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)