PWM fan speed control with a 12F683


Closed Thread
Results 1 to 18 of 18

Hybrid View

  1. #1
    Join Date
    Sep 2010
    Location
    Las Vegas, NV
    Posts
    305

    Default PWM fan speed control with a 12F683

    Ladies and Gents,
    I'm trying to use a 12F683 to control a fan motor. I want to be able to push a button and have the fan cycle through speeds from off to high in 3 steps.

    The problem is I can't figure out how to use PWM indefinitely.

    This is my program. I've got the push button on GPIO.3 and the fan currently on GPIO.5. It works kinda but the selected speed only lasts for the length of time PWM is set. During that time you can't select another speed.

    Your thoughts would be appreciated.

    clear
    define osc 4
    @ device mclr_off 'the input will be through GPIO.3
    ansel = 0 'all ports digital
    cmcon0 = 7 'turn off comparators
    adcon0 = 0

    touchnumber var byte 'count the number of touches
    outTOfan var gpio.5 'LED symbolizing fan speed
    trisio = %001111
    touchnumber = 0

    starthere:
    outtofan = 0
    If gpio.3 = 1 then goto main
    goto starthere
    main:
    touchnumber = touchnumber + 1
    if touchnumber =4 then touchnumber = 0
    select case touchnumber
    case 0
    gpio.5 = 0
    case 1
    pwm gpio.5, 60,1000
    case 2
    pwm gpio.5,150, 1000
    case 3
    pwm gpio.5, 255, 1000
    end select
    goto starthere

    end
    Last edited by AvionicsMaster1; - 30th June 2011 at 20:55. Reason: add tags

  2. #2
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898


    Did you find this post helpful? Yes | No

    Default Re: PWM fan speed control with a 12F683

    use HPWM instead.

    You set the frequency, set the duty cyle (motor speed)... and you're done. It runs in background with the internal CCP module and it will run as long as you want... or power failure (duh....).
    Steve

    It's not a bug, it's a random feature.
    There's no problem, only learning opportunities.

  3. #3
    Join Date
    Jan 2006
    Location
    Istanbul
    Posts
    1,185


    Did you find this post helpful? Yes | No

    Default Re: PWM fan speed control with a 12F683

    Try this code.
    LED is on GPIO.2
    Button must be pulled down to GND by a resisitor (10K).
    And must be pulled high by the button (to Vdd).



    Code:
    @ DEVICE PIC12F683, FCMEN_OFF, IESO_OFF, INTRC_OSC_NOCLKOUT , WDT_OFF, PWRT_ON, MCLR_OFF, PROTECT_ON, BOD_OFF
    OSCCON  = %01110001     ' Internal 8MHz osc.
    DEFINE OSC 8
    ' ======= Common Settings =================================
    ADCON0 = 0
    ANSEL  = 0
    CMCON0 = 7           ' Comparators off.
    TRISIO = 0
    GPIO   = 0
    ' ============= PWM Settings =========
    CCP1CON =   %00001100       ' CCP1, PWM mode
    PR2     =   250             '
    T2CON   =   %00000101       ' TMR2 on, prescaler 1:4
    CCPR1L  = 0
    Speed var CCPR1L
    Btn  Var GPIO.3  ' Assuming ; the pin is pulled down to GND by 10K resistor, and button pulls it high to Vdd.
    ' LED is connected to GPIO.2 (on board PWM module)
    pause 10
    Start:
        if btn then 
            if speed + 85 < 256 then    ' 0, 85, 170, 255, 0 
                speed = speed + 85
            else
                speed = 0
            endif
     
            while btn : pause 20 : wend
        endif
     
        pause 2
    goto Start
    end
    "If the Earth were a single state, Istanbul would be its capital." Napoleon Bonaparte

  4. #4
    Join Date
    Sep 2010
    Location
    Las Vegas, NV
    Posts
    305


    Did you find this post helpful? Yes | No

    Default Re: PWM fan speed control with a 12F683

    Thanks Sayzer,
    I've had some other issues to resolve before I finally got to try it today. It works fine and does exactly what I want to accomplish.

    I do have a few questions about how the voodoo that itdoo works but I want to experiment a bit more before I ask them.
    Last edited by AvionicsMaster1; - 19th July 2011 at 03:13. Reason: fat fingered

  5. #5
    Join Date
    Sep 2010
    Location
    Las Vegas, NV
    Posts
    305


    Did you find this post helpful? Yes | No

    Default Re: PWM fan speed control with a 12F683

    Since you were able to provide an answer for that, do you have any ideas how I can run two outputs simultaneously but each at different output levels?

    What I want to do is have a switch turn on a fan at stepped levels and another switch that controls a light/LED that can be set to a different level.

    I know that isn't what the post started with but I assumed I'd be able to use the PWM command for setting the levels and maybe erroneously thought I could accomplish that for two different outputs.

  6. #6
    Join Date
    Jan 2006
    Location
    Istanbul
    Posts
    1,185


    Did you find this post helpful? Yes | No

    Default Re: PWM fan speed control with a 12F683

    Since you have an onboard PWM module running in the background, you can also have a second pwm by software running in the foreground.

    The code would be as follows.
    You are now using two buttons, one is for LED and the other is for Fan.
    I suggest that you use Fan on GPIO.2 (on board module), and LED on GPIO.5 pin.
    Also, you have button on GPIO.3, and you are puling it down .
    Nowyou have a second button but is is being pulled high.



    Code:
    @ DEVICE PIC12F683, FCMEN_OFF, IESO_OFF, INTRC_OSC_NOCLKOUT , WDT_OFF, PWRT_ON, MCLR_OFF, PROTECT_ON, BOD_OFF
     
     OSCCON   = %01110001         ' Internal 8MHz osc.
     DEFINE OSC 8
     
     ' ======= Common Settings =================================
     ADCON0 = 0
     ANSEL   = 0
     CMCON0 = 7                     ' Comparators off.
     
     TRISIO = 0
     GPIO     = 0
     
     ' ============= PWM Settings =========
     CCP1CON =     %00001100             ' CCP1, PWM mode
     PR2         =     250                         '
     T2CON     =     %00000101             ' TMR2 on, prescaler 1:4
     CCPR1L   = 0
     Speed VAR CCPR1L ' Speed variablefor LED brightness.   
     
     Speed2 VAR BYTE   ' Speed2  variable for fan speed.
     
     ' GPIO.0         ' Empty.
     ' GPIO.1         ' Empty.
     ' GPIO.2         ' LED is connected to GPIO.2 (on board PWM module)
     Btn   VAR GPIO.3   ' Assuming ; the pin is pulled down to GND by 10K resistor, and button pulls it high to Vdd.
     Btn2 VAR GPIO.4   ' Second button. But the pin is pulled high internally. So no external pull up or pull down resistor is required.
                      ' Have a button between this pin and GND (unlike the first button).   
     Fan   VAR GPIO.5   ' Fan motor output. 
     
     
     INPUT Btn2             ' Make the second button pin an input pin.
     OPTION_REG.7 = 0 '
     WPU.4 = 1               ' Enable internal pull up resisitor for Second button pin (GP4)
     
     
     
     PAUSE 10
     Speed2 = 0
     
     ' First button, btn, controls the LED via onboard PWM module.
     ' Second button controls the FAN via software PWM via GPIO.5 output pin and GPIO.4 input pin.
     ' Having the Fan on GPIO.2 and LED on GPIO.5 would be better I think.
     
     Start:
     
              IF Btn = 1 THEN           ' When this button  is pressed, it pulls the pin high.
                     IF Speed + 85 < 256 THEN       ' 0, 85, 170, 255, 0 
                              Speed = Speed + 85
                     ELSE
                             Speed = 0
                     ENDIF
             
             WHILE Btn = 1           ' When this button is being pressed, have no interruption on Fan control.
                             PWM Fan,Speed2,1   
                        WEND
         ENDIF
         
         IF Btn2 = 0 THEN           ' When this button  is pressed, it pulls the pin low.
                     IF Speed2 + 85 < 256 THEN       ' 0, 85, 170, 255, 0 
                              Speed2 = Speed2 + 85
                     ELSE
                             Speed2 = 0
                     ENDIF
             
             WHILE Btn2 = 0                 ' When this button is being pressed, have no interruption on Fan control.
                             PWM Fan,Speed2,1    
                         WEND
         ENDIF
         
         
         PWM Fan,Speed2,1   ' Always drive the fan output.  
         
         
     GOTO Start
     
     END
    "If the Earth were a single state, Istanbul would be its capital." Napoleon Bonaparte

Members who have read this thread : 1

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

Tags for this Thread

Posting Permissions

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