Projekte
elektrolutz
NiboBee-1.3-Akkuspannung
main.c
Projekte
Forum
Doku
Öffentliche Projekte
Startseite
Beispielprogramme
Projekte von anderen
Welcome
Username
Passwort
Eingeloggt bleiben
Zugangsdaten vergessen?
Registrieren
Projektverwaltung
⇨ Please choose! ⇦
——————————————————
✎ Create new project...
★ Browse existing projects...
——————————————————
⚬ MotorTest#1
⚬ C Tutorial 8#1
⚬ NIBO2 C Project#1
⚙ C Tutorial 15#1
⚬ 2010_11_18_el_test001#1
NiboBee-1...uspannung
main.c
Project details
Compiler settings
Nachrichten
Sie sind nicht eingeloggt.
Neuigkeiten
★
NiboRoboLib 3.6
2017-01-17: Neue Version 3.6
★
NiboRoboLib 3.4.1
2016-04-16: Neue Version 3.4.1
★
Coding Tutorial
2015-11-22: Jetzt auch für den NIBO burger!
Site-Statistic
7433 private projects
378 public projects
16180353 lines compiled
58212 builds
NIBO
@
nibobee_1_3_akkuspannung/main.c [read only]
/* *********************************** * NIBObee C project * * Lib 1.3 * *********************************** * Akku-Spannung NiboBee * *********************************** * Grundidee von Rabenauge * * ADC-Messung von Skroete * *********************************** * Überarbeitung von elektrolutz * *********************************** *************************************************************************************************** * * Die aktuelle Akku-Spannung wird in Volt mit 1 Nachkommastelle auf dem Display BGX1 ausgegeben. * * Die Messung wird alle ??? Sekunden wiederholt * * Die Displaybeleuchtung wird nach einer Zeit ausgeschaltet und kann mit dem rechten Fühler, * nach hinten gedrückt, für eine Zeit wieder eingeschalten werden. * * Als Betriebsanzeige blinken die gelben LED`s abwechselnd. * * Unterschreitet die Akkuspannung einen bestimmten Wert (4.4V), wird die Displaybeleuchtung * eingeschaltet, ein Achtungssignal ausgegeben und die beiden roten LED´s eingeschaltet. * * Die Zeiten für das Blinken und die Displaybeleuchtung laufen timergesteuert über Timer 0. * *************************************************************************************************** */ #include <nibobee/iodefs.h> #include <nibobee/i2cmaster.h> #include <nibobee/bgx1.h> #include <nibobee/analog.h> #include <nibobee/led.h> #include <nibobee/delay.h> #include <nibobee/clock.h> #include <nibobee/odometry.h> #include <nibobee/motpwm.h> #include <nibobee/motpid.h> #include <nibobee/sens.h> #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <stdio.h> // - Variablen ------------------------------------------------------------------------------------ float volt_adc4 = 0.0; // Wert ADC4 float volt = 0.0; int16_t count_backLight = 0; // Zeitzähler Displaybeleuchtung int8_t count = 0; // Zeitzähler Blinker char text[32]; // Ausgabehilfe uint16_t count_messung = 0; // Zähler Messungen // - adc-Batterie --------------------------------------------------------------------------------- // - Quelle: www.roboternetz.de // - Username: Skroete // - Thema: nibobee: Akkuspannung mit ADC messen float adc_Batt() { unsigned char temp1,temp2; uint16_t ADCresult; while ((ADMUX & 0x07) != 0x04); cli(); while (!(ADCSRA & (1 << ADIF))); // wait for conversion complete ADCSRA |= (1 << ADIF); // clear ADCIF temp1 = ADCSRA; // Registerinhalte retten temp2 = ADMUX; ADMUX = (1 << REFS0) | (1 << REFS1) | ANALOG_VOLT; // internal 2.56V reference with external // capacitor ADCSRA = 0; // ADCSRA löschen und neu setzen ADCSRA |= ((1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0)); //ADC clock = Clock/128 ADCSRA |= (1 << ADEN); // Enable ADC (das aktiviert die 2.56V // Referenz) // Warten bis Kondensator an ARef = 2.56V hat // Messung an ARef ergab 1,2msec delay(6); // = ca. 5 * Tau // 1. ADC Wandlung starten und Ergebnis ignorieren ADCSRA |= (1 << ADSC); // Start conversion while (!(ADCSRA & (1 << ADIF))); // wait for conversion complete ADCSRA |= (1 << ADIF); // clear ADCIF // 2. ADC Wandlung starten und Ergebnis übernehmen ADCSRA |= (1 << ADSC); // Start conversion while (!(ADCSRA & (1 << ADIF))); // wait for conversion complete ADCSRA |= (1 << ADIF); // clear ADCIF ADCresult = ADCL + (ADCH << 8); // Registerinhalte wiederherstellen ADMUX = temp2; ADCSRA = temp1 & ~(1 << ADSC); // Warten bis Kondensator an ARef = AVcc hat // Messung ergab sehr steile Flanke delay(2); // nicht notwendig, nur zur Sicherheit ADCSRA |= (1 << ADSC); // Start conversion sei(); return ADCresult; } // - Spannungsüberwachung ------------------------------------------------------------------------- void Batterie() { volt_adc4 = adc_Batt(); // Wert zwischenspeichern volt = 2.0 * 2.56 * volt_adc4 / 1023.0; // Umrechnung: Uref * Wert_an_PA4 / 1023 // wegen Spannungsteiler * 2 bgx1_termGoto(0,1); // Akkuspannung in Volt ausgeben bgx1_termPrint("U_akku : "); sprintf(text," %02.2f",volt); bgx1_termPrint(text); bgx1_termGoto(0,2); // Wert "adc_Batt" ausgeben bgx1_termPrint("adc_Batt : "); sprintf(text," %04.1f",adc_Batt()); bgx1_termPrint(text); if (volt < 4.4) // Falls Spannung zu niedrig wird { bgx1_setIllumination (1023); // Licht an bgx1_termGoto(0,6); // Alarm schlagen bgx1_termPrint("- ACHTUNG - ACHTUNG -"); led_set(LED_L_RD,1); led_set(LED_R_RD,1); count_backLight=0; } else { bgx1_termGoto(0,6); // Akku ist OK bgx1_termPrint("---- Akku ist OK ----"); led_set(LED_L_RD,0); led_set(LED_R_RD,0); } } // - Beleuchtung aus/Stromsparmode ---------------------------------------------------------------- void Beleuchtung() // Unterprogramm Displaybeleuchtung { if (count_backLight > 499) // schaltet nach ??? Sekunden die Display- { bgx1_setIllumination(0); // beleuchtung ab } } // - Hauptprogramm -------------------------------------------------------------------------------- int main() { TCCR0 = (1 << CS02) | (1 << CS00); // Normal Mode, kein OC0-Pin, prescaler /1024 TIMSK |= (1 << TOIE0); // Timer0 Overflow-Interrupt erlauben i2c_init(); // I2C initialisieren bgx1_init(); // LCD initialisieren analog_init(); // Analogeingänge initialisieren led_init(); // LED`s initialisieren sens_init(); // Fühler initialisieren set_output_group(IO_SENS); // Pull-ups aktivieren sei(); // Interrupts einschalten delay(1500); // Wartezeit Initialisierung BGX1 bgx1_reset(); // Displayanzeige löschen bgx1_setIllumination(1023); // Licht an bgx1_termGoto(4,0); bgx1_termPrint("Akku-Spannung"); // Programmname bgx1_termGoto(0,5); bgx1_termPrint("<<< Lichtschalter"); // Hinweis Lichtschalter while(1) { int8_t status_R = sens_getRight(); if(status_R < 0) // mit rechtem Fühler nach hinten { bgx1_setIllumination (1023); // Licht wieder anmachen count_backLight=0; } if(count == 50) // nach ??? Sekunden { led_set(LED_R_YE,1); // LED an led_set(LED_L_YE,0); // andere aus Batterie(); // Akkuspannung messen count_messung++; // Anzahlmessungen nach Programmstart bgx1_termGoto(0,3); bgx1_termPrint("Messung : "); sprintf(text," %05d",(int)count_messung); bgx1_termPrint(text); } if(count > 99 ) // nach ??? 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 -----------------------------------------------------------------------------------------
Compiler results:
Werbung
Online
Bogdanasf
KylieSat
Marinayhm