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();
|