mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Hilfe bei C-Programm Problem gesucht


Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe ein kleines Problem mit einem C-Programm. Dazu muß ich etwas 
weiter ausholen.
auf der Seite:
http://www.opend.co.za/hardware/nimh1/nimh1.htm
ist ein NIMH-Lader mit Atmega8 veröffentlicht, den ich nachgebaut habe 
und der auch ganz prima funktioniert. Es war schon einmal jemand so 
freundlich, mir den Quelltext davon zu assemblieren, so daß ich das 
Gerät aufbauen konnte. (Winavr kann ich mittels Modem nicht herladen, da 
zu groß).

Jetzt zu meinem Problem: Der Lader läßt sich nur bis minimal 100mA 
herunter einstellen. Das ist offenbar in der Software so festgelegt. 
Wenn ich nun aber z.B. einen 9V-Blockakku mit 150 mAh Kapazität laden 
will, muß ich aber herunter bis auf 15mA einstellen können. Da ich von 
der
Sprache C nichts verstehe, ist es mir nicht möglich, die Stelle in der 
Datei Main.c zu finden, wo der Autor des Beitrages den unteren 
"Anschlag" der PWM festgelegt hat. Ich hatte ihn im November schon mal 
angeschrieben
und auf einen anderen Fehler aufmerksam gemacht, den er auch behob, aber 
jetzt höre ich nichts mehr von ihm.

Deshalb die Frage: Kann sich mal ein "C-Kundiger" die Quellen laden und 
sehen, wo die untere Begrenzung programmiert ist, sie nach unten hin 
korrigieren und dann die geänderte .hex-Datei posten? Es ist die 
getestete
Version von 2004.

MfG Paul


Autor: jack (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Paul,
ich hab mir mal die main.c (version 2006) angesehen. Im Unterprogramm
pwm_control ist ein Wert min_duty von 4 und ein Wert max_duty von 100
eingetragen. Probehalber könnte man min_duty auf 2 oder 1 setzen.
Aber um das Programm genau zu verstehen, müßte man schon einige Zeit 
investieren.

Autor: Paul Baumann (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@Jack
Ich danke Dir für Deine Mühe. Könntest Du mir bitte in der Version von 
2004
(die ist getestet; die 2006er nicht) den min_duty Wert auf 1 setzen und 
mir dann die compilierte Datei im .hex-Format senden? Unabhängig davon, 
ob
das die ganze Lösung des Problems darstellt.

MfG Paul

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die 2004er-Version enthält noch eine ganze Menge Zeug, das nicht mehr 
AVRgcc-aktuell ist...

Autor: Rahul, der Trollige (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich häng mal die untested-Version an.

Autor: jack (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Rahul

Na das war ja fix, hast Du Dir den Code mal genauer angesehen?
Würde mich mal interessieren, wo man da noch was drehen kann.

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nee, habe ich noch nicht. Ich habe erst mal nur "outp" und "inp" 
übersetzt...
Das alte Ding will mein Compiler immer noch nicht (und irgendwie ist mal 
wieder mein Output-Fenster des Programmer's Notepad verschwunden...)

Autor: Rahul, der Trollige (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Mist! Irgendwie lässt sich das alte Programm bei mir nicht /mehr) 
compilieren. Ich hätte gerne geholfen.
Anbei die ungetestete 2006er-Variante mit geändertem min_duty

Autor: jack (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich wollte mal das 2004er Programm compilieren und hab mir das neueste
WinAvr runtergeladen. Anscheinend kennt er inp und outp nicht mehr.
Muß man da jetzt ein neues Makro schreiben?

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Menschenskinder! ;-) Schönen Dank.
Da freue ich mich, daß ihr mir geholfen habt. Ich lade das heute abend 
mal rein und schreibe Euch dann, wie sich die Änderung geäußert hat.

MfG Paul



Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Rahul
So, jetzt habe ich beide Versionen, die Du gesandt hast ausprobiert.
Die erste (von 20:47 Uhr) funktioniert, läßt aber als Minimum nur 120mA
einstellen. Die zweite Version geht besser; sie läßt minimal 68mA 
einstellen. Auf welchen Wert hast Du "min_Duty" gesetzt? Wenn der jetzt 
auf 1 steht, dann geht es prinzipbedingt nicht weiter runter und ich muß 
für das Laden der Blockakkus einen anderen Apparat benutzen.

Danke Dir noch einmal! :-)

MfG Paul

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Auf welchen Wert hast Du "min_Duty" gesetzt? Wenn der jetzt
>auf 1 steht, dann geht es prinzipbedingt nicht weiter runter und ich muß
>für das Laden der Blockakkus einen anderen Apparat benutzen.

Die erste habe ich einfach so compiliert.
Dann ist mit das mit "min_duty=1" noch eingefallen...
Das wurde dann das 2.Posting.
Scheinbar geht es wirklich nicht kleiner...
Da müsste man vermutlich an der Hardware drehen (habe ich mir noch nicht 
näher angesehen).

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder an der Schaltfrequenz...

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Rahul
...da ist mir das Ergebnis mit dem ersten .hex-File klar.:-))
Das war das Gleiche, was ich schon drin hatte. (Habe ich mit dem 
Hexeditor
vergleichen lassen)
Eben fiel mir noch ein, daß ja der fließende Strom über den AD-Wandler 
als
proportionale Spannung wieder eingelesen wird und er damit den 
Ladestromkonstant hält. Vielleicht fragt das Programm den irgendwo auf 
seinen minimalen Wert hin ab und es hängt daran. C ist so 
unübersichtlich.
(Jaul!):-)

MfG Paul

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Vielleicht fragt das Programm den irgendwo auf seinen minimalen Wert hin >ab und 
es hängt daran.

Wenn ich dazu komme, schaue ich mir den Code noch mal genauer an.
Eigentlich wird sich das Programm nur um den Regler drehen (wer hätte 
das gedacht?!), und eine gewisse Anzahl von Impulsen zählen bis die Zeit 
um ist.

>C ist so unübersichtlich.
Um dem entgegenzuwirken gibt es die Möglichkeit, Programme mit 
Kommentaren zu versehen...Das gilt nämlich für jede Programmiersprache

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab mir mal den Code angeguckt.
Der Regler sieht so aus:
//------------------------------------------------------
// the soft implementation of the SMPSU control
//------------------------------------------------------
void control_pwm(void)
{
//#define max_duty 127  
//#define min_duty 0  

#define max_duty 100  
#define min_duty 4  

static  uint8_t    dutycycle = min_duty;
static uint32_t  adc_ave = 0;

static uint8_t    pre = 0;
static uint32_t  adc_ave_tmp;
    uint16_t  adcv;

  if (ADC_DataInBuffer()) // only if there is data waiting for me
  {
//------------------------------------------------------
// the adc sample collection
// average a number of samples out to get a smoothed average
//------------------------------------------------------
    adcv = ADC_get();

    adc_ave = adc_ave + adcv;
//------------------
// a prescaler used in the averaging of the adc
    if (pre >= 16)
      pre = 0;
    pre +=1;    

    if (1 == pre)
    {
      adc_ave = adc_ave >> 3;  
    
      adc_ave_tmp = adc_ave;
      while ((adc_ave_tmp < setpnt) && (dutycycle < max_duty))
      {
        dutycycle += 1;  
        adc_ave_tmp = adc_ave_tmp + (adc_ave_tmp >> 3); // exponential duty cycle control for fast accurate responce
      }  

      adc_ave_tmp = adc_ave;
      while ((adc_ave_tmp > setpnt) && (dutycycle > min_duty))
      {
        dutycycle -= 1;  
        adc_ave_tmp = adc_ave_tmp - (adc_ave_tmp >> 3); // exponential duty cycle control for fast accurate responce
      }  
      pwm_duty_cycle(dutycycle);

      adc_ave = 0; // flush the averaging accumulator 
    }
  }
//------------------------------------------------------
}

So wie ich den Code verstehe, mittelt er 16 Messwerte (wobei es bei der 
ersten Messung Probleme geben könnte, da dort nur ein einziger vorhanden 
sein könnte).
Dann berechnet er auf Grundlage des "Mittelwerts" (>>3 ist doch 
eigentlich nur ein Teilen durch 8...) den Tastgrad seiner PWM.
setpnt ist der eingestellte Ladestrom, der durch
  temp_16 = ADC_get();
  if (voltage_100 <= temp_16)
  {
    temp_32 = temp_16 - voltage_100;
    temp_32 = temp_32 * (pwm_300-pwm_100);
    temp_32 = temp_32 / (voltage_300-voltage_100);
    temp_32 = pwm_100 + temp_32;
  }
  else
  {
    temp_32 = voltage_100 - temp_16;
    temp_32 = temp_32 * (pwm_300-pwm_100);
    temp_32 = temp_32 / (voltage_300-voltage_100);
    temp_32 = pwm_100 - temp_32;
  }
  setpnt = temp_32;
berechnet wird.
Der ADC arbeitet voller Auflösung.
voltage_300, voltage_100, pwm_300 und pwm_100 sind Konstanten, die beim 
Kalibrieren im EEPROM gespeichert und dann wieder ausgelesen werden.

Autor: Paul Baumann (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@Rahul
Du hast mir jetzt einige Details klarer gemacht. Danke dafür!
Ich werde mal ein kleines Programm mit Bascom schreiben, was mir nur die 
PWM mittels Poti ansteuerbar macht. Dann kann ich sehen, ob ich den 
Strom
_überhaupt_ so weit runterkriege, wie ich es brauche. Denn ob ich mit 
der Drossel von 500 uH den Bereich von 10-300mA überhaupt erwische, habe 
ich noch nicht probiert.

Ich hänge Dir mal mein Programm an. (Achtung, ist so noch nicht 
komplett!!)

MfG Paul

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.