Vous êtes sur la page 1sur 10

Trabajando con el arduino mega y las salidas PWM me top que necesitaba cambiar la

frecuencia a la cual genera los pulsos, algo bien documentado para la placa chica pero
no habia visto nada para la grande. As que por fuerza me puse a investigar y esto
encontr:

El Mega 2560 tiene 15 salidas PWM por hardware

A slo 6 de ellas se les puede modificar el factor de


divisin de frecuencia:

Registro

Pin en

del micro Arduino


TCCR0B

TCCR1B

12

TCCR2B

TCCR3B

TCCR4B

TCCR5B

45

Para el Timer/Counter 0,1,3,4 y 5


Config. Divisor Frecuencia PWM
0x00

0x01

1 31,333 Hz

0x02

0x03

64

0x04

256

0x05

1024

3,916 Hz
489 Hz
122 Hz
30 Hz

Para el Timer/Counter 2
Config. Divisor Frecuencia PWM
0x00

0x01

1 31,333 Hz

0x02

3,916 Hz

0x03

32

979 Hz

0x04

64

489 Hz

0x05

128

244 Hz

0x06

256

122 Hz

0x07

1024

30 Hz

Por omisin, la frecuencia del PWM est configurada a 489 Hz y ya es de nosotros el


moverla a voluntad usando los registros. El cdigo a inclur es algo as:
Code: [Select]

//Para bajar la frecuencia del PWM pin 45 del Mega 2560 a 30 Hz


TCCR5B = TCCR5B & 0b000 | 0x05;
//Para bajar la frecuencia del PWM pin 9 del Mega 2560 a 30 Hz
TCCR2B = TCCR2B & 0b000 | 0x07;

Adjusting PWM Frequencies


For further knowledge on Arduino PWM frequencies refer to the ATMega
Complete Datasheet and this Arduino.cc page "Secrets of Arduino PWM"
http://arduino.cc/en/Tutorial/SecretsOfArduinoPWM

Regarding Arduino Mega


This article is not fully compatible to Arduino Mega (or ATmega2560
microprocessor)
For Arduino Mega: (tested on Arduino Mega 2560)
timer 0 (controls pin 13, 4)
timer 1 (controls pin 12, 11)
timer 2 (controls pin 10, 9)
timer 3 (controls pin 5, 3, 2)
timer 4 (controls pin 8, 7, 6)

TCCRnB, where 'n' is the number for the timer.


TCCR2B for timer 2, TCCR3B for timer 3.
Eg:
TCCR2B = TCCR2B & 0b11111000 | 0x01;
//sets Arduino Mega's pin 10 and 9 to frequency 31250.
//code typically inserted in setup()

Thanks to valerio_sperati
(http://arduino.cc/forum/index.php/topic,72092.0.html)

How to adjust Arduino PWM frequencies


by macegr in this forum post http://www.arduino.cc/cgibin/yabb2/YaBB.pl?num=1235060559/12

Pins 5 and 6: controlled by Timer 0 in fast PWM mode (cycle


length = 256)
Setting
0x01
0x02
0x03
0x04
0x05

Divisor

Frequency
1
8
64
256
1024

62500
7812.5
976.5625 <--DEFAULT
244.140625
61.03515625

TCCR0B = TCCR0B & 0b11111000 | <setting>;

Pins 9 and 10: controlled by timer 1 in phase-correct PWM mode


(cycle length = 510)
Setting
0x01
0x02
0x03
0x04
0x05

Divisor

Frequency
1
8
64
256
1024

31372.55
3921.16
490.20 <--DEFAULT
122.55
30.64

TCCR1B = TCCR1B & 0b11111000 | <setting>;

Pins 11 and 3: controlled by timer 2 in phase-correct PWM mode


(cycle length = 510)
Setting
0x01
0x02
0x03
0x04
0x05
0x06
0x07

Divisor

Frequency
1
8
32
64
128
256
1024

31372.55
3921.16
980.39
490.20 <--DEFAULT
245.10
122.55
30.64

TCCR2B = TCCR2B & 0b11111000 | <setting>;


All frequencies are in Hz and assume a 16000000 Hz system clock.

Issues from adjusting PWM


frequencies and workarounds:
from koyaanisqatsi in this forum post http://www.arduino.cc/cgibin/yabb2/YaBB.pl?num=1235060559/12
If you change TCCR0B, it affects millis() and delay(). They will count time
faster or slower than normal if you change the TCCR0B settings. Below is
the adjustment factor to maintain consistent behavior of these functions:
Default: delay(1000) or 1000 millis() ~ 1 second
0x01: delay(64000) or 64000 millis() ~ 1 second
0x02: delay(8000) or 8000 millis() ~ 1 second
0x03: is the default
0x04: delay(250) or 250 millis() ~ 1 second
0x05: delay(62) or 62 millis() ~ 1 second
(Or 63 if you need to round up. The number is actually 62.5)
Also, the default settings for the other timers are:
TCCR1B: 0x03
TCCR2B: 0x04

Any thought on the Arduino Mega?

PWM frequencies on Timer 0, pins


5 and 6, Arduino Uno
by yanngg, 02-15-2012
Timer 0 uses a prescale factor which is set to 64 by default
To set the prescale factor use this line in the setup function
Setting
TCCR0B
TCCR0B
TCCR0B
TCCR0B
TCCR0B

=
=
=
=
=

Prescale_factor
_BV(CS00);
1
_BV(CS01);
8
_BV(CS00) | _BV(CS01); 64
_BV(CS02);
256
_BV(CS00) | _BV(CS02); 1024

To use Fast PWM on Timer 0


Write this line in the setup function
TCCR0A = _BV(COM0A1) | _BV(COM0B1) | _BV(WGM01) | _BV(WGM00);
And to calculate the PWM frequency, use
Fast_PWM_frequency = (16 000 000)/(Prescale_factor*256);
To use Phase-correct PWM on Timer 0 (half the frequency of Fast PWM)
Write this line in the setup function
TCCR0A = _BV(COM0A1) | _BV(COM0B1) | _BV(WGM00);
And to calculate the PWM frequency, use
Phase_correct_PWM_frequency = (16 000 000)/(Prescale_factor*510);
Changing the prescale factor on Timer0 will affect functions
millis(), micros(), delay(),...
To adjust millis(), micros(), delay(),... accordingly,
You can modify a line in the wiring.c function in the Arduino program files
hardware\arduino\cores\arduino\wiring.c
In the beginning of wiring.c you can find:
// the prescaler is set so that timer0 ticks every 64 clock cycles, and the
// the overflow handler is called every 256 ticks.
#define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(64 *
256))
You need to modify the prescale factor in this function to the corresponding line
For fast PWM (default):
#define MICROSECONDS_PER_TIMER0_OVERFLOW
(clockCyclesToMicroseconds(PRESCALE_FACTOR* 256))

For phase-correct PWM :


#define MICROSECONDS_PER_TIMER0_OVERFLOW
(clockCyclesToMicroseconds(PRESCALE_FACTOR * 510))

Example: DC motor drive on the


Arduino UNO, pins 5 and 6
For Fast PWM of 62.500 kHz (prescale factor of 1)
Use these two lines in the setup function:
TCCR0A = _BV(COM0A1) | _BV(COM0B1) | _BV(WGM01) | _BV(WGM00);
TCCR0B = _BV(CS00);
And modify the line in the wiring.c function in the Arduino program files
hardware\arduino\cores\arduino\wiring.c :
#define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(1 *
256))
For Phase-correct PWM of 31.250 kHz (prescale factor of 1)
Use these two lines in the setup function:
TCCR0A = _BV(COM0A1) | _BV(COM0B1) | _BV(WGM00);
TCCR0B = _BV(CS00);
And modify the line in the wiring.c function in the Arduino program files
hardware\arduino\cores\arduino\wiring.c :
#define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(1 *
510))

Share

Newsletter

Subscribe

2015 Arduino

Copyright Notice

Contact us

Frecuencia de las salidas PWM


Nov 19, 2008, 09:59 am Last Edit: Nov 19, 2008, 10:00 am by complubot Reason: 1

Hola a todos
La placa Diecimila con la que estamos trabajando dispone de 6 salidas de modulacin
por anchura de pulso (PWM) que son ideales para controlar el voltaje aplicado a una
carga. El problema es que la frecuencia de este PWM es de tan solo 490 Hz y esto
puede ser adecuado para un control de iluminacin pero no es lo mejor opcin para
controlar la velocidad de un motor DC (entre 4KHz y 40KHz normalmente).
Las 6 salidas PWM son controladas por 3 contadores, cada contador se encarga de dos
salidas PWM:
Contador 0: D6 (PD6) y D5 (PD5)
Contador 1: D9 (PB1) y D10 (PB2)
Contador 2: D11(PB3) y D3 (PD3)
Entre parntesis pongo el nombre de la pata del Atmega168 y las que empiezan por
"D" son los nombres de las lneas digitales del Arduino
En el Arduino la frecuencia del PWM se consigue a partir de la frecuencia de reloj y de
un divisor programable llamado "prescaler". Par conseguir subir los 490HZ de
frecuencia del PWM hay que modificar el factor de divisin del prescaler (64 por
defecto) disminuyndolo hasta conseguir la frecuencia deseada. Estas son las
frecuencias que se consiguen:

Contador 1
Prescaler Frecuencia Registro TCCR1B

Contador 2
Registro TCCR2B

64

490Hz

32

984Hz

--

3936Hz

31360Hz

Nota, el contador 1 no admite el prescaler de 32


Como el Contador 0 se utiliza para las funciones de retardo, si modificamos la
configuracin de este contador dichas funciones no funcionarn correctamente. Por ello
podemos modificar las salidas PWM asociadas a los contadores 1 y 2, esto es: D3, D9,
D10 y D11. Por ejemplo para configurar estas cuatro ltimas salidas PWM con una
frecuencia de 31360Hz aadiremos las siguientes lneas en la configuracin de nuestro
programa:
TCCR1B =1;
TCCR2B =1;
Esto se contradice un poco con lo que pone aqu (habla de un PWM de 30769 Hz),
http://www.arduino.cc/es/DCMotor/DCMotor pero creo que el problema es que la
informacin no est actualizada.
Un saludo:
Eduardo
www.complubot.org
Centro de Robtica Educativa
www.complubot.com

Igor R

Edison Member

Posts: 1,580

1.

[add Karma]

[add Karma]

Re: Frecuencia de las salidas PWM

#1
Dec 15, 2008, 09:42 am

Hola Eduardo!!
Muy buena info. Gracias!
Donde esta en la web de arduino la informacin del hardware interno que se usa para
implementar las funciones software?
Por ejemplo, has expuesto que las funciones de retardo usan el timer 0.
Gracias de antemano.

Igor R.
CAN BUS=> http://secuduino.blogspot.com/

http://real2electronics.blogspot.com/

complubot

Sr. Member

Posts: 282

1.

[add Karma]

ROBOTICA EDUCATIVA CON ARDUINO

Complubot

[add Karma]

Re: Frecuencia de las salidas PWM

#2
Dec 15, 2008, 10:05 am

Yo lo he encontrado mirando directamente el cdigo que se usa para implementar las


distintas funciones. Lo tienes en la carpeta hardware\cores\arduino

Vous aimerez peut-être aussi