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.
Regards,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
Nick




Bookmarks