Go Down

Topic: Feature request: Adjustable PWM frequency (Read 23880 times) previous topic - next topic

Fredjikrang

Check out this page: http://www.arduino.cc/playground/Main/TimerPWMCheatsheet

winmutt

#16
Sep 17, 2009, 04:20 pm Last Edit: Sep 17, 2009, 04:45 pm by winmutt Reason: 1
Bump. Anyone know if 140z is possible with the internal timer.

I may be misreading this but in fast pwm mode, OCR0A controls the period.
Quote

PWM with 2ms period and 10% duty

Configure timer 0 to generate a 2ms period with a 10% duty cycle.

The fast PWM mode where the period is controlled by OCRA has (WGM2,WGM1,WGM0) = (1,1,1). The compare match B output must be used and it should turn on at TOP and reset at match. This happens when (COM0B1,COM0B0) = (1,0). The prescaler is set to 64.

TCCR0A = _BV(COM0B1) | _BV(WGM01) | _BV(WGB00);
TCCR0B = _BV(WGB02) | _BV(CS01) | _BV(CS00);
OCR0A = 250;

The duty cycle (period the PWM is on) is controlled by OCR0B. The range of OCR0B is from 0 to OCR0A (or 250 in this case). If OCR0B exceeds OCR0A, then the PWM output will be alway on. A duty cycle of 10% is set by:

   OCR0B = OCR0A * 10% = 250 * .1 = 25

The configuration is complete when OCR0B is assigned:

OCR0B = 25;

Changing the output compare control setting (COM0B1,COM0B0) = (0,1) inverts the waveframe (i.e., the output will be off for 10% and on for 90%).

What is the setting for a 75% duty cycle? How would the period be changed to 250 uS, and how would this affect the precison of the duty cycle?

JohanSPettersson

Nice....

Code: [Select]

void setup() {
    TCCR2B = (TCCR2B & 0xF8) | value;
}


This helps me a lot in my project. :)
To change PWM-frequency on pin9 and 10 i have noticed that TCCR1B works. (don't know what it is. trial and error.)
If I want to change frequency on pin5 and 6. How do I do that?

JohanSPettersson

A little bit more reading on this forum gave me the answer.....

TCCR0B is the timer for 5 and 6

Thanks any way

koyaanisqatsi

#19
Jan 07, 2011, 10:34 pm Last Edit: Jan 07, 2011, 10:42 pm by koyaanisqatsi Reason: 1
Be careful with TCCR0B.  delay() and millis() are based on it and their behavior changes when you change TCCR0B.  Earlier in this thread, I posted how to deal with it.  But there are some other little factors I haven't identified.  My sketch would not run with certain TCCR0B values.  So I generally stay away from that one and just use the other PWM pins if I need a different freq.

EDIT: OK, it wasn't earlier in this thread, but in another thread I link to on page 1 of this thread.
Liked again: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1235060559/0
What about elevensies? Luncheon? Afternoon tea? Dinner? Supper?

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy