pwmout calculation

Satchid

Member
Hi,
I have the below code that works for increasing the frequency on c.2 output pin gradualy. And i am proud that it works.
but as it is a simple calculation, I wonder is there is a formula based on the frequency.

duty pitch frequency constant
pwmout pwmdiv16, c.2, 66 131 950 124530
If I divide the constant by the frequency then I have the pich or wavelength. then a 50% dutycycle is 1/2 of that.

I i will make the frequency with a "for next" loop. and then apply the formula.
Thank you.
Willy

PS: I hope that the code comes ok.


Code:
[color=Black]motor_on:
      
      [/color][color=Blue]pause [/color][color=Purple]startup_pause
            [/color][color=Blue]high msi_1  high msi_2 high msi_3   [/color][color=Green];sixtenth step [/color]
[color=Blue]pause [/color][color=Purple]stop_pause
            [/color][color=Blue]pwmout pwmdiv16[/color][color=Black], [/color][color=Blue]C.2[/color][color=Black], [/color][color=Navy]255[/color][color=Black], [/color][color=Navy]511 [/color][color=Green]; 244Hz at 50% @ 4MHz[/color]
[color=Blue]pause [/color][color=Purple]stop_pause        
            [/color][color=Blue]pwmout pwmdiv16[/color][color=Black], [/color][color=Blue]c.2[/color][color=Black], [/color][color=Navy]249[/color][color=Black], [/color][color=Navy]499 [/color][color=Green]; 250Hz at 50% @ 4MHz
            [/color][color=Blue]pause [/color][color=Purple]stop_pause
            [/color][color=Blue]pwmout pwmdiv16[/color][color=Black], [/color][color=Blue]c.2[/color][color=Black], [/color][color=Navy]226[/color][color=Black], [/color][color=Navy]453 [/color][color=Green]; 275Hz at 50% @ 4MHz
            [/color][color=Blue]pause [/color][color=Purple]stop_pause
            [/color][color=Blue]pwmout pwmdiv16[/color][color=Black], [/color][color=Blue]c.2[/color][color=Black], [/color][color=Navy]207[/color][color=Black], [/color][color=Navy]415 [/color][color=Green]; 300Hz at 50% @ 4MHz
            [/color][color=Blue]pause [/color][color=Purple]stop_pause
            [/color][color=Blue]pwmout pwmdiv16[/color][color=Black], [/color][color=Blue]c.2[/color][color=Black], [/color][color=Navy]191[/color][color=Black], [/color][color=Navy]383 [/color][color=Green]; 325Hz at 50% @ 4MHz
            [/color][color=Blue]pause [/color][color=Purple]stop_pause
            [/color][color=Blue]pwmout pwmdiv16[/color][color=Black], [/color][color=Blue]c.2[/color][color=Black], [/color][color=Navy]178[/color][color=Black], [/color][color=Navy]357 [/color][color=Green]; 350Hz at 50% @ 4MHz
            [/color][color=Blue]pause [/color][color=Purple]stop_pause
            [/color][color=Blue]pwmout pwmdiv16[/color][color=Black], [/color][color=Blue]c.2[/color][color=Black], [/color][color=Navy]166[/color][color=Black], [/color][color=Navy]333 [/color][color=Green]; 375Hz at 50% @ 4MHz
            [/color][color=Blue]pause [/color][color=Purple]stop_pause
            [/color][color=Blue]pwmout pwmdiv16[/color][color=Black], [/color][color=Blue]c.2[/color][color=Black], [/color][color=Navy]155[/color][color=Black], [/color][color=Navy]311 [/color][color=Green]; 400Hz at 50% @ 4MHz
            [/color][color=Blue]pause [/color][color=Purple]stop_pause
            [/color][color=Blue]pwmout pwmdiv16[/color][color=Black], [/color][color=Blue]C.2[/color][color=Black], [/color][color=Navy]146[/color][color=Black], [/color][color=Navy]293 [/color][color=Green]; 425Hz at 50% @ 4MHz
            [/color][color=Blue]pause [/color][color=Purple]stop_pause
            [/color][color=Blue]pwmout pwmdiv16[/color][color=Black], [/color][color=Blue]C.2[/color][color=Black], [/color][color=Navy]138[/color][color=Black], [/color][color=Navy]277 [/color][color=Green]; 450Hz at 50% @ 4MHz
            [/color][color=Blue]pause [/color][color=Purple]stop_pause
            [/color][color=Blue]pwmout pwmdiv16[/color][color=Black], [/color][color=Blue]C.2[/color][color=Black], [/color][color=Navy]131[/color][color=Black], [/color][color=Navy]263 [/color][color=Green]; 475Hz at 50% @ 4MHz
            [/color][color=Blue]pause [/color][color=Purple]stop_pause
            [/color][color=Blue]pwmout pwmdiv16[/color][color=Black], [/color][color=Blue]c.2[/color][color=Black],         [/color][color=Navy]125[/color][color=Black],  [/color][color=Navy]249[/color][color=Green];  500   
            [/color][color=Blue]pwmout pwmdiv16[/color][color=Black], [/color][color=Blue]c.2[/color][color=Black],         [/color][color=Navy]119[/color][color=Black],  [/color][color=Navy]237[/color][color=Green];  525
            [/color][color=Blue]pause [/color][color=Purple]stop_pause
            [/color][color=Blue]pwmout pwmdiv16[/color][color=Black], [/color][color=Blue]c.2[/color][color=Black],         [/color][color=Navy]113[/color][color=Black],  [/color][color=Navy]226[/color][color=Green];  550
            [/color][color=Blue]pause [/color][color=Purple]stop_pause
            [/color][color=Blue]pwmout pwmdiv16[/color][color=Black], [/color][color=Blue]c.2[/color][color=Black],         [/color][color=Navy]108[/color][color=Black],  [/color][color=Navy]217[/color][color=Green];  575
            [/color][color=Blue]pause [/color][color=Purple]stop_pause
            [/color][color=Blue]pwmout pwmdiv16[/color][color=Black], [/color][color=Blue]c.2[/color][color=Black],         [/color][color=Navy]104[/color][color=Black],  [/color][color=Navy]208[/color][color=Green];  600
            [/color][color=Blue]pause [/color][color=Purple]stop_pause
            [/color][color=Blue]pwmout pwmdiv16[/color][color=Black], [/color][color=Blue]c.2[/color][color=Black],         [/color][color=Navy]100[/color][color=Black],  [/color][color=Navy]199[/color][color=Green];  625
            [/color][color=Blue]pause [/color][color=Purple]stop_pause
            [/color][color=Blue]pwmout pwmdiv16[/color][color=Black], [/color][color=Blue]c.2[/color][color=Black],         [/color][color=Navy]96[/color][color=Black],   [/color][color=Navy]192[/color][color=Green];  650
            [/color][color=Blue]pause [/color][color=Purple]stop_pause
            [/color][color=Blue]pwmout pwmdiv16[/color][color=Black], [/color][color=Blue]c.2[/color][color=Black],         [/color][color=Navy]92[/color][color=Black],   [/color][color=Navy]184[/color][color=Green];  675
            [/color][color=Blue]pause [/color][color=Purple]stop_pause
            [/color][color=Blue]pwmout pwmdiv16[/color][color=Black], [/color][color=Blue]c.2[/color][color=Black],         [/color][color=Navy]89[/color][color=Black],   [/color][color=Navy]178[/color][color=Green];  700
            [/color][color=Blue]pause [/color][color=Purple]stop_pause
            [/color][color=Blue]pwmout pwmdiv16[/color][color=Black], [/color][color=Blue]c.2[/color][color=Black],         [/color][color=Navy]86[/color][color=Black],   [/color][color=Navy]172[/color][color=Green];  725
            [/color][color=Blue]pause [/color][color=Purple]stop_pause
            [/color][color=Blue]pwmout pwmdiv16[/color][color=Black], [/color][color=Blue]c.2[/color][color=Black],         [/color][color=Navy]83[/color][color=Black],   [/color][color=Navy]166[/color][color=Green];  750
            [/color][color=Blue]pause [/color][color=Purple]stop_pause
            [/color][color=Blue]pwmout pwmdiv16[/color][color=Black], [/color][color=Blue]c.2[/color][color=Black],         [/color][color=Navy]80[/color][color=Black],   [/color][color=Navy]161[/color][color=Green];  775
            [/color][color=Blue]pause [/color][color=Purple]stop_pause
            [/color][color=Blue]pwmout pwmdiv16[/color][color=Black], [/color][color=Blue]c.2[/color][color=Black],         [/color][color=Navy]78[/color][color=Black],   [/color][color=Navy]156[/color][color=Green];  800
            [/color][color=Blue]pause [/color][color=Purple]stop_pause
            [/color][color=Blue]pwmout pwmdiv16[/color][color=Black], [/color][color=Blue]c.2[/color][color=Black],         [/color][color=Navy]75[/color][color=Black],   [/color][color=Navy]151[/color][color=Green];  825
            [/color][color=Blue]pause [/color][color=Purple]stop_pause
            [/color][color=Blue]pwmout pwmdiv16[/color][color=Black], [/color][color=Blue]c.2[/color][color=Black],         [/color][color=Navy]73[/color][color=Black],   [/color][color=Navy]147[/color][color=Green];  850
            [/color][color=Blue]pause [/color][color=Purple]stop_pause
            [/color][color=Blue]pwmout pwmdiv16[/color][color=Black], [/color][color=Blue]c.2[/color][color=Black],         [/color][color=Navy]71[/color][color=Black],   [/color][color=Navy]142[/color][color=Green];  875
            [/color][color=Blue]pause [/color][color=Purple]stop_pause
            [/color][color=Blue]pwmout pwmdiv16[/color][color=Black], [/color][color=Blue]c.2[/color][color=Black],         [/color][color=Navy]69[/color][color=Black],   [/color][color=Navy]138[/color][color=Green];  900
            [/color][color=Blue]pause [/color][color=Purple]stop_pause
            [/color][color=Blue]pwmout pwmdiv16[/color][color=Black], [/color][color=Blue]c.2[/color][color=Black],         [/color][color=Navy]67[/color][color=Black],   [/color][color=Navy]135[/color][color=Green];  925
            [/color][color=Blue]pause [/color][color=Purple]stop_pause
            [/color][color=Blue]pwmout pwmdiv16[/color][color=Black], [/color][color=Blue]c.2[/color][color=Black],         [/color][color=Navy]66[/color][color=Black],   [/color][color=Navy]131[/color][color=Green];  950
            [/color][color=Blue]pause [/color][color=Purple]stop_pause
            [/color][color=Blue]pwmout pwmdiv16[/color][color=Black], [/color][color=Blue]c.2[/color][color=Black],         [/color]
 

Satchid

Member
Indeed,
Wat you see in the program is a gradualy increase of the frequency, the pwmout lines are calculated with the wizard. But I would like a formula that wil do the complete array. It is making pwmout commands from 244Hz til 1000Hz with 25 hz inrements. I would like a formula or program that is doing that automaticaly. waw i would like a program that let the output c.2 increase from "x"Hz to "y"Hz with an increase of "z"Hz.
Would that be possible?
But if there is none, than my way is ok, it is cumbersome
Thanks,
Willy
 

cpedw

Senior Member
I believe the formula looks like this:
PWM Frequency (Hz) = Clock frequency (Hz) / (Period+1) / 4 / PWMDIV number

Derek
 

mikeyBoo

Senior Member
Corrected Formula in .pdf

Pasted Incorrect Formula in previous attached .pdf for calculating period value needed to output desired pwmout frequency!
(Only worked correctly with divisor set to 1)
I tried out corrected spreadsheet formula against the Picaxe Wizard at various clock values & divisors & it seems ok now.
Guess it's part of getting older (or lazier). Sorry guys, I screwed up.
Hope this makes more sense. (See attached .pdf for corrected spreadsheet formula)

PICAXE Period & Duty Cycle Calculations:

Generate a PWM signal with specified duty cycle (specify PWM as a direct percent value (0...100))
to make Picaxe code simple: (e.g. 4000Hz perfect for most motor speed control)
NOTE: using Picaxe with resonator freq = 4 MHZ:
at 40000 Hz the duty cycle value specified in pwmout ~ the actual percentage
at 4000 Hz the duty cycle value specified in pwmout ~ actual percent x 10
at 2000 Hz the duty cycle value specified in pwmout ~ (actual percent/2) x 10
http://www.robowars.org/wikka/PicaxePWM HAS CORRECT FORMULA(?):

e.g. Picaxe code: pwmout pwmdiv4,pin, period, dutyCycle

Formula for calculating period value (to output a desired frequency):
matches Wizard for all tested sysClockDivisors & sysClockSpeedHz
(period must be within range 0...255)
period = ((sysClockSpeedHz / desiredFreqHz)/(sysClockDivisor x 4))-1

Formula for calculating dutyCycle (for specified 0...100% value):
following formula is sometimes off by 1 bit from the Wizard (rounding error or my formula slightly off ??)
(dutyCycle must be within range 0...1023)
dutyCycle = ((((sysClockSpeedMHz x 10000) / desiredFreq) * desiredDutyCycle)- 1) / sysClockDivisor

When period or dutyCycle result is out of range, divisor must be applied (i.e. pwmdiv4 pwmdiv16 pwmdiv64)
example calculation:
given that: desiredFreqHz = 10000 ;# 10000 Hz
desiredDutyCycle = 50 ;# 50% (0...100% range) duty cycle (i.e.square wave)
sysClockSpeedHz = 4000000 ;# 4000000 Hz Resonator
sysClockDivisor = 1 ;# divide the system clock by 1 (must be 1 4 16 64)
so that:
period = ((4000000 / 10000)/(1 x 4))-1 ;# to produce an output freq = 10000 Hz
= 99 ;# legit since it lies within range 0...255

dutyCycle = ((((4 x 10000) / 10000) * 50)- 1) / 1 ;# to produce a 50% duty cycle
= 199 ;# legit since it lies within range 0...1023

syntax: pwmout pin, period, dutyCycle
pwmout pwmdiv4,pin, period, dutyCycle
pwmout pwmdiv16, pin, period, dutyCycle
pwmout pwmdiv64, pin, period, dutyCycle
pwmout pin, OFF

args: pin specifies i/o pin to use. (only certain pins may be used for for pwmout)
period variable/constant (0-255) which sets the PWM period (1/freq)
dutyCycle variable/constant (0-1023) which sets the PWM duty cycle.
(ratio of ON to OFF time within each period)
pwmdiv divides frequency by 4, 16 or 64. (pwmdiv64 is only supported by M2 devices)

usage: All (except 08, 18, 18A, 20M, 28, 28A)

Analog Output using Picaxe PWM (formulas for calculating RC values)
https://www.elektormagazine.com/files/attachment/293
 

Attachments

Last edited:

mikeyBoo

Senior Member
I screwed up! Fixed incorrect formula in the .pdf attached to my previous post.
Sorry guys, hope I didn't cause any headaches.
Merry Xmas!!
 
Top