RoboterCC - Robotic Code Compiler
Forum Robot Kits NIBObee Nibobee - läuft, aber mit kleineren Macken

Welcome

Nachrichten

Sie sind nicht eingeloggt.

Werbung

Banner

Letzte Themen

  • Keine Beiträge vorhanden

Site-Statistic

  • 7433 private projects
  • 378 public projects
  • 16180353 lines compiled
  • 58212 builds
NIBO @ facebook YouTube Twitter
Willkommen, Gast
Benutzername: Passwort: Angemeldet bleiben:

THEMA: Nibobee - läuft, aber mit kleineren Macken

Aw: Nibobee - läuft, aber mit kleineren Macken 11 Jahre 5 Monate her #1784

  • radbruch
  • radbruchs Avatar
  • OFFLINE
  • Junior Boarder
  • Beiträge: 12
Hallo

Nach vielen Versuchen kann ich nun wenigsten einen funktionierenden Ansatz präsentieren. Wie schon angekündigt habe ich die zyklische Messung rausgeschmissen:
// Initialize ADC:
	ADMUX = 0; //external reference
	ADCSRA = (0<<ADIE) | (0<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADIF);
	SFIOR = 0;
 
uint16_t readADC(uint8_t channel)
{
	if((ADCSRA & (1<<ADSC))) return 0; // check if ADC is buisy...
	ADMUX = (1<<REFS0) | (0<<REFS1) | (channel);
	if(channel==4) ADMUX |= (1<<REFS1); // 2,56V-Referenz bei der Batteriemessung
	Sleep(100);
	ADCSRA = (0<<ADIE) | (1<<ADSC) | (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADIF);
	while ((ADCSRA & (1<<ADSC)));
	ADCSRA |= (1<<ADIF);
	return ADC;
}
Der Code stammt ursprünglich vom arexx-m32, erweitert um die Referenzumschaltung für die Batteriemessung. Letztlich hatte es erst funktioniert, nachdem ich die Verzögerungszeit nach dem Laden des ADMUX-Registers eingebaut hatte (Sleep(1) dauert ca. 1/15000sec und wird mit der Timer1-OVL-ISR erzeugt). Vermutlich funktioniert es auch mit einer kürzeren Zeit. Die Programmverzögerung durch die ADC-ISR dürfte aber deutlich größer sein wenn man die Zeit für alle ISR-Aufrufe addiert.

Gruß

mic

Ach, fast vergessen:

Meine Messung ergab einen ADC-Wert von 973. Zwischen R23/R24 (nahe C22) gegen GND habe ich 2,464V gemessen. Das ergibt mit 2,464V*1023/973 ca. 2,59V als interne Referenz. Bei der zweiten Messung hatte ich 2,46V zwischen dem Spannungteiler bei einer Akkuspannung an R23 (neben Mega16) von 4,97V. Das Verhältniss am Spannungsteiler ist demnach 4,97V/2,46V=2,02. Somit ist die Akkuspannung bei ADC-Wert von 973 ca. 2,59V*973/1023*2,02=4,97V
Letzte Änderung: 11 Jahre 5 Monate her von radbruch.
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Aw: Nibobee - läuft, aber mit kleineren Macken 11 Jahre 5 Monate her #1788

  • radbruch
  • radbruchs Avatar
  • OFFLINE
  • Junior Boarder
  • Beiträge: 12
Hallo

Diese analog.c ersetzt das Orginal aus der Library:
/*  BSD-License:
 
Copyright (c) 2007 by Nils Springob, nicai-systems, Germany
 
All rights reserved.
 
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
 
  * Redistributions of source code must retain the above copyright notice,
    this list of conditions and the following disclaimer.
  * Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.
  * Neither the name nicai-systems nor the names of its contributors may be
    used to endorse or promote products derived from this software without
    specific prior written permission.
 
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
*/
 
/*! @file    analog.c
 *  @brief   Zuordnung der physikalischen Pins zu symbolischen Namen
 *  @author  Nils Springob (nils@nicai-systems.de)
 *  @date    2009-08-19
 */
 
// Zyklisches Einlesen der ADC-Werte mit ADC-ISR entfernt.        mic 25.11.2012
 
// http://www.roboter.cc/index.php?option=com_kunena&func=view&catid=3&id=1707&limit=6&limitstart=18&Itemid=20#1784
 
#include <avr/interrupt.h>
#include <util/atomic.h>
#include "nibobee/iodefs.h"
#include "nibobee/analog.h"
#include "nibobee/delay.h"
#include "nibobee/base.h"

 
#ifdef __cplusplus
extern "C" {
#endif

 
uint16_t analog_samples[11];
uint8_t analog_pos=0;
 
 
void analog_init(void) {
  nibobee_initialization |= NIBOBEE_ANALOG_INITIALIZED;
	// Initialize ADC:
	ADMUX = 0; //external reference
	ADCSRA = (0<<ADIE) | (0<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADIF); // prescaler 64
	SFIOR = 0;
  activate_output_bit(IO_LINE_EN);
}
 
 
uint16_t readADC(uint8_t channel)
{
	analog_pos = channel;
	if((ADCSRA & (1<<ADSC))) return 0; // check if ADC is buisy...
	ADMUX = (1<<REFS0) | (0<<REFS1) | (channel);
	if(channel == ANALOG_VOLT) ADMUX |= (1<<REFS1); // 2,56V-Referenz bei der Batteriemessung
	if(channel > ANALOG_R0) { clear_output_bit(IO_LINE_EN); channel -= 3; }
	delay(20);
	ADCSRA = (0<<ADIE) | (1<<ADSC) | (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADIF);
	while ((ADCSRA & (1<<ADSC)));
	ADCSRA |= (1<<ADIF);
	set_output_bit(IO_LINE_EN);
	return ADC;
}
uint16_t analog_getValue(uint8_t idx) {
	analog_samples[idx] = readADC(idx);
	return analog_samples[idx];
}
 
 
#ifdef __cplusplus
} // extern "C"
#endif
Spannenderweise sind die Linienwerte mit eingeschalteten LinienLED, selbst mit abgedeckten Phototransistoren, so hoch, dass man damit keiner Linie mehr folgen kann. Das könnte auch die Probleme mit den Linienwerte erklären und liegt an der fehlenden Einschaltverzögerung der LinienLED. Einschalten und Einlesen lagen in der ISR-Version nur ca. 128*13 Kontrollertakte auseinander. Das sind 1/15000000*1664 Sekunden und wohl viel zu kurz für die LED um volle Leuchtkraft zu erreichen:
case  6: analog_samples[ANALOG_R0]=value; clear_output_bit(IO_LINE_EN); break;
    case  7: analog_samples[ANALOG_VOLT]=value; break;
    case  8: analog_samples[ANALOG_L1]=value; break;
    case  9: analog_samples[ANALOG_C1]=value; break;
    case 10: analog_samples[ANALOG_R1]=value; set_output_bit(IO_LINE_EN); break;

Gruß

mic
Letzte Änderung: 11 Jahre 5 Monate her von radbruch. Begründung: delay(10) nach delay(20) geändert, ANALOG_VOLT und ANALOG_R0 in der Channelabfrage stelle von 4 und 7
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Aw: Nibobee - läuft, aber mit kleineren Macken 11 Jahre 5 Monate her #1790

Danke für die neue Version, werde ich bald ausprobieren :-)

Zum Strom: Der Schaltregler hat einiges gebracht, auch habe ich auf der Hauptplatine die beiden Stromstränge Bat->Schalter und Schalter->Buchse Richtung Experimentierplatine jeweils um ein Kabel ergänzt, weil da jeweils 50mV abfielen. Ergebnis: Läuft :-)
Der Administrator hat öffentliche Schreibrechte deaktiviert.
Ladezeit der Seite: 0.128 Sekunden

Werbung