TEC controller


Closed Thread
Results 1 to 19 of 19

Thread: TEC controller

Hybrid View

  1. #1
    Join Date
    Oct 2012
    Posts
    83


    Did you find this post helpful? Yes | No

    Default Re: TEC controller

    Just a quick update: I’ve tried all three suggested methods and they all work as expected.
    I will do some more hardware changes, now that I have a stable test code. I will experiment especially with frequency changes and inductors values. I’m trying to get as much efficiency as possible.
    What is encouraging though is that running the prototype for long time does not generate heat at all. The main power components are cold and the current draw (from the 12V source) swings between 1A and 2.5A.
    I will post the latest working code as soon as I get it cleaned up.

    Nick

  2. #2
    Join Date
    Oct 2012
    Posts
    83


    Did you find this post helpful? Yes | No

    Default Re: TEC controller

    This is the working code. It steps up through 21 steps of PWM (from 30 to 50) and then steps down (from 50 to 20). The result is an output voltage between 5.5V and 8.5V (the numbers are rounded up). This is design for testing the flexibility of the system only. Final code will implement a temperature controlling algorithm. BTW I switched to PIC16F819 since this is the PIC I'm going to use for this task.

    Code based on Dave's input (183):
    Code:
    @__config_device_pic16f819
    @__config_wdt_off
    @__config_hs_osc
    @__config_pwrt_on
    @__config_mclr_off
    @__config_lvp_off
    @__config_protect_on
    @__config_CCP1_RB2
    
    OSCCON=%01110111     
    DEFINE OSC 8        
                
    i           var         word
    pwm_out     var         PORTB.2
    pwm_pars    var         word
    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 
        goto Main
    set_pwm_pars:
         CCPR1L = pwm_pars >> 2
         CCP1CON=$0C|((pwm_pars&$3)<<4) 
         RETURN
    Main:
         for i=min_pwm to max_pwm
         pwm_pars = i
         gosub set_pwm_pars
         pause 250
         next
         for i=max_pwm to min_pwm step -1
         pwm_pars = i
         gosub set_pwm_pars
         pause 250
         next
         Pause 5000
    Goto Main
    With the same main loop I changed the subroutine set_pwm_pars based on Pedja089 input (163):

    Code:
    set_pwm_pars:
         CCP1CON.5 = pwm_pars.1                
         CCP1CON.4 = pwm_pars.0
         CCPR1L = pwm_pars >> 2
         RETURN
    Finally my simplified version for the subroutine (187):

    Code:
    set_pwm_pars:
         CCP1CON.5 = pwm_pars.1                
         CCP1CON.4 = pwm_pars.0
         CCPR1L = pwm_pars / 4
         RETURN
    The output from all is the same (as expected). Cannot comment on execution speed and for my purposes it doesn’t really matter. I will only set a step, based on the temperature control algorithm, and sit on it for a while. I’m sure that the wine will not mind a few microseconds shifted response.
    The one difference between the three versions is the code space required. The numbers in parentheses are showing that.

    So far I’m happy with my results.
    I will work on the hardware for the next few days and start working on the temperature control algorithm after that.
    Before I start this new task I’m asking all the people in this forum that might have some experience in this field: Am I on the right track? Is there a better way to do it?
    I love its simplicity and the fact that I fully understand how it works but in the same time I hate to find it out that is wrong after I already spent a lot of time on it.

    As always looking forward for input.

    Nick

  3. #3
    Join Date
    Mar 2003
    Location
    Commerce Michigan USA
    Posts
    1,166


    Did you find this post helpful? Yes | No

    Default Re: TEC controller

    The only problem I can see is that you are assuming the other bits in the CCP1CON are always set correctly? For the sacrifice of a few extra instructions I would prefer to have ALL register bits set as in: CCP1CON=$0C|((pwm_pars&$3)<<4)
    Dave Purola,
    N8NTA
    EN82fn

  4. #4
    Join Date
    Oct 2012
    Posts
    83


    Did you find this post helpful? Yes | No

    Default Re: TEC controller

    Hi Dave,

    You are making a good point. It comes with lock of experience on my side.
    As I said before I have two good qualities: learning extremely slow and, in contrast, forgetting extremely fast.
    At this point I’m not looking to save program space so I guess playing safe will be a good idea.
    Any input on the hardware side?

    Nick

  5. #5
    Join Date
    Oct 2012
    Posts
    83


    Did you find this post helpful? Yes | No

    Default Re: TEC controller

    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

  6. #6
    Join Date
    Mar 2003
    Location
    Commerce Michigan USA
    Posts
    1,166


    Did you find this post helpful? Yes | No

    Default Re: TEC controller

    Nick, The statement:

    if pwm_pars>max_pwm then pwm_pars=max_pwm
    endif

    can be made as such: pwm_pars = pwm_pars min max_pwm

    That way no if then is needed.
    Dave Purola,
    N8NTA
    EN82fn

  7. #7
    Join Date
    Oct 2012
    Posts
    83


    Did you find this post helpful? Yes | No

    Default Re: TEC controller

    Hi David,

    Thank you for the hint. It will be first on my “To do” list.
    I noticed it in your first post and mark it as a good candidate for the time when I will do code optimization. I just slapped the code together to see how the system works in a dynamic scenario and prove the concept. The way I thought it is that when the actual temperature is way higher than set temperature the system will push maximum power. The closer the two temperatures are the system reduces its output. Only when the actual temperature is lower than set temperature the TEC will be turned OFF. This reduces the number of ON / OFF cycles which I understand the TECs are not happy with.
    I am open to any other suggestions that will improve the project.

    Nick

Similar Threads

  1. Repeater ID and controller
    By Macgman2000 in forum mel PIC BASIC Pro
    Replies: 12
    Last Post: - 30th March 2012, 00:06
  2. SMS Controller
    By savnik in forum mel PIC BASIC Pro
    Replies: 2
    Last Post: - 8th September 2006, 16:12
  3. temperature controller
    By PoTeToJB in forum mel PIC BASIC Pro
    Replies: 3
    Last Post: - 24th April 2006, 21:01
  4. PID CONTROLLER help..
    By tkly36 in forum mel PIC BASIC Pro
    Replies: 2
    Last Post: - 12th April 2006, 08:19

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts