0,0 → 1,545 |
/* mija 2009 - process |
|
SW pro ATmega8 mereni + regulace teploty |
Fosc = 8192000Hz externi krystal |
|
|
ver.: 0.0 - start |
*/ |
|
#include <avr/io.h> |
#include <stdio.h> |
#include <math.h> |
|
#include "process.h" |
#include "key.h" |
#include "lcd.h" |
#include "clock.h" |
|
|
uint8_t ProcesStart(char *buffer,uint8_t key,uint16_t temp) |
{ |
static uint8_t proces = SOLDER; |
static uint8_t displ = 1; |
static uint16_t LastTemp; |
|
HeatOff(); |
if (key == TL1){ |
displ = 1; |
return proces; |
} |
if ((key == TL2)){ |
switch (proces) |
{ |
case POSITIV: proces = DRY; |
break; |
case DRY: proces = SOLDER; |
break; |
case SOLDER: |
default: proces = POSITIV; |
break; |
} |
displ = 1; |
} |
if (displ){ |
switch(proces) |
{ |
case POSITIV:sprintf(buffer,"\fPOSITIV\n%3dC ch",temp); |
break; |
case DRY: sprintf(buffer,"\fDRY\n%3dC ch",temp); |
break; |
case SOLDER: |
default: sprintf(buffer,"\fSOLDER\n%3dC ch",temp); |
} |
displ = 0; |
} |
else{ |
if (temp !=LastTemp){ |
sprintf(buffer,"\n%3d",temp); |
LastTemp=temp; |
} |
} |
return START; |
} |
|
/*uint8_t ProcesSolder(char *buffer,uint8_t key,uint16_t temp,Clockt_t *clock) |
{ |
enum{SOLDER_START,SOLDER_PREHEAT,SOLDER_SOLDER,SOLDER_COOL}; |
static uint8_t stav=SOLDER_START; |
static uint8_t timer=PREHEATTIME; |
static uint8_t TimerFlag=0; |
static uint8_t PrevSec; |
|
if (key != NOKEY){ |
stav = SOLDER_START; |
return START; |
} |
switch(stav) |
{ |
case SOLDER_START: |
timer = PREHEATTIME+1; |
TimerFlag = 0; |
stav = SOLDER_PREHEAT; |
ClockInit(0,0,0,clock); |
PrevSec = 0xff; |
sprintf(buffer,"\f"); |
break; |
case SOLDER_PREHEAT: |
if(temp >= PREHEATTEMPSTART) TimerFlag=1; |
ProcesHeat(PREHEATTEMP,temp); |
if (!timer){ |
stav = SOLDER_SOLDER; |
timer = SOLDERTIME+1; |
TimerFlag = 0; |
PrevSec = 0xff; |
} |
sprintf(buffer,"\rpreheat\n%3dC %3ds",temp,timer-1); |
break; |
case SOLDER_SOLDER: |
if(temp >= SOLDERTEMP) TimerFlag=1; |
ProcesHeat(SOLDERTEMP,temp); |
if (!timer){ |
stav = SOLDER_COOL; |
timer = COOLTIME+1; |
TimerFlag = 0; |
PrevSec = 0xff; |
} |
sprintf(buffer,"\rsolder \n%3dC %3ds",temp,timer-1); |
break; |
case SOLDER_COOL: |
HeatOff(); |
TimerFlag=1; |
if (!timer){ |
stav = SOLDER_START; |
PrevSec = 0xff; |
return START; |
} |
sprintf(buffer,"\rcool \n%3dC %3ds",temp,timer-1); |
break; |
default: HeatOff(); |
stav = SOLDER_START; |
return START; |
} |
if ((PrevSec != clock->sec) && TimerFlag){ |
PrevSec = clock->sec; |
timer --; |
} |
return SOLDER; |
}*/ |
|
uint8_t ProcesSolder(char *buffer,uint8_t key,uint16_t temp,Clockt_t *clock) |
{ |
enum{SOLDER_START,SOLDER_PREHEAT,SOLDER_SOLDER,SOLDER_COOL}; |
static uint8_t stav=SOLDER_START; |
static uint8_t timer=PREHEATTIME; |
static uint8_t Timer2=0; |
static uint8_t TimerFlag2=0; |
static uint8_t TimerFlag=0; |
static uint8_t FlagSolder=0; |
static uint8_t PrevSec; |
static uint16_t LastTemp=0; |
|
if (key != NOKEY){ |
stav = SOLDER_START; |
return START; |
} |
switch(stav) |
{ |
case SOLDER_START: |
timer = 0; |
TimerFlag = 0; |
Timer2 = 0; |
TimerFlag2 = 0; |
stav = SOLDER_PREHEAT; |
ClockInit(0,0,0,clock); |
PrevSec = 0xff; |
LastTemp = 0; |
sprintf(buffer,"\f"); |
break; |
case SOLDER_PREHEAT: |
if(temp >= PREHEATTEMPSTART) TimerFlag=1; |
if(temp >= PREHEATTEMP) TimerFlag2 = 1; |
if(temp >= PREHEATTEMPSTOP){ |
stav = SOLDER_SOLDER; |
|
TimerFlag = 0; |
FlagSolder = 0; |
TimerFlag2 = 0; |
Timer2 = timer; |
timer=0; |
break; |
} |
if (TimerFlag2 && (Timer2 < PREHEATTIMEOFF)){ |
if (LastTemp > temp) HeatOn(); |
else { |
HeatOff(); |
if ((clock->sec & 0x4) == 0x4) LastTemp = temp; //4sec vzorkovani; |
} |
//LastTemp=temp; |
} |
else HeatOn(); |
|
sprintf(buffer,"\rpreheat\n%3dC %3ds",temp,timer); |
break; |
case SOLDER_SOLDER: |
if(temp >= SOLDERTEMPSTART) TimerFlag=1; |
if(temp >= SOLDERTEMP) FlagSolder = 1; |
if (FlagSolder){ |
HeatOff(); |
if(temp <= SOLDERTEMPSTART){ |
stav = SOLDER_COOL; |
timer=0x1; |
TimerFlag = 0; |
break; |
} |
} |
else HeatOn(); |
if (TimerFlag) Timer2=timer; |
sprintf(buffer,"\rsolder \n%3dC %3ds",temp,Timer2); |
break; |
case SOLDER_COOL: |
HeatOff(); |
TimerFlag=1; |
if (!timer){ |
stav = SOLDER_START; |
//PrevSec = 0xff; |
return START; |
} |
sprintf(buffer,"\rcool \n%3dC",temp); |
break; |
default: HeatOff(); |
stav = SOLDER_START; |
return START; |
} |
if ((PrevSec != clock->sec)){ |
PrevSec = clock->sec; |
if (TimerFlag)timer ++; |
if (TimerFlag2) Timer2 ++; |
} |
|
return SOLDER; |
} |
|
uint8_t ProcesPositiv(char *buffer,uint8_t key,uint16_t temp,Clockt_t *clock) |
{ |
static uint8_t time = 0; |
static uint8_t PrevSec; |
|
if (!time){ |
time = POSITIVTIME+1; |
ClockInit(0,0,0,clock); |
PrevSec = 1; |
} |
ProcesHeat(POSITIVTEMP,temp); |
if (key == TL1) time +=5; |
if (key == TL2) { |
time = 0; |
return START; |
} |
if (PrevSec != clock->sec){ |
PrevSec = clock->sec; |
if (PrevSec == 0) time --; |
} |
sprintf(buffer,"\n%3dC %3dm",temp,time); |
if (!time) return START; |
return POSITIV; |
} |
|
uint8_t ProcesDry(char *buffer,uint8_t key,uint16_t temp,Clockt_t *clock) |
{ |
static uint8_t time; |
static uint8_t PrevSec; |
|
if (!time){ |
time = DRYTIME+1; |
ClockInit(0,0,0,clock); |
PrevSec = 1; |
} |
ProcesHeat(DRYTEMP,temp); |
if (key == TL1) time +=5; |
if (key == TL2) { |
time = 0; |
return START; |
} |
if (PrevSec != clock->sec){ |
PrevSec = clock->sec; |
if (PrevSec == 0) time --; |
} |
sprintf(buffer,"\n%3dC %3dm",temp,time); |
if (!time) return START; |
return DRY; |
} |
|
/* |
uint8_t ProcesTest(char *buffer,uint8_t key,uint16_t temp,Clockt_t *clock) |
{ |
|
HeatOff(); |
sprintf(buffer,"\r%2d:%02d:%02d\n%3dC ",clock->hour,clock->min,clock->sec,temp); |
|
if (key == TL2) return START; |
return TEST; |
}*/ |
|
void ProcesDispl(char *data) |
{ |
uint8_t a,b; |
|
for (a=0;a<MAXDISPLBUFFER;a++) |
{ |
switch (*(data+a)) |
{ |
case 0: *data = 0;return; |
case '\n': LCD_gotoxy(1,2);break; |
case '\r': LCD_gotoxy(1,1);break; |
case '\f': LCD_gotoxy(1,1); |
for (b=0;b<8;b++) LCD_putc(0x20); |
LCD_gotoxy(1,2); |
for (b=0;b<8;b++) LCD_putc(0x20); |
LCD_gotoxy(1,1); |
break; |
default : LCD_putc(*(data+a)); |
} |
} |
*data = 0; |
} |
|
void ProcesTemp(uint16_t adc,uint16_t *temp) |
{ |
double Rpt; |
double Tpt; |
|
Rpt = 1.0*adc*2350.0/1024.0; |
|
#define A 3.90802e-3 |
#define B -5.802e-7 |
|
Tpt = (-A + sqrt(A*A - 4*B*(1.0 - Rpt/1000.0)))/2.0/B; |
//Tpt = (-A + sqrt(A*A - 4*B*(1.0 - Rpt)))/2.0/B; |
//Tpt = (Rpt/1000.0 - 1.0)/A; |
|
*temp = (int16_t)Tpt; |
} |
|
/* |
void ProcesHeat(uint16_t temp,uint16_t ActualTemp) |
{ |
enum{HEAT_STABLE,HEAT_UP_1,HEAT_UP_2,HEAT_UP_3,HEAT_UP_4,HEAT_UP_5,HEAT_DOWN_1,HEAT_DOWN_2,HEAT_DOWN_3,HEAT_DOWN_4,HEAT_DOWN_5}; |
static uint8_t stav = HEAT_STABLE; |
static uint8_t PrevTemp = 0; |
static uint8_t TimeChange=0; |
|
if (ActualTemp < (temp) |
|
switch(stav) |
{ |
case HEAT_STABLE: |
if (ActualTemp>temp) HeatOff(); |
else HeatOn(); |
break; |
case HEAT_UP_1: |
break; |
case HEAT_UP_2: |
break; |
case HEAT_UP_3: |
break; |
case HEAT_UP_4: |
break; |
case HEAT_UP_5: |
break; |
case HEAT_DOWN_1: |
break; |
case HEAT_DOWN_2: |
break; |
case HEAT_DOWN_3: |
break; |
case HEAT_DOWN_4: |
break; |
case HEAT_DOWN_5: |
break; |
} |
if (ActualTemp>temp) HeatOff(); |
else HeatOn(); |
} |
*/ |
/* |
void ProcesHeat(uint16_t GequestTemp,uint16_t ActualTemp) |
{ |
|
#define TERM_STOP 15 //teplotni rozdil do regulace - trouba topi |
#define T1 20 //vzorkovani pøi nabìhu teploty [s] |
#define T2 10 //vzorkovani pøi poklesu teploty [s] |
#define T3 5 //vzorkovani pøi ustalene teplotì [s] |
#define T4 5 //doba topení [s] |
#define MAINCYKLSPEED 100 |
|
static uint8_t delta_s=0; |
static uint16_t T_LAST=0; |
static uint8_t clock=MAINCYKLSPEED; //pocet opakovani teto fce za 1 sekundu |
|
|
|
if (!(-- clock)) {delta_s++;clock = MAINCYKLSPEED;} |
|
if( ActualTemp < (GequestTemp - TERM_STOP)){ |
HeatOn(); |
delta_s=0; |
T_LAST=ActualTemp; |
} |
else{ |
if (ActualTemp < GequestTemp){ |
if (ActualTemp == T_LAST){ |
if (delta_s < T1) HeatOff(); |
else HeatOn(); |
if (delta_s > (T1 + T4)) delta_s = 0; |
} |
else{ |
if (T_LAST > ActualTemp) delta_s=(T1 - T2); |
else delta_s=0; |
T_LAST=ActualTemp;HeatOff(); |
} |
} |
else{ |
HeatOff();T_LAST=ActualTemp; |
if (ActualTemp == GequestTemp) delta_s = (T1 - T3); |
else delta_s = 0; |
} |
} |
} |
*/ |
/* |
void ProcesHeat(uint16_t RequestTemp,uint16_t ActualTemp) |
{ |
|
#define TERM_STOP 15 //teplotni rozdil do regulace - trouba topi |
#define T1 20 //vzorkovani pøi nabìhu teploty [s] |
#define T2 10 //vzorkovani pøi poklesu teploty [s] |
#define T3 5 //vzorkovani pøi ustalene teplotì [s] |
#define T4 5 //doba topení [s] |
#define PERIOD 15 //[s] |
#define MAINCYKLSPEED 100 |
|
static uint8_t delta_s=0; |
static uint16_t LastTemp=0; |
static uint8_t clock=MAINCYKLSPEED; //pocet opakovani teto fce za 1 sekundu |
static uint8_t Pwm=0; |
static uint8_t DutyPwm = 0; |
static uint8_t FlagTemp = 1; |
static uint8_t FlagPwm = 0; |
|
|
|
if (!(-- clock)){ |
delta_s++; |
clock = MAINCYKLSPEED; |
if ((++Pwm) > PERIOD){ |
Pwm = 0; |
FlagPwm = 1; |
} |
} |
|
if( ActualTemp < (RequestTemp - TERM_STOP)){ |
DutyPwm = PERIOD; |
LastTemp = ActualTemp; |
FlagTemp=1; |
} |
else{ |
if (FlagTemp){ |
DutyPwm=0; |
FlagTemp = 0; |
} |
else |
if (FlagPwm) |
{ |
FlagPwm=0; |
if (ActualTemp >= RequestTemp){ |
if(LastTemp < ActualTemp ) { if (DutyPwm) DutyPwm --;} |
} |
else{ |
if (LastTemp >= ActualTemp) {if (DutyPwm<PERIOD)DutyPwm ++;} |
} |
LastTemp = ActualTemp; |
} |
} |
|
if(ActualTemp<RequestTemp){ |
if (DutyPwm >= Pwm) HeatOn(); |
else HeatOff(); |
} |
else HeatOff(); |
|
}*/ |
|
void ProcesHeat(uint16_t RequestTemp,uint16_t ActualTemp) |
{ |
|
#define TERM_STOP 15 //teplotni rozdil do regulace - trouba topi |
|
#define PERIOD 15 //[s] |
#define MAINCYKLSPEED 100 |
|
static uint8_t delta_s=0; |
static uint16_t LastTemp=0; |
static uint8_t clock=MAINCYKLSPEED; //pocet opakovani teto fce za 1 sekundu |
static uint8_t Pwm=0; |
static uint8_t DutyPwm = 0; |
static uint8_t FlagTemp = 1; |
static uint8_t FlagPwm = 0; |
|
|
|
if (!(-- clock)){ |
clock = MAINCYKLSPEED; |
if ((++Pwm) > PERIOD){ |
Pwm = 0; |
FlagPwm = 1; |
} |
} |
|
if( ActualTemp < (RequestTemp - TERM_STOP)){ |
DutyPwm = PERIOD; |
LastTemp = ActualTemp; |
FlagTemp=1; |
} |
else{ |
if (FlagTemp){ |
DutyPwm=0; |
FlagTemp = 0; |
} |
else |
if (FlagPwm) |
{ |
FlagPwm=0; |
if (ActualTemp >= RequestTemp){ |
if (ActualTemp != RequestTemp) |
if(LastTemp < ActualTemp ){ |
//if ((ActualTemp-LastTemp) > 1) |
if (DutyPwm) DutyPwm --; |
} |
} |
else{ |
if (LastTemp >= ActualTemp){ |
//if ((ActulaTemp - LastTemp)>1) |
if (DutyPwm<PERIOD)DutyPwm ++; |
} |
if(LastTemp < ActualTemp ){ |
if ((ActualTemp-LastTemp) > 5) |
if (DutyPwm) DutyPwm --; |
} |
} |
LastTemp = ActualTemp; |
} |
} |
|
if(ActualTemp < RequestTemp) |
{ |
if (DutyPwm == PERIOD) HeatOn(); |
else{ |
if (DutyPwm > Pwm) HeatOn(); |
else HeatOff(); |
} |
|
} |
else HeatOff(); |
|
} |