Sunteți pe pagina 1din 12

Registro PORT (puerto)

Los registros de PORT permiten manipular los pines del microcontrolador de la placa
Arduino em bajo nivel y demanera ms rapida. Los chips usados usados en la placa
Arduino (el ATmega8 y el ATmega168)poseen tres puertos:
B (pines digitales del 8 al 13)
C (entradas analgicas)
D (pines digitales del 0 al 7)
Cada puerto es controlado por tres registros, los cuales tambin estn definidos como
variables en el lenguaje del Arduino. El registro DDR, determina si el pin es una entrada
o una salida. El registro PORT controla si el pin est en nivel alto o en nivel bajo, y el
registro PIN permite leer el estado de un pin que se ha configurado con entrada usando
la funcin pinMode(). Los esquemas de los chips ATmega8 and ATmega168 muestran
los puertos. El nuevo ATmega328p usa la misma configuracin de pines que el
ATmega168.
Los registros DDR y PORT pueden ser ambos, escritos y ledos. El registro PIN
corresponde al estado de las entradas as que solo puede ser ledo.
El PORTD mapea los pines digitales del 0 al 7
DDRD - El registro de configuracin del modo de los pines del puerto D -
lectura/escritura
PORTD - Registro de datos del puerto D - lectura/escritura
PIND - Registro de pines de entrada - solo lectura
PORTB mapea los pines digitales del 8 al 13. Los bits altos(6 & 7) estn mapeados a
los pines del cristal de cuarzo y no pueden ser usados.
DDRB - El registro de configuracin del modo de los pines del puerto B -
lectura/escritura
PORTB - Registro de datos del puerto D - lectura/escritura
PINB - Registro de pines de entrada - solo lectura
PORTC mapea los pines de entrada analgica del 0 al 5. Los pines 6 y 7 solo son
accesibles en el Arduino Mini
DDRC - El registro de configuracin del modo de los pines del puerto B -
lectura/escritura
PORTC - Registro de datos del puerto D - lectura/escritura
PINC - Registro de pines de entrada - solo lectura
Cada bit de estos registros corresponden con un solo pin; por ejemplo el bit menos
significativo de los registros DDRB, PORTB, y PINB hace referencia al pin PB0 (pin
digtal 8) Each bit of these registers corresponds to a single pin; e.g. the low bit of
DDRB, PORTB, and PINB refers to pin PB0 (digital pin 8). Para ms detalles sobre
como estn mapeados los nmeros de los pines de Arduino a los puertos y los bits, mira
el diagrama de tu chip: ATmega8, ATmega168. (Ten en cuenta que algunos bits de un
puerto pueden estar siendo usados para otras cosas diferentes a E/S; y ten cuidado de no
cambiar los valores de los registros correspondientes a ellos.)
Ejemplos
En referencia al mapeo de los pines del cual se habla en los prrafos anteriores, los
registros del puerto D controlan los pines digitales del 0 al 7 de la placa Arduino.
Deberas tener en cuenta, sin embargo, que los pines 0 y 1 son usados para la
comunicacin serial y por tanto para programar y depurar el Arduino, por lo que
cambiar esos pines debera ser evitado a menos que se necesite para funciones de
entrada y salida serial. Ten en cuenta que esto puede interferir con las descarga y
depuracin de programas.
DDRD es el registro de direccionamiento del Puerto D (Pines digitales Arduinos del 0
al 7). Los bits en este registro controlan si los pines del Puerto D son configurados como
entradas o salidas, por ejemplo:
DDRD = B11111110; // configura los pines del 1 al 7 como salidas y el
pin 0 como entrada
DDRD = DDRD | B11111100; // esta manera es ms segura ya que
configura los
// pines del 2 al 7 como salidas in cambiar
los pines 0 y 1,
// los cuales son RX y TX
PORTB es el registro para el estado de las salidas. Por ejemplo:
PORTD = B10101000; // configura los pines digitales 7,5,3 HIGH
Si los pines se han configurados como salidas usando el registro DDRD o la funcin
pinMode() los pines se leern siempre como si estuviesen a nivel alto.
PINB es el registro de entrada, este registro permite leer todos los pines de entrada a la
vez.

Interrupciones del timer
Las Interrupciones del timer le permiten realizar una tarea a intervalos muy
especialmente programados, independientemente de lo que est sucediendo en programa
principal. En este articulo voy a explicar cmo configurar y ejecutar una interrupcin de
timer en el modo de CTC (Clear Timer on Compare).
Las interrupciones del timer hacen que el programa del bucle principal sea interrumpido
a intervalos precisos de tiempo para realizar una tarea especifica. Una vez realizada esta
tarea el procesador vuelve a hacer la tarea que habia interrumpido en el bucle principal.
Las interrupciones son tiles para:
Medicin de una seal de entrada a periodos iguales de tiempo.
Calcular el tiempo entre dos eventos.
El envo de una seal de una frecuencia especfica.
Lectura de teclados matrizados.
Multiplexado de digitos Led, o matrices de leds.
Y mucho ms
Hay muchas maneras de hacer las interrupciones, por ahora me centrar en el tipo que
me parece el ms sencillo y til llamado modo de CTC (Clear Timer on Compare). En
este articulo escribire especficamente sobre los timers del Atmega328p).
Posee 3 timers (Timer0, Timer1 y Timer2). Cada uno de los timers tiene un contador
que se incrementa en cada tic del reloj del timer. Las interrupciones del timer en el
modo CTC se activan cuando el contador llegua a un valor especificado, almacenado en
el registro de comparacin OCR. Una vez que un contador llegue a este valor se borrar
(a cero) en el siguiente pulso de reloj del timer, luego seguir contando hasta hasta una
nueva comparacin.
El primer parmetro a tener en cuenta es la velocidad a la que el timer se incrementa.
Teniendo en cuenta que la placa Arduino tiene un cristal de 16MHz cada tic del timer
representa 1/16.000.000 de segundo (~ 63ns),

Secretos del PWM en Arduino
by Ken Shirriff
with further editing by Paul Badger
the original document
La modulacin por ancho de pulso (PWM) puede ser utilizada en el Arduino de
diferentes maneras, Este artculo explica tanto las tcnicas simples de PWM como el
como usar los registros de PWM directamente para un mayor control sobre el ciclo de
trabajo (duty cycle) y la frecuencia. Este artculo se centra en los modelos Arduino
Diecimila y Duemilanove, los cuales utilizan el ATmega168 y ATmega328.
Si no estas familiarizado con la Modulacin de Ancho de Pulso, chale un vistazo al
tutorial. Brevemente, una seal PWM es ona honda digital cuadrada, donde la
frecuencia es constante, pero la fraccin de tiempo en que la seal est encendida (el
ciclo de trabajo) puede variar entre el 0 y el 100%..

Ejemplos de PWM
PWM tiene diferentes usos:
Atenuacin de un LED.
Disponer de una salida analgica; si la salida digital est filtrada,
esto proveer de un voltaje entre el 0% y el 100%.
Generar seales de audio.
Proveer de un control de velocidad variable para motores.
Generar una seal modulada, por ejemplo para utilizar un LED infrarojo para
control remoto.
Modulacin de Ancho de Pulso simple con analogWrite
El lenguaje de programacin de Arduino hace que el PWM sea fcil de usar;
simplemente llama a analogWrite(pin, dutyCycle), donde dutyCycle es un valor entre 0
y 255, y pin es uno de los PWM pins (3, 5, 6, 9, 10, or 11). La funcin analogWrite
ofrece un interface simple al hardware PWM, pero no ofrece ningn control sobre la
frecuencia. ( Notese que a pesar del nombre de la funcin, la seal de salida es digital, a
menudo haciendo referencia a una onda cuadrada).
Probablemente el 99% de los lectores pueden detenerse aqu y utilizar solamente
analogWrite, pero hay otras opciones que ofrecen una mayor flexibilidad.
Bit-banging (Golpes de pulso) con PWM
Puedes "manualmente" implementar PWM en cualquier pin encendiendo y apagando
repetidamente el pin en los tiempos deseados. Ejem.
void setup()
{
pinMode(13, OUTPUT);
}

void loop()
{
digitalWrite(13, HIGH);
delayMicroseconds(100); // Aproximadamente 10% de ciclo de trabajo a
1KHz
digitalWrite(13, LOW);
delayMicroseconds(1000 - 100); // Aproximadamente 90% de ciclo de
trabajo restante apagado
}
Esta tcnica tiene la ventaja de poder ser utilizada en cualquier pin de salida digital,
tienes el control completo del ciclo de trabajo y la frecuencia. La mayor desventaja es
que cualquier interrupcin afectar a la cuenta de tiempo, lo cual puede causar
fluctuaciones considerables a menos que desabilites las interrupciones. La segunda
desventaja es que no puedes tener la salida trabajando mientras el procesador hace
alguna otra cosa. Finalmente, es dificil determinar las constantes para un ciclo de
trabajo y frecuencia en particular a menos que cuentes cuidadosamente los ciclos, o
modifiques los valores mientras haces la medicin con un osciloscopio.
Un ejemplo ms elaborado de para hacer PWM en todos los pins se puede encontrar
aqui.
Usando directamente los registros de PWM del
ATmega
El chip ATmega168P/328P tiene tres timers para PWM, controlando 6 salidas PWM.
Manipulando directamente los registros del timer del chip, puedes obtener un mayor
control que el que proporciona la funcin analogWrite.
La ficha del AVR ATmega328P proporciona una descripcin detallada de los timers,
pero la ficha puede ser dificil de comprender, debido a los muchos y diferentes modos
de control y salida de los timers.
A continuacin encontrars unas palabras ms ordenadas acerca de la relaccin entre el
lenguaje de Arduino y la ficha.
Los timers del Atmega 168/328.
El ATmega328P tiene tres timers conocidos como Timer 0, Timer 1, and Timer 2. Cada
uno de ellos posee dos registros de salida comparados que controlan el ancho del pulso
PWM para las dos salidas de los timers: cuando el timer alcanza el valor del registro
comparado la correspondiente salida es conmutada. Las dos salidas de cada timer tienen
normalmente la misma frecuencia, pero pueden tener diferentes ciclos de trabajo
(dependiendo del respectivo registro de salida comparado).
Cada uno de los timers tiene un Predivisor (prescaler) que genera el tempodizador
dividiendo el reloj del sistema por un factor como 1, 8, 64, 256 o 1024. El Arduino tiene
un reloj de sistema a 16MHz y la frecuencia del temporizador ser el reloj de sistema
dividido por el factor del Predivisor. Notese que el Timer 2 posee un conjunto diferente
de valores para el predivisor con respecto a los otros timers.
Los timers son complicados por sus diferentes modos. Los principales modos son "Fast
PWM" y "Phase-correct PWM", los cuales se describen ms adelante. Un timer puede
trabajar de 0 a 255, o de 0 a un valor fijo. (El Timer 1 de 16-bits tiene modos
adicionales que soportan valores de timer hasta los 16 bits). Cualquier salida puede
adems ser invertida.
Los timers tambim pueden generar interrupciopnes en desbordamiento (overflow) y/o
coincidiendo con alguno de los registros de salida comparados, pero esto est ms all
de lo que cubre este artculo.
Registros de Timers
Muchos registros son utilizados para controlar cada timer. el Controlador de Registros
del Timer/Contador TCCRnA y TCCRnB mantiene el control de los bits principales del
timer. (Notese que TCCRnA y TCRnB no corresponden a las salidas A y B). Estos
registros mantienen varios grupos de bits:
Waveform Generation Mode bits (WGM): Estos controlan el timer de modo
general.
(Estos bits se dividen entre TCCRnA y TCCRnB.)
Clock Select bits (CS): Controla el reloj predivisor
Compare Match Output A Mode bits (COMnA): Habilita/deshabilita/invierte la
salida A
Compare Match Output B Mode bits (COMnB): Habilita/deshabilita/invierte la
salida B
Los Registros de Salida Comparada OCRnA y OCRnB ajustan los niveles en los que las
salidas A y B sern afectadas. Cuando el valor del timer coincida con el valor del
registro, la correspondiente salida ser modificada como se especifique por el modo.
Los bits son ligeramente diferentes para cada timer, as que consulta la ficha para ms
detalles. Timer 1 es un timer de 16-bits y tiene modos adicionales. El Timer 2 posee
diferentres valores de predivisor.
PWM rpido (Fast PWM)
En el modo de PWM simple, el timer cuenta repetidamente desde 0 a 255. La salida se
enciende cuando el timer est en 0, y se apaga cuando el timer coincide con el registro
de salida comparado. A mayor valor en el registro de salida comparado, el ciclo de
trabajo ser mayor. Este modo es conocido como modo rpido de PWM.
El siguiente diagrama muestra las salidas para dos valores particulares de OCRnA y
OCRnB. Notese que ambas salidas tienen la misma frecuencia, coincidiendo con la
frecuencia de un ciclo completo del timer.
Modo PWM rpido (Fast PWM Mode)
El siguiente fragmento de cdigo configura el PWM rpido en los pines 3 y 11 (Timer
2). Para resumir el registro de configuracin, poniendo los bits del Modo de generacin
de Ondas (WGM - waveform generation mode) a 011 selecciona PWM rpido.
Poniendo los bits COM2A y COM2B a 10 asigna PWM no-invertido (non-inverted
PWM) para las salidas A y B. Poniendo el CS a 100 ajusta el predivisor a dividir el reloj
por 64. (Como los bits son diferentes para los diferentes timers, consulta la ficha para
ver los valores correctos). Los registros comparados de salida son arbritariamente
ajustados a 180 y 50 para controlar el ciclo de trabajo del PWM de las salidas A y B.
(Por supuesto puedes modificar directamente los registros en vez de utilizar pinMode,
pero necesitas configurar los pins a OUTPUT).
pinMode(3, OUTPUT);
pinMode(11, OUTPUT);
TCCR2A = _BV(COM2A1) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
TCCR2B = _BV(CS22);
OCR2A = 180;
OCR2B = 50;
En el Arduino Duemilanove, estos valores produce:
Frecuencia salida A: 16 MHz / 64 / 256 = 976.5625Hz
Duty cycle salida A: (180+1) / 256 = 70.7%
Frecuencia salida B: 16 MHz / 64 / 256 = 976.5625Hz
Duty cycle salida B: (50+1) / 256 = 19.9%
La frecuencia de salida son los de 16MHz de la frecuencia del reloj de sistema, dividido
por el valor del predivisor (64), dividido por los 256 ciclos que necesita el timer para
dar la vuelta completa. Notese que el PWM rpido (fast PWM) mantiene la salida
levantada un ciclo ms que el valor del registro comparado.
PWM de Correccin de fase (Phase-Correct PWM)
El segundo modo es llamaddo PWM de Correccin de fase (Phase-Correct PWM). En
este modo, el timer cuenta de 0 a 255 y cuenta hacia abajo de nuevo hasta 0. La salida
se apaga cuando el timer alcanza el valor del registro comparado cuando cuenta hacia
arriba y se enciende cuando se alcanza mientras cuenta hacia abajo. El resultado es una
salida ms simtrica. La frecuenccia de salida ser aproximadamente la mitad de el
valor xxquexx para el modo PWM rpido, por que el timer corre en ambos sentidos
arriba y abajo.
Ejemplo PWM de Correccin de fase
El siguiente fragmento de cdigo configura el PWM de correccin de fase en los pines 3
y 11 (Timer 2). Los bits del modo de generacin de ondas WGW estan configurados a
001 para el PWM de correccin de fase. Los otros bits son iguales que para el modo de
PWM rpido.
pinMode(3, OUTPUT);
pinMode(11, OUTPUT);
TCCR2A = _BV(COM2A1) | _BV(COM2B1) | _BV(WGM20);
TCCR2B = _BV(CS22);
OCR2A = 180;
OCR2B = 50;
En el Arduino Duemilanove, estos valores producen:
Frecuencia salida A: 16 MHz / 64 / 255 / 2 = 490.196Hz
Duty cycle salida A: 180 / 255 = 70.6%
Frecuencia salida B: 16 MHz / 64 / 255 / 2 = 490.196Hz
Duty cycle salida B: 50 / 255 = 19.6%
El PWM de correccin de fase divide la frecuencia por dos, comparado con el modo
PWM rpido (fast PWM), porque el timer va hacia arriba y hacia a abajo.
Sorprendentemente, la frecuencia es dividida por 255 en vez de por 256, y los clculos
del el ciclo de trabajo no aaden uno como para el PWM rpido. Ver la explicacin ms
adelante en "Off-by-one".
Variando el lmite superior del timer: PWM rpido
Ambos modos, PWM rpido y PWM de correccin de fase, tienen un modo adicional
que otorga el control sobre la frecuencia de salida. En este modo, el timer cuenta desde
0 hasta OCRA (El valor del registro de salida comparado A), en vez de de 0 a 255. Esto
da mucho ms control sobre la frecuencia de salida y los modos previos. (Para un mayor
control de la frecuencia, utiliza el Timer 1 de 16-bits).
Notese que en este modo solo la salida B puede ser utilizada para PWM; OCRA no
puede ser utilizada como mximo valor y valor de comparacin de PWM. Sin embargo,
hay un modo de Casos-Especiales "Conmutar OCnA en coincidencia comparada" esto
conmutar la salida A al final del ciclo de trabajo, generando un 50% fijo de ciclo de
trabajo y la mitad de la frecuencia en este caso. Los ejemplos utilizarn este modo.
En el siguiente diagrama, el timer se resetea cuando coincide con OCRnA, produciendo
una frecuencia de salida ms rpida para OCnB que en diagramas anteriores. Notese
como OCnA conmuta cada vez que el timer se resetea.
Modo PWM rpido (Fast PWM) con lmite OCRA
El siguiente fragmento de cdigo configura el PWM rpido en los pines 3 y 11 (Timer
2). Utilizando OCR2A como el valor superior del timer. Los bits del modo de
generacin de onda WGW se cambian a 111 para el PWM rpido con el OCRA
controlando el lmite superior. El lmite superior del OCR2A es puesto arbritariamente a
180, y el registro de comparacin OCR2B es ajustado arbritariamente a 50. El modo
OCR2A est configuado para "Conmutar en coincidencia comparada" cambiando los
bits del COM2A a 01.
pinMode(3, OUTPUT);
pinMode(11, OUTPUT);
TCCR2A = _BV(COM2A0) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
TCCR2B = _BV(WGM22) | _BV(CS22);
OCR2A = 180;
OCR2B = 50;
En el Arduino Duemilanove, estos valores producen:
Frecuencia salida A: 16 MHz / 64 / (180+1) / 2 = 690.6Hz
Duty cycle salida A: 50%
Frecuencia salida B: 16 MHz / 64 / (180+1) = 1381.2Hz
Duty cycle salida B: (50+1) / (180+1) = 28.2%
Note que en este ejemplo, el timer va de 0 a 180, que tarda 181 ciclos de reloj, entonces
la frecuencia de salida es dividida por 181. La salida A tiene la mitad de la frecuencia
que la salida B por que la conmutacin en modo de Comparacin de Coincidencia
(Compare Match mode) conmuta la salida A por cada ciclo completo del timer.
Variando el lmite superior: PWM correccin de fase (phase-correct PWM)
De manera similar, el timer puede ser configurado en modo de correccin de fase para
resetear cuando alcance el OCRnA.
PWM correccin de fase con lmite OCRA
El siguiente fragmento de cdigo configura PWM correccin de fase en los pines 3 y 11
(Timer 2), utilizando el OCR2A como el valor superior del timmer. Los bits del modo
de generacin de onda WGW son ajustados a 101 para el PWM de correccin de fase
con el OCRA controlando el lmite superior. El lmite superior del OCR2A es
arbitrariamente ajustado a 180, y el registro comparado OCR2B se ajusta
arbritariamente a 50. El modo OCR2A est configuado para "Conmutar en coincidencia
comparada" cambiando los bits del COM2A a 01.
pinMode(3, OUTPUT);
pinMode(11, OUTPUT);
TCCR2A = _BV(COM2A0) | _BV(COM2B1) | _BV(WGM20);
TCCR2B = _BV(WGM22) | _BV(CS22);
OCR2A = 180;
OCR2B = 50;
En el Arduino Duemilanove, estos valores producen:
Frecuencia salida A: 16 MHz / 64 / 180 / 2 / 2 = 347.2Hz
Duty cycle salida A: 50%
Frecuencia salida B: 16 MHz / 64 / 180 / 2 = 694.4Hz
Duty cycle salida B: 50 / 180 = 27.8%
Observese que en este ejemplo, el timer va de 0 a 180 y vuelve hacia el 0, lo que
requiere 360 ciclos de reloj. Entonces, todo es dividido por 180 o 360, al contrario que
en el caso del PWM rpido, en el que todo se divide por 181; ver ms adelante para ms
detalles.
Desplazado-en-uno (Off-by-one)
Puedes haber observado que el PWM rpido (fast PWM) y el PWM de correccin de
fase (phase-correct PWM) parecen desfasados en 1 uno con respecto al otro, dividiendo
por 256 contra 255 y aadien do 1 en varios lugares. La documentacin es un poco
oscura en esto, por lo que intentar explicarlo con algo ms de detalle.
Imagina que el timer est configurado en modo PWM rapido y est ajustado para contar
hasta un valor de OCRnA de 3. El timer tendr los valores 012301230123... observa que
hay cuatro ciclos de reloj en cada ciclo de timer. Entonces la frecuencia ser dividida
por 4, no por 3. El ciclo de trabajo ser un mltiplo de 25%, desde que la salida est
levantada para 0, 1, 2, 3 o 4 de los cuatro. De la misma manera, ssi el timer cuenta hasta
255, existirn 256 ciclos de reloj en cada ciclo de timer, y el ciclo de trabajo ser un
mltiplo de 1/256. Para resumir PWM rpido divide por N+1 donde N en el mximo
valor del timer (sea OCRnA o 255).
Ahora considera el modo PWM de correccin de fase contando hasta un valor de
OCRnA de 3. Los valores del timer seran 012321012321... aqu hay 6 ciclos de reloj en
cada ciclo de timer (012321). Entonces la frecuencia ser dividida por 6. El ciclo de
trabajo ser un mltiplo de 33%, desde que la salida puede estar levantada para 0, 2, 4 o
6 de los ciclos. De la misma manera, si el timer cuenta hasta 255 y vuelve hacia abajo,
habr 510 ciclos de reloj en cada ciclo de timer, y el ciclo de trabajo ser un mltiplo de
1/255. Para resumir el PWM de correccin de fase divide por 2N, donde N es el valor
mximo del timer.
La segunda diferencia importante en la temporizacin es que el PWM rapido mantiene
la salida en alto para un ciclo ms que el valor del registro de salida comparado. El
motivo de esto es que para el PWM rpido contando hasta 255, el ciclo de trabajo puede
ser de 0 a 256, pero el valor del registro de salida comparado solo puede ser de 0 a 255.
que pasa con el valor perdido? El PWM mantiene la salida en alto para N+1 ciclos
cuando el registro de salida comparado es N por lo que el valor del registro de salida
comparado de 255 es el 100% del ciclo de trabajo, pero el valor del registro de salida
comparado de 0 no es el 0% del ciclo de trabajo sino un 1/256 del ciclo de trabajo. Esto
es diferente del PWM de correccin de fase, donde el valor de un registro de 255 es
100% del ciclo de trabajo y un valor de 0 es un 0% del ciclo de trabajo.
Timers y Arduino
Arduino soporta PWM en varios de sus pins de salida. No es obvio de manera inmediata
que timer controla cada salida, pero la siguiente tabla puede aclarar la situacin. Esta
ofrece a cada salida del timer a un pin de salida en el Arduino (las serigrafiados en la
placa), el pin en el chip Atmega, y el nombre y bit del puerto de salida. Por ejemplo la
salida del Timer 0 OC0A est conectada al Arduino en el pin 6; utiliza el pin del chip 12
que es tambin conocido como PD6.
Timer Salida Arduino output Chip pin Pin name
OC0A 6 12 PD6
OC0B 5 11 PD5
OC1A 9 15 PB1
OC1B 10 16 PB2
OC2A 11 17 PB3
OC2B 3 5 PD3
El Arduino realiza alguna inicializacin de los timers. El Arduino inicializa el
predivisor en los tres timers para dividir el reloj por 64. El Timer 0 es inicializado en
modo PWM rpido (fast PWM), mientras que el Timer 1 y el Timer 2 son inicializados
en el modo PWM de correccin de fase (Phase Correct PWM). Mira el archivo de
cdigo de Arduino wiring.c para ms detalles.
El Arduino utiliza el timer 0 internamente para las funciones millis() y delay(), estate
atento ya que cambiar la frecuencia de este timer causar que estas funciones sean
erroneas. Utilizar las salidas de PWM es seguro si no cambias la frecuencia, pienso.
La funcin analogWrite(pin, duty_cycle) asigna el pin apropiado al PWM y configura el
registro comparado de salida apropiado al ciclo de trabajo (duty cycle) (con el caso
especial del ciclo de trabajo 0 en el Timer 0). La funcin digitalWrite() apaga la salida
de PWM si es llamada en un pin del timer. El cdigo relevante esta en wiring_analog.c
y wiring_digital.c.
Si tu utilizas analogWrite(5, 0) obtendrs un ciclo de trabajo de 0%, aunque el timer del
pin 5 (Timer 0) utiliza PWM rpido. Como puede ser esto, cuando el valor 0 en el PWM
rpido produce un ciclo de trabajo de 1/256 como se explic ms arriba? La respuesta es
que analogWrite "Hace trampas"; este tiene un cdigo para-casos-especiales para apagar
explcitamente el pin cuando es llamado en el Timer 0 con un ciclo de trabajo de 0.
Como consecuencia, el ciclo de trabajo de 1/256 no est disponible cuando se utiliza
analogWrite en el Timer 0, y habr un salto en el ciclo de trabajo actual entre los valores
0 y 1.
Otros modelos de Arduino utilizan un procesador AVR diferente con timers similares.
El Arduino Mega utiliza el ATmega1280 (Ficha), el cual tiene cuatro timers de 16-bit
con 3 salidas cada uno y dos timers de 8-bits con dos salidas cada uno. Solo 14 de las
salidas PWM estn soportadas por la librera de Wiring de Arduino, no obstante algunos
de los modelos antiguos de Arduino utilizan el ATmega8 (Ficha), el cual tiene 3 timers
pero solo tres salidas PWM: Timer 0 no tiene PWM, Timer 1 es de 16 bits y tiene dos
salidas PWM, y el Timer 2 es de 8 bits y tiene una salida PWM.
Problemtica
Puede ser un poco intrincado poner a funcionar las salidas PWM. Algunos trucos:
Necesitas tanto el pin de salida habilitado como habilitar el modo de PWM en el
pin
para pode dar una salida.
Ejem. Necesitas hacer un pinMode() y configurar los bits del COM
Los diferentes timers utilizan el control de bits y predivisor por separado;
Revisa la documentacin para el timer apropiado.
Algunas de las conbinaciones de bits que esperas que funcionen estn
reservadas,
lo cual significa que si intentas utilizarlos, no funcinarn.
Por ejemplo, conmutar el modo no funcionar con un PWM rpido a 255, o con
salida B.
Asegurate que los bits estn configurados segn piensas. Las operaciones con
Bit pueden ser intrincadas,
as que chale un ojo a los valores de registro con el formato binario (BIN) y
asegurate que son los que esperas.
Asegurate de que ests utilizando los pines de salida correctos. Mira la tabla
anterior.
Probablemente querrs poner un condensador de desacople para evitar picos en
tu salida.
Un osciloscopio es muy til para depurar PWM si tienes acceso a uno. Si no tienes uno
te recomiendo utilizar tu tarjeta de sonido con un programa como xoscope.
Conclusin
Espero que este artculo ayude a explicar los modos de PWM del Arduino. Encontr la
documentacin de los diferentes modos de una forma algo opaca, y la informacin del
Desplazado-en-uno sin explicar. Por favor avisadme si encontrais algn error.

S-ar putea să vă placă și