easy pwm on any pin or pins with multiple freq's

Tips, Tricks and methods for programming, learn ways of making your programming life easier, and share your knowledge with others.

Moderators: Benj, Mods

Post Reply
brandonb
Posts: 438
Joined: Mon Aug 29, 2011 12:26 am
Location: arizona
Has thanked: 175 times
Been thanked: 173 times
Contact:

easy pwm on any pin or pins with multiple freq's

Post by brandonb »

i made a post in v5 with a simular topic, this one is slightly different in the way it operates and is easy to manipulate... the way it works with 1% accuracy mode
- the tmr2 macro increases a count everytime its accessed, the count starts at zero and counts up to 100, when count = 100 the count is returned to zero, what i did is turned the output on at count=0 and turned output off when the pwm variable = count,
this gives you a 0-100% dutycycle, all examples are running at 1000hz with 32Mhz osc but have different tmr2 frequencies
- in 1% resolution the frequency of the pwm is determined by tmr2 frequency / 100
- by modifying the tmr2 frequency you can hit many frequencys
- this makes it possible to use pwms on pins that do not have ccp so a board that doesn't give you access to the ccps pins thats not a problem when using something like this project
- you can use as many pwms as you want, and use any i/o pins you want
- in 1% fcf martins code ((adc*100)/255) rescales adc to 0-100, this goes directly to the pwm variable and you can print to the display those numbers as pwm% as its the same
- in other variations 2%,5%,10%,25% to print the number in the lcd macro i use code pwm* XX to put corrent number on display for pwm%

*** the pwm mentioned above and as in first fcf has a resolution of 1% per pwm increase, but you dont have to run 1% you can drop the resolution to anything you want by modifying this line of code in the tmr2 isr

Code: Select all

if(count==100){count=0}
to other values, common are listed below, but to maintain the same frequency you will have to change the tmr2 frequency as in martins post http://www.matrixmultimedia.com/mmforum ... 26&t=10827

1% --> 100
2% --> 50
5% --> 20
10% --> 10
25% --> 4

- all simplified flowcharts below have 1000hz as output frequency notice tmr2 settings are different
- for example if you want to set pwm frequency to 620hz with 5% resolution is 620*20= 12,400
use tmr2 calculator in seperate post (revised fcf) http://www.matrixmultimedia.com/mmforum ... 580#p42633 to find the settings for 12,400 hz, the closest frequency is 12,403 which has the prescaler,postscaler,rollover values of ( 1 - 15 - 43 ) @32Mhz osc , then since 5/100 is 20counts set your tmr2 macro decision to

Code: Select all

if(count==20({count=0}
print to lcd will have to be modified as well

Code: Select all

printNumber(pwm*5)
sorry for my sudo arduino like code :lol: but hopefully get the idea



-
Attachments
1% resolution pwm.fcf
(16.5 KiB) Downloaded 475 times
5% resolution pwm.fcf
(16.5 KiB) Downloaded 445 times
10% resolution pwm.fcf
(16.5 KiB) Downloaded 461 times
Last edited by brandonb on Sat Dec 01, 2012 6:47 am, edited 5 times in total.

brandonb
Posts: 438
Joined: Mon Aug 29, 2011 12:26 am
Location: arizona
Has thanked: 175 times
Been thanked: 173 times
Contact:

Re: easy pwm on any pin or pins with multiple freq's

Post by brandonb »

this is a picture of how it works visually with the count variable in the tmr2 isr and the pwm variable which gives you the pwm dutycycle.... output goes high at count=0 output goes low at count=pwm.... if pwm variable is 72 then when count=0 output would go high, when count=72 output would go low until count rolls over from 100 and goes back to zero then output would be back on again since count is now zero again :D
Attachments
0-100 pwm explaination.jpg
0-100 pwm explaination.jpg (42.4 KiB) Viewed 4920 times

Post Reply