SPWM_INT - Multiple Software PWM Question


Closed Thread
Results 1 to 20 of 20

Hybrid View

  1. #1


    Did you find this post helpful? Yes | No

    Default Re: SPWM_INT - Multiple Software PWM Question

    If I switch to 16Mhz OSC I can get 10-bit resolution at 16kHz:

    Name:  Mr_E_PWM_Calc.PNG
Views: 1204
Size:  15.2 KB

    So here's the thing: if I set up my ADCIN to use 10-bit then presumably I can get 0-1023 values from my trim pot but since 1000 is the max duty cycle anything above that changes nothing. Will it cause a problem if I pass that in to the duty cycle registers (e.g. 1012) or do I need to set a programmatic limit at 1000? Same applies to 8-bit - max duty cycle is 250 but 8-bit resolution on ADCIN would give me 0-255, so anything greater than 250 does nothing.

  2. #2
    Join Date
    Oct 2005
    Location
    Sweden
    Posts
    3,612


    Did you find this post helpful? Yes | No

    Default Re: SPWM_INT - Multiple Software PWM Question

    As Darrel wrote earlier, anything above the highest value (1000 in this case) will cause 100% dutycycle - all that's happening is that you get a flat spot at the very top of the otherwise linear curve. Only you know if that will be an actual problem for you.
    If you want to scale your 0-1023 ADC input value to 0-1000 dutycycle value you could do something like DutyCycle=ADCValue**64063 or, for 8bit resolution, DutyCycle=ADCValue**64251.

    /Henrik.

  3. #3


    Did you find this post helpful? Yes | No

    Default Re: SPWM_INT - Multiple Software PWM Question

    Got it - thanks Henrik (and Darrel). I've been playing around with Mr E's multi-calc with various OSC & freq values - I never know there were upper limits to duty cycles before and that they depended on the prescaler as well. All of this is hidden if using pbp's PWM or HPWM, but I want to get into the down-and-dirty of PWM registers to really understand this stuff (besides, it's fun). For the motor spinning up aspect, I had read that it's not good to do something like this:

    Code:
    For dutyval = 0 to 255
        HPWM 1, dutyval, 16000
    Next dutyval
    because the HPWM command changes more than just the duty cycle register values. Plus, on my PIC16F1824 I want to use CCP3 & CCP4 which you can't do with pbp's HPWM.

  4. #4
    Join Date
    Oct 2005
    Location
    Sweden
    Posts
    3,612


    Did you find this post helpful? Yes | No

    Default Re: SPWM_INT - Multiple Software PWM Question

    Hi,
    Basically the PWM generator consists of a counter, a dutycycle register and a comparator.
    The PWM period (therefor frequency) is the time it takes for the counter to count from 0 to whatever value makes it roll over back to 0.

    * When the PWM period starts (counter=0) the output is set.
    * When the counter value equals that of the dutycycle register (that's the comparators job) the output is reset.
    * The counter continues counting up, rolls over and the cycle repeats.

    Now, to make it easy, concider the counter rolling over at 99 making it a 100 "step" counter. If you set the dutycycle value to 50 the output will turn on and stay on untill the counter hits 50 then turn off. The counter continues counting up to 99, rolls over and the cycle repeats. The output is on for 50 "ticks" and off for 50 "ticks" - you have 50% dutycycle.

    If the counter is "ticking" at 1MHz the PWM period would be 100us (f=10kHz). Now, if you want to change the PWM frequency you can do one of two things.
    A) Change the frequency at which the counter "ticks".
    B) Change at which value the counter rolls over (this is the PR2 value as described earlier).

    Changing the "counter roll-over value" so that the counter rolls over at 49 instead of 99 will cause the PWM frequency to double but it'll also cause your resolution to be cut in half since there's now only 50 "steps". So when you previously set the dutycycle value to 50 to get 50% you'd now have to set it to 25.

    What makes it a little bit tricky to understand in the PIC is how you can have PR2 set to 200 and still be able to set your dutycycle value to 600 (for example). This is because of those additional two bits of the counter (and the dutycycle register and comparator) so when you set PR2 to 200 the counter actually counts from 0 to 800 (rolling when hitting 801).

    As for your HPWM example (and I'm not sure about this) I think that the HPWM command sets everything up every time so to speak. Even if all you're actually doing is changing the dutycycle it most likely does some other stuff behind the scenes (you MAY wanted to change the frequency or the PWM MAY not have been running) so there may be glitches in the output when trying to change the dutycyle by rapidly "calling" HPWM like that.

    Well, enough rambling, time to hit the sack for me.

    /Henrik.

  5. #5


    Did you find this post helpful? Yes | No

    Default Re: SPWM_INT - Multiple Software PWM Question

    Any idea why I get this ASM warning when compiling my code? I've included the snippet of code which I think is applicable, and the full code too.

    Name:  ASM_Warning.png
Views: 821
Size:  16.7 KB

    Code:
    ' ***************************************************************
    ' Set up registers for PWM on CCP3 & 4
    ' ***************************************************************
    
    ; Use Mister E's MultiCalc to calculate PR2 value & hence Prescaler setting
    ; for T2CON:
    
    ; http://www.picbasic.co.uk/forum/content.php?r=159-New-PIC-Utility.-PICMultiCalc
    
    ; Can also use this web-based site:
    ; http://www.micro-examples.com/public/microex-navig/doc/097-pwm-calculator.html
    
    CCP3CON = %00001100         ; Use CCP3 in PWM mode
    CCP4CON = %00001100         ; Use CCP4 in PWM mode
    
    ;CCPTMRS = %00000000         ; Use Timer2 for all CCPs in PWM mode
                                 ; (The default appears to be Timer2, so no need
                                 ; to set it explicitly)
                                 
    T2CON   = %00000100         ; Timer2 on with 1:1 prescaler
    PR2     = 249               ; For 16Mhz OSC the desired output of 16,000Hz is
                                ; achieved with this PR2 value (10-bit resolution
                                ; with 1:1 prescaler)
    
    MinDuty CON 50              ; Lowest possible duty cycle at which motor spins
    MaxDuty CON 1000            ; Maximum duty cycle available with PR2 = 249 and
                                ; 1:1 prescaler (According to Darrel:
                                ;      MaxDuty = (PR2 + 1) * 4
    
    DutyVar3 VAR WORD
    DutyVar4 VAR WORD
    
    ' Spin up motors to saved value of _MotorRPM
    ' (Below a cycle of MinDuty, the motors don't move at all)
    FOR I = (MinDuty - 10) to MotorRPM
        DutyVar3  = I
        CCP3CON.4 = DutyVar3.0
        CCP3CON.5 = DutyVar3.1
        CCPR3L    = DutyVar3 >> 2
    
        IF PortEngDir = 0 THEN
            DutyVar4  = I
            CCP4CON.4 = DutyVar4.0
            CCP4CON.5 = DutyVar4.1
            CCPR4L    = DutyVar4 >> 2    
        ELSE
            DutyVar4  = (MaxDuty - I)
            CCP4CON.4 = DutyVar4.0
            CCP4CON.5 = DutyVar4.1
            CCPR4L    = DutyVar4 >> 2        
        ENDIF
    
        pause 33
    NEXT I
    Full PIC code:
    PIC16F1825_Code.txt
    Last edited by RossWaddell; - 20th January 2013 at 22:54.

  6. #6
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959


    Did you find this post helpful? Yes | No

    Default Re: SPWM_INT - Multiple Software PWM Question

    Those warnings aren't coming from the section you posted.

    You are trying to use a value of 500 with byte sized EEPROM locations.

    But I'm pretty sure you really want WORD sized EEPROM locations.
    Change this ...
    Code:
    ' ***************************************************************
    ' EEPROM Variables
    ' ***************************************************************
    
    MotorRPM_Default   CON  500 ; half speed if max is 1000
    EE_MotorRPM        DATA MotorRPM_Default
    MotorRPM           VAR  BYTE
    READ EE_MotorRPM, MotorRPM
    
    PortEngDir_Default CON  0
    EE_PortEngDir      DATA PortEngDir_Default
    PortEngDir         VAR  BYTE
    READ EE_PortEngDir, PortEngDir
    ... to this ...
    Code:
    ' ***************************************************************
    ' EEPROM Variables
    ' ***************************************************************
    
    MotorRPM_Default   CON  500 ; half speed if max is 1000
    EE_MotorRPM        DATA WORD MotorRPM_Default
    MotorRPM           VAR  WORD
    READ EE_MotorRPM, WORD MotorRPM
    
    PortEngDir_Default CON  0
    EE_PortEngDir      DATA WORD PortEngDir_Default
    PortEngDir         VAR  WORD
    READ EE_PortEngDir, WORD PortEngDir
    There are a few other WRITE statements in your program that need to be changed too.
    DT

  7. #7


    Did you find this post helpful? Yes | No

    Default Re: SPWM_INT - Multiple Software PWM Question

    You're a life saver, Darrel - thanks. Updated the corresponding WRITE statements and all compiles fine (I didn't change the 'PortEngDir' stuff as that has only 2 values: 0 & 1)

    Was there anything in the warning message which told you where to look?'
    Last edited by RossWaddell; - 21st January 2013 at 01:24.

Similar Threads

  1. Darrel's Multiple Software PWM
    By passion1 in forum mel PIC BASIC Pro
    Replies: 10
    Last Post: - 15th October 2013, 15:21
  2. Replies: 1
    Last Post: - 4th March 2013, 21:57
  3. DT Multiple Software PWM and 18F2321 issue
    By microuser in forum mel PIC BASIC Pro
    Replies: 1
    Last Post: - 20th December 2012, 08:23
  4. General Question About Multiple Interrupts
    By grzeh666 in forum mel PIC BASIC Pro
    Replies: 4
    Last Post: - 31st August 2008, 17:09
  5. Multiple HPWM question
    By Johan in forum mel PIC BASIC Pro
    Replies: 2
    Last Post: - 17th October 2007, 13:00

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