I got all the hardware working and wrote a simple temperature control program. Nothing fancy.
The code drives the TEC with different power output levels depending on how far the real temperature is from the set temperature.
I don’t have yet a mechanism of setting the target temperature but this is just to prove that the system works.
Since the major hardware is in place and the cooler is basically functional I will settle for now for a fixed, preprogrammed target temperature.
The ICSP connector for the 16F819 is accessible and I will play with the code to get more features.
I’m forced to take a break from the project but I will get back to it when time permits.
For now 62⁰F should be fine on most of the wines I drink so I’ll make it default.
Anyway it has been a fun weekend project and what makes it special is the fact that I did not have to order any parts. Recycling old junk makes me feel really good.
For all interested below is the simple control code, not fully tested since I just finished it last night. There are few things in the code that are not fully implemented (serial output will be used for a LCD display, hysteresis, id (to diferenciate between the two chambers). These variables will be used for future development when time comes.
Code:
@__config_device_pic16f819
@__config_wdt_off
@__config_hs_osc
@__config_pwrt_on
@__config_mclr_off
@__config_lvp_off
@__config_protect_on
DEFINE OSC 8
DEFINE DEBUG_REG PORTB
DEFINE DEBUGIN_REG PORTB
DEFINE DEBUG_BIT 6
DEFINE DEBUGIN_BIT 7
DEFINE DEBUG_MODE 1
DEFINE DEBUG_BAUD 38400
DEFINE ADC_BITS 8
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 50
ADCON1=%01001110
pwm_out var PORTB.2
adval var word
val_1 var byte
val_2 var byte
val_3 var byte
new var word
act_temp var byte
set_temp var byte
new_temp var byte
temp_index var byte
i var word
pwm_pars var word
id var byte
start_ch con 126
end_sym con 251
samples con 39
divider con 20
hysteresis con 2
min_pwm con 30
max_pwm con 50
CCP1CON = %00001100
PR2 = 15
CCPR1L = 0
CCP1CON.5 = 0
CCP1CON.4 =0
High pwm_out
Pause 500
Low pwm_out
T2CON.2 = 1
set_temp=62
goto main
send_out:
debug start_ch,id,val_1,val_2,val_3,end_sym
return
set_pwm_pars:
CCPR1L = pwm_pars >> 2
CCP1CON=$0C|((pwm_pars&$3)<<4)
return
read_act_temp:
new = 0
For temp_index = 1 TO samples
ADCIN 0,adval
new = new + adval
Next
act_temp=new/divider
If act_temp <= set_temp then
pwm_pars = 0
else
pwm_pars = min_pwm+(act_temp - set_temp)
if pwm_pars>max_pwm then pwm_pars=max_pwm
endif
gosub set_pwm_pars
val_1=act_temp
val_2=pwm_pars
val_3=set_temp
Return
Main:
gosub read_act_temp
gosub send_out
pause 1500
goto Main
end
Regards,
Nick
Bookmarks