- 3D-Druck Einstieg und Tipps         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 27

Thema: NiboBee Spannungsmessung mit Hindernis?

  1. #11
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    55
    Beiträge
    2.198
    Anzeige

    Powerstation Test
    Hm, wenn ichs nun richtig kapiert habe, sollte ich die externe Referenz (also die Methode der Bibliothek) verwenden, weil die Referenzspannung nicht niedriger als der Messwert sein soll.
    Das klappt bei der internen zwar, wird aber knapp.
    Also die Bibiotheken-Methode.
    Bisher hab ich noch nichts umgebaut, noch versuche ich, das Ergebnis _sinnvoll_ zu visualisieren.
    Die 512 hat ja _noch_ nichts mit der tatsächlichen Spannung zu tun, sondern ist lediglich der Wert, der vom ADC (ich hasse das, früher sagte man Wandler, nach AD-Wandler hab ich nämlich gesucht ) geliefert wird.
    Das heisst, ich muss nun 5(V,Referenz)/1024*Messwert rechnen.
    Das Ganze mal zwei (@Spannungsteiler) und habe die richtige Spannung?

    Wenn dem so ist, liegt nun das nächste Problem vor mir: das Display ist am I2C und weigert sich ganz offenbar, eine Fliesskommazahl auszugeben.
    Ich habe (sonst wird das berechnen nicht klappen, oder?) "Messwert" als double deklariert (bei float gibts eine Compilerwarnung), wenn ich schreibe

    printf("%f",volt);
    )
    Das ergibt, als Ausgabe 0.

    Schreibe ich es so:
    volt_mess=analog_getValue(4);

    volt= (5/1023*volt_mess)*2;
    lcd_setCursor(1,1);
    printf("%f",volt);

    (volt_mess ist hier der Wert vom ADC als int16_t und volt ist ein double, damit ich mit Kommastellen rechnen kann) kommt offenbar irgendwas überhaupt nicht mit, es wird ein Fragezeichen ausgegeben.
    Toll, _das_ hab ich auch im Gesicht.

    Per Taschenrechner funktioniert es, aber die Biene scheint genauso verwirrt wie ich zu sein.
    Ich weiss, für spätere Programme, in denen einfach nur Alarm geschlagen werden soll, wenn die Spannung einen bestimmten Wert unterschreitet, ist das relativ unerheblich, aber so lerne ich gleich noch was.

  2. #12
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Das Ausrechnen ist eigentlich eine neue Aufgabe;)

    Bei 5/1023 bleibt immer nur 0 als Ergebniss übrig, weil wir ja Integerrechen. Wenn man die Formel passend umstellt, erhält man mit

    5V*Messwert/1023=gesuchte Spannung

    zumindest ein ausreichend genaues Ergebniss. Das funktioniert, weil der Messwert nie über 1023 sein wird und 5*1023=5115 locker in eine 16Bit-Variable passt.

    Grundsätzlich kannst du auch mit den orginalen R43/44 brauchbare Messungen anstellen. Dazu muss lediglich, wie du oben schon geplant hast, R43 anstatt nach Vcc nach VLipo gehen. Bei 8,4V Lipospannung sollte mit der Lib-Funktion ein Messwert von 1023*4,2V/5V=859, für 7,2V entsprechend 1023*3,6V/5V=737 ermittelt werden können. Das sollte eigentlich so passen, die Gegenprobe: Die Differenz der Messwerte beträgt 859-737=122, das entspricht 5V*122/1023*2=1,2V;)

    Zur Anzeige auf dem LCD: Da ich finde, ein Mikrokontroller fühlt sich nur beim Integerrechnen richtig wohl, würde ich vielleicht so ansetzen: Bei Messwert 737 z.B. errechnen sich die Volt etwa so:

    Ganzevolt=2*5V*737/1023
    Zehntelvolt=2*5V*737/102-10*Ganzevolt

    Ganzevolt=7
    Zehntelvolt=72-70=2

    Mein RP6 (mit Mega32) zeigt damit
    Code:
    	vt100_set_cursor(5,1);
    	uint16_t GanzeVolt=10*737/1023;
    	writeChar(GanzeVolt+'0');
    	writeChar(',');
    	writeChar(10*737/102-10*GanzeVolt+'0');
    	writeChar('V');
    
    	vt100_set_cursor(6,1);
    	GanzeVolt=10*859/1023;
    	writeChar(GanzeVolt+'0');
    	writeChar(',');
    	writeChar(10*859/102-10*GanzeVolt+'0');
    	writeChar('V');
    7,2V
    8,4V

    an :)

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #13
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    55
    Beiträge
    2.198
    Zitat Zitat von radbruch

    Grundsätzlich kannst du auch mit den orginalen R43/44 brauchbare Messungen anstellen. Dazu muss lediglich, wie du oben schon geplant hast, R43 anstatt nach Vcc nach VLipo gehen. Bei 8,4V Lipospannung sollte mit der Lib-Funktion ein Messwert von 1023*4,2V/5V=859, für 7,2V entsprechend 1023*3,6V/5V=737 ermittelt werden können. Das sollte eigentlich so passen, die Gegenprobe: Die Differenz der Messwerte beträgt 859-737=122, das entspricht 5V*122/1023*2=1,2V
    Ja, das klappt nur, wenn ich die Bordspannung als Referenz benutze, richtig?
    Hatte ich auch schon vermutet.

    Was die Rechnerei angeht: wenn ich _einen_ Wunsch an die Zukunft habe, dann diesen (nach reichwerden usw.): EIN Zahlensystem für alle. \/

    Hab schon befürchtet, dass ich nicht drum herum kommen werde, das Ergebnis in Vor- und Nachkommastellen aufzuteilen.
    Ich hab`s mal schnell umgesetzt und erhalte als Ausgabe brav 5.0V angezeigt nun.
    Da die Spannungsstabilisierung artig 5.05V abdrückt, haut das so hin.

    Im Moment (da Testbetrieb) läuft das Programm noch als Schleife und misst einmal pro Sekunde, nun werde ichs mal umstricken, dass mittels Timer alle paar Sekunden gemessen wird, und somit die meiste Zeit für andere Dinge zur Verfügung steht, ich will das Ganze ja später in jedes Programm einbauen, als kleines Unterprogramm, was timergesteuert per ISR ab und an aufgerufen wird.

  4. #14
    Neuer Benutzer Öfters hier
    Registriert seit
    26.02.2010
    Ort
    Kreuzung BAB3 und B470
    Beiträge
    25
    Schon mal einen Blick auf die Lib von s.frings geworfen? https://www.roboternetz.de/phpBB2/vi...a503f51dfcaea3

    Mir gefällt die Lösung der Spannungskontrolle, und ich finde sie ausreichend. Spannungsteiler (schon dimensioniert?) und Grenzwerte im Programm einstellen.

    Und reich werden geht am besten so: Flasche Wein für 3 Euro kaufen und für 6 wieder verkaufen. Von den 3% kann man prima leben...

  5. #15
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    55
    Beiträge
    2.198
    Ehrlich gesagt: nein.
    Ich bin froh, dass ich mit der Nicai-Bibliothek weitgehend klarkomme für den Moment.
    Deshalb möchte ich auch nicht wechseln, allerdings werd ich sie mir _irgendwann_ ganz sicher ansehen.

    So, nun habe ich umbebaut: R43 an einem Ende rausgelöter (das Ende, was normal an + liegt natürlich) und mittels nem kleinen Kabel mit dem Balancerstecker meines Akkus verbunden.
    Da der so beschaltet ist, dass er einen Abgriff in der Mitte und den anderen quasi am Ende hat, liegt dort die volle Akkuspannung an.
    Es funktioniert: aktuell zeigt mir das Bienchen brave 7.9Volt an, in Wirklichkeit liegen (laut Multimeter) 7.78V an, ich schätze, die kleine Differenz ergibt sich aus den Bauteiltoleranzen.
    Kann man mit leben, meine ich, vielleicht, wenn ich irgendwann Lust habe, messe ich da mal genauer und wenn die Abweichung immer gleich ist, kann man den winzigen Fehler ja herausrechnen.

  6. #16
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Prima. Die "Bauteiletoleranzen" kannst du bei Bedarf ja noch "rausrechnen" wenn du es mit dem Multimeter kalibrierst. (Welche Spannung kannst du eigentlich an AVCC (Pin30) oder AREF (Pin32) messen?) Aber mir scheint das Ergebniss so völlig ausreichend. Glückwunsch :)

    Schon mal einen Blick auf die Lib von s.frings geworfen?
    Dieser Blick bringt keine Änderung weil auch in dieser Lib die Bordspannung als Referenz für die Messung der Bordspannung verwendet wird:

    Code:
        // Initialize the ADC
        // Enable ADC in single conversion mode with 117khz clock rate (F_CPU/128)
        // Which defines a performance of approx. 1000 samples/sec each of the 16 channels
        ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0) | (1<<ADIE) | (1<<ADSC);
        // Use AVCC as reference
        ADMUX = REF_VCC;
    (Aus der Funktion nibobee_init())

    Da die Lipobiene einen Spannungsregler an Bord hat funktionieren alle Ansätze mit 5V-Referenz. Messung der Bordspannung bei einer Standartbiene mit interner 2,56V-Referenz:
    https://www.roboternetz.de/phpBB2/ze...ag.php?t=51863

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  7. #17
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    55
    Beiträge
    2.198
    Sodele. Schnell noch ein bisschenwas drum herum gebastelt und

    Code:
    // Spannungswächter Lithium-Biene
    // ****** by Rabenauge ****** 
    // Misst die aktuelle Bordspannung und gibt sie auf Zehntel Volt genau auf Display aus
    // Diese Messung wird alle zwei Sekunden wiederholt,
    // ausserdem wird nach rund einer Minute die Displaybeleuchtung ausgeschaltet, kann aber 
    // mit dem linken Fühler nach hinten jederzeit wieder für eine Minute eingeschalten werden
    // Als Demo blinken die beiden gelben LED`s abwechselnd im Sekundentakt, nur, damit _irgend-
    // was_ getan wird.
    // Unterschreitet die Akkuspannung einen bestimmten Wert (konkret 6.5V), wird die Display-
    // beleuchtung eingeschalten, ein Achtungssignal ausgegeben und die beiden roten LED 
    // eingeschalten.
    // Alles läuft Timergesteuert, über Timer 0, die delay()-Funktion wird nicht benötigt
    // HINWEIS: das Programm ist ausgelegt auf NiboBee mit 2s LiPo als Stromversorgung, die 
    // per Spannungsstabilisierung auf 5V gebracht wird, es wird aber die tatsächliche Akku-
    // Spannung gemessen. Da die bei Standard-NiboBee`s gleich der Bordspannung ist, wird die
    // Messung dann _so_ nichts bringen, da die 5V als Referenz benutzt werden!
    
    
    #include <nibobee/iodefs.h>
    #include <nibobee/i2cmaster.h>
    #include <nibobee/lcdi2c.h>
    #include <nibobee/led.h>
    #include <nibobee/analog.h>
    #include <nibobee/sens.h>
    #include <stdio.h>
    
    //------------------------------------------- Variablen & Co ----------------------------
    
     uint16_t volt=0;
     uint16_t volt_zehntel=0;
     uint16_t volt_mess=0;
     int16_t count_backLight=0;
     int8_t count=0;
    //----------------------------------------- Spannungsüberwachung ------------------------
    
    int Batterie(void)
       	{
       	volt_mess=analog_getValue(4);							// Analogeingang 4 abfragen		
    	volt= 10*volt_mess/1023;								// Ganzevolt=2*5V*737/1023 
    	volt_zehntel= 10*volt_mess/102-10*volt;					// Zehntelvolt=2*5V*737/102-10*Ganzevolt
        	lcd_setCursor(3,1);									// Messwert ausgeben
        	printf(" %1d",volt);
    		printf(".");
    		printf("%1d",volt_zehntel);
    		printf(" Volt"); 
    		if (volt==6&&volt_zehntel<5)						// Falls Spannung zu niedrig wird (unter 6.5V)
    			{
    			 lcd_setBacklight(0);							// Licht an
    			 lcd_setCursor(7,2);							// Alarm schlagen
    			 printf(" ACHTUNG");
    			 led_set(LED_L_RD,1);
    			 led_set(LED_R_RD,1);
    			 count_backLight=0;
    			 }
    			
    		                    
    	return 0;
    	}
    //------------------------------------ Beleuchtung aus/Stromsparmode --------------------
     
    int Beleuchtung(void)										//Unterprogramm Displaybeleuchtung
    	{														//schaltet nach ca.1Minute die Display-
    	if(count_backLight > 60*57)								//Beleuchtung ab
    		{
    		 lcd_setBacklight(1);
    		}
    	return 0;
    	}	
    //------------------------------------ Hauptprogramm ------------------------------------
    
    int main(void)
    {
     TCCR0 = (1<<CS02)| (1<<CS00);          					// Normal Mode, kein OC0-Pin, prescaler /1024 
     TIMSK |= (1<<TOIE0);                     					// Timer0 Overflow-Interrupt erlauben 
       i2c_init();												// I2C initialisieren
       lcd_init(0x27);											// LCD initialisieren, Adresse festlegen
       analog_init();											// Analogeingänge initialisieren
       led_init();												// LED`s initialisieren
       set_output_group(IO_SENS);       						// Pull-ups aktivieren
       enable_interrupts();										// Interrupts einschalten
       lcd_setBacklight(0);									 	// Licht an
       lcd_setCursor(1,0);
     	printf(" Bordspannung");								// Programmname
       lcd_setCursor(0,2);
    	printf("<<Licht"); 
    	
       	while(1) 
    	{
         enable_interrupts();
         int8_t status_L = sens_getLeft();
    		if(status_L < 0)									//mit linkem Fühler nach hinten
    			{												//Licht wieder anmachen
    			 lcd_setBacklight(0);
    			 count_backLight=0;
    			} 	
    		if(count == 57) 									// nach 1 Sekunde
       			{ 
        		 led_set(LED_R_YE,1);                			// LED an 
        		 led_set(LED_L_YE,0); 							// andere aus
    			Batterie();										// Akkuspannung messen
       			} 
       			if(count > 2*57) 								// nach 2 Sekunden
       				{ 
         		 	 led_set(LED_R_YE,0);                		// LED aus 
         		 	 led_set(LED_L_YE,1); 						// andere an
    	 			 Beleuchtung();								// Licht aus?
    	 		 	 count=0; 									// Sekundentimer zurücksetzen
       				} 
    			}            
      return 0;                             
    }
    //--------------------------------- Timer-ISR -------------------------------------------
    
    ISR(TIMER0_OVF_vect) 										
    {     
      count++; 													// fürs blinken
      count_backLight++;										// für HG-Licht ausschalten
     }
    //----------------------------------- ENDE ----------------------------------------------
    Das Programm spielt mit den Leuchtdioden, und gibt alle zwei Sekunden die aktuelle Akkuspannung aus.
    Ausserdem wird ein "Alarm" ausgelöst, wenn die Akkuspannung unter 6.5V fällt.
    Zusätzlich habe ich (jaha, ich _hatte_ grad Langeweile) noch eine kleine Routine eingebaut, die nach einer Minute die Hintergrundbeleuchtung des Displays ausschaltet (man kann sie jederzeit wieder einschalten), und _das_ gibt eine verwirrende Erkenntnis:
    Wenn z.B. die Akkuspannung bei 7.6V ist, und das Display AUS, dann habe ich, wenn ich das Display wieder einschalte, mindestens 1/10V _mehr_ auf der Anzeige.
    Merkwürdig, bedeutet das, das Display braucht bei eingeschaltener Hintergrund-Beleuchtung WENIGER Strom als ohne sie?
    Sowas ähnliches las ich heute doch schon mal an anderer Stelle?

    Übrigens wäre es schön, wenn die Profis (bin ich ja weit, weit weg von noch...) sich den Code mal anschauen, und eventuelle Kritikpunkte anmerken, nur so lernt man schliesslich was.

  8. #18
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    55
    Beiträge
    2.198
    Nachtrag: die Geschichte, wie beschrieben, funktioniert: mit Einschränkungen!
    Es gibt nämlich da ein Problem: ich habe gestern abend noch mal die Bordspannung gemessen (per Multimeter) und hatte nur noch 4.85V!
    Beim Grübeln fiel mir dann ein, was da wohl schief gelaufen sein mag: irgendwo hörte ich mal, dass die Spannungsstabilisatoren mindestens 2V mehr am Eingang brauchen, als sie herausgeben sollen??

    Das bedeutet, wenn der LiPo unter 7V fällt (was ihm noch lange nichts ausmacht), fällt auch die Bordspannung der Biene unter 5V (auch das macht nix).
    ABÄR: da ja die Bordspannung nunmal die Referenz ist, zeigt die Biene ab dann eine falsche (nämlich höhere) Akkuspannung an!

    Ich schätze, mittelfristig bleibt da nichts anderes übrig, als den Spannungsteiler umzubauen und dann eben _doch_ die interne Referenzspannung zu benutzen.
    Für den Moment habe ich obiges Programm einfach angepasst, der Alarm wird nun bei unter 7.2V ausgelöst, das ist zwar viel zu früh, aber reicht allemal aus vorerst, und es ist, wenn Alarm geschlagen wird, noch jede Menge Reserve vorhanden, nur weiss ich _dann_, dass den Messwerten nicht mehr zu trauen ist.
    Umgebaut werden muss wohl trotzdem (nich heute, andermal), denn wenn der LiPo schon zum Teil entladen war, und man die Biene dann einschaltet, wird nie Alarm gegeben...

    Stimmt das mit den 2V Differenz?

  9. #19
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Der schon erwähnte 68k-Widerstand, diesmal zwischen R43 und dem Lipo, wäre auch hier nicht schlecht:

    8,4V/(47k+47k+68k)*47k=2,44V
    6,0V/(47k+47k+68k)*47k=1,74V

    (bei 8,4V/(47k+47k+56k)*47k=2,63V wären wir zu hoch)

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  10. #20
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    55
    Beiträge
    2.198
    Womit wir wieder bei Variante 1 wären, wie sie mir workwind bereits vorschlug: R43 ganz einfach durch einen 100k ersetzen und _dann_ mit der internen Referenzspannung (2.56V) arbeiten.

    Oder meinst du was anderes?

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad