Forum: Mikrocontroller und Digitale Elektronik Benötige Hilfe bei C-Code für DIY Weller-Lötstation


von Max (Gast)


Lesenswert?

Hallo Leute,

ich habe mir eine kleie Lötstation hardwaretechnisch nach dem Vorbild 
von Martin Krumm gebastelt 
(http://www.martin-kumm.de/wiki/doku.php?id=05Misc:SMD_Loetstation).

Allerdings diese nicht mit einem Arduino sondern direkt mit einem 
Atmega168. Das ganze wurde damals auch in der Elektorausgabe 07/15 
veröffentlicht.

Dort habe ich den C-Code gefunden 
(https://www.elektormagazine.de/magazine/elektor-201507/27879).

Der Code funktioniert im Grunde. Nur die Regelung nicht so ganz, wie sie 
sollte.

In der while(1) wird permanent die Funktion "pwm_adjust();" aufgerufen. 
In dieser wird erstaml die PWM deaktiviert, um die Temperatur 
störungsfrei messen zu können, dann diese Temperatur umgerechnet und der 
neue PWM-Wert ermittelt und damit die PWM aktiviert.

Nun verhält es sich bei mir so, das die Lötspitze nur ganz ganz langsam 
aufheitzt. Für mich auch logisch, da sobald der PWM-Wert an 
func_pwm_on(pwm); übergeben wird auch schon wieder durch erneuten 
Funktionsaufruf in der While abgeschaltet wird.

Was habe ich da übersehen? In dem Arduino-Code von Martin Krumm scheint 
es genau so zu sein.

Hier ein Ausschnit vom Elektor-Code:
1
//function for disabling timer
2
void func_pwm_off()
3
{
4
  TCCR1A = 0x00;
5
  TCCR1B = 0x00;
6
}
7
//*********************************************************************************************************
8
//function used to configure timer 1 and set pwm value 
9
//timer is configured as 9 bit fast PWM with a prescalar of 256
10
void func_pwm_on(int value)
11
{
12
  if(value == 0)
13
  {
14
    func_pwm_off();   //got some noise distortion on making OVR1B = 0 and hence turned timer off 
15
  }
16
  else
17
  {
18
        TCCR1A |= (1 << COM1B1) |(1 << WGM11); //9bit fast PWM mode
19
    TCCR1B |= (1 << WGM12) | (1 << CS12);  //prescalar == 256 i.e. freq = 8/256 = 31.25KHz
20
    OCR1B = value ;
21
  }
22
}
23
//*********************************************************************************************************
24
void pwm_adjust(void)
25
{
26
      func_pwm_off();      //PWM switched OFF to read ADC
27
    _delay_ms(6);
28
    temp_adc = (getADCaveraged(0,10)/10UL); //ADC value read by taking mean value 10 samples
29
    _delay_ms(2);
30
    temperature = temp_adc * 0.42 + 30;    //conversion of ADC value to temperature
31
    temp_diff = set_temperature - temperature;    //diffrence calculation between set and actual temperature
32
    if (temp_diff > 0)
33
    {
34
      pwm = temp_diff * (set_temperature /6);
35
      if(pwm > 510)    //since PWM is 9 bit maximum value = 511
36
      {
37
        pwm = 510;
38
      }
39
      pwm_old = pwm;
40
    }
41
    else if(temp_diff < 0)
42
    {
43
      if((temperature - set_temperature) > 10)
44
      {
45
        pwm = 0;
46
      }
47
      else
48
      {
49
        pwm = pwm - (pwm/7);
50
        pwm_old = pwm;
51
      }
52
    }
53
    else
54
    {
55
        pwm = pwm_old;
56
    }
57
58
    func_pwm_on(pwm); 
59
}




Hier der Funktionsaufruf in der While, solange timer_15m_flag == 0. Also 
auf jeden Fall 15 Minuten dauerhaftes aufrufen von pwm_adjust();
1
while(1)
2
  {  
3
    if(timer_15m_flag == 0)
4
    {
5
      LcdPutc(0x8C);    
6
      lcdtemp (set_temperature);    //Displays set temperature on line 1 of LCD,default value = 50  
7
      pwm_adjust();

: Verschoben durch Moderator
von MWS (Gast)


Lesenswert?

Max schrieb:
> Also auf jeden Fall 15 Minuten dauerhaftes aufrufen

Nunja, das ist der Normalbetriebszustand, nach 15 Minuten schaltet der 
Lötmichel gnadenlos ab, wenn nicht "pushbutton" gedrückt wird.

Die notwendige zeitliche Verzögerung wird evtl. durch Aufruf der 
LCD-Routinen erreicht, LcdPutc verzögert jeweils um 1ms.

Mach' halt ein delay_ms(deiner_wahl) nach pwm_adjust() in der while() 
rein, dann merkst Du schon, was passiert.

von Max (Gast)


Lesenswert?

Danke, so hatte ich das auch gelöst. Dachte nur, ich hätte etwas 
übersehen. Ein LCD habe ich nicht. Stattdessen 7-Segmentanzeigen die per 
Interrupt gemuliplext werden.

von MWS (Gast)


Lesenswert?

Max schrieb:
> Dachte nur, ich hätte etwas übersehen.
Hast Du ja auch:
> Ein LCD habe ich nicht. Stattdessen 7-Segmentanzeigen die per
> Interrupt gemuliplext werden.
Keine Zeit vertrödelnde LCD-Routinen = keine Zeit für die Heizperiode.

von Manfred (Gast)


Lesenswert?

Max schrieb:
> von Martin Krumm gebastelt
> (http://www.martin-kumm.de/wiki/doku.php?id=05Misc:SMD_Loetstation).
Der Herr heißt Kumm und ist nicht kRumm!

> Nun verhält es sich bei mir so, das die Lötspitze nur ganz ganz langsam
> aufheitzt.
Heizen schreibt man ohne T!

> Allerdings diese nicht mit einem Arduino sondern direkt mit einem
> Atmega168.

Weil der AT328 so unverschämt teuer ist?

MWS schrieb:
>> Ein LCD habe ich nicht. Stattdessen 7-Segmentanzeigen die per
>> Interrupt gemuliplext werden.
> Keine Zeit vertrödelnde LCD-Routinen = keine Zeit für die Heizperiode.

Häh? Da ich 7-Segment nicht toll finde, hat meine Lötstation ein LCD 
über I2C. Ich habe Martins Meßverstärker im Prinzip übernommen, aber 
meine Software komplett selbst geschrieben.

Das Beschreiben des LCD dauert, ist mit sinnvollen Strukturen in der 
Software aber unkritisch - ich schreibe nur, wenn es lohnenswerte 
Änderungen gibt. Insgesamt ist das wohl einfacher, als sich in Echtzeit 
um ein LED-Multiplex kümmern zu müssen.

Eine Heizung ist immer träge, ich erlaube mir Einschaltzeiten zwischen 
25 und 350ms (ungereglte DC), wobei ich die Zeit aus delta-t mal 
ermitteltem Faktor errechne - ich habe 10ms pro K eingesetzt.

Hochheizen beim Einschalten liegt um 4 Sekunden, ein Überschwinger dabei 
bis zu 15°C ist zwar theoretisch unschön, aber in der Praxis komplett 
irrelevant.

von MWS (Gast)


Lesenswert?

Manfred schrieb:
> Häh?
Ja, so in etwa liest sich auch der Rest Deines Posts.

von Max (Gast)


Lesenswert?

Nicht streiten. Ist ja alles gut und und funktioniert. @Manfred: Hab mir 
das Ding mit Teilen aus der Bastelkiste zusammengebaut. Da war eben noch 
ein Atmega168 sowie ein Haufen 7-Segmentanzeigen. Ich persönlich finde 
das als ausreichend, da ich lediglich die Temeperatur darstellen möchte 
und vor allem sind die Dinger sehr gut ablesbar.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.