http://www.arcos.inf.uc3m.es/~infostr Grupo de Arquitectura y Tecnologa de !omputadores "AR!#S$ %&': frecuencia y duty cycle (a t)cnica %&' "Pulse-Width Modulation$ o modulaci*n por anchura del pulso permite generar ondas cuadradas con una frecuencia y ciclo de actividad determinada: +n Arduino ,-# la frecuencia del reloj del sistema es 16Mhz ./0.12/ ciclos "tic3s$ por segundo tiempo de ciclo es ./ ./0.12/ 4 /5.6ns +s posi7le modificar la frecuencia para que el n8mero de ciclos por segundo sea . por cada +s posi7le modificar la frecuencia para que el n8mero de ciclos por segundo sea . por cada 9:./:35:/;: etc. ciclos de relo< del sistema. +ste =alor se llama factor de pre-escalado. +l ciclo de actividad "o duty cycle, DC$ representa la anchura del pulso: cu>nto tiempo de cada onda cuadrada hay pulso "6?$ y cu>ndo no lo hay "1?$. @uty cycle +<emplos de duty cycle: #tro e<emplo: analoWrite!pin,DC": es una funci*n de Arduino que escri7e en pin !salida" un determinado @! o duty cycle +st> funci*n se implementa como un %&' con una frecuencia fi<a "mediante un factor de preA escalado de /;$. %ro7lema: aunque permite modificar el duty cycle: no es posi7le modificar la frecuencia: ya que el =alor de preAescalado est> fi<o. Bntroducci*n a %&' %&' permite generar ondas con diferentes frecuencias y duty cycles usando ti#ers: ,n timer es un contador soft$are que cuenta ciclos de relo<: el timer usa el relo< de la !%, "o relo< del sistema$. +l timer se puede configurar para que solo se incremente cada C ciclos en lugar de cada ciclo. "siendo C el factor de preescalado$ lugar de cada ciclo. "siendo C el factor de preescalado$ ,n timer cuenta desde 1 hasta 'AC: 'AC es el m>Dimo que puede almacenar: y depende del n8mero de 7its del timer: Si el timer usa n 7its cuenta de 1..52nA. +<emplo con n49 1 566 Timer "E.$ tic3. tic3566 %recuencia4.tic3 por c/factor preAescalado Si usamos preAescalado49: en un perodo hay "./0.12//9$0566 Bntroducci*n a %&' %&' permite generar ondas con diferentes frecuencias y duty cycles usando ti#ers: +l duty cycle se modifica haciendo uso de un reistro de co#paracin& ,n registro de comparaci*n almacena un =alor comprendido entre 1 y 'AC !ada registro de comparaci*n esta asociado a una salida digital "%&'$. %or e<emplo: en Fast %&': si el =alor del contador del timer es menor que el registro de %or e<emplo: en Fast %&': si el =alor del contador del timer es menor que el registro de comparaci*n: la salida emite 6 = "=alor .$. +n caso contrario emite 1 = "=alor 1$. +<emplo: un timer de n49 7its y =alor de comparaci*n 52n/5A. genera un @!461G 1 566 Timer "E.$ .5H Reg. comparaci*n Salida generada @! es 61G 'odos 7>sicos de %&': Fast %&' %ast PWM& +l timer cuenta de 1 a 'AC y =uel=e a 1. (a salida generada toma el =alor . "#-$ cuando el timer es igual a 1 (a salida generada toma el =alor 1 "#FF$ cuando el =alor del timer alcanIa el =alor del registro de comparaci*n 566 1 566 Reg. comparaci*n Salida generada 'odos 7>sicos de %&': Fase correcta Phase-Correct PWM& +l timer cuenta de 1 a 'AC y decrece hasta 1. (a salida generada toma el =alor 1 "#FF$ cuando el timer alcanIa el =alor del registro de comparaci*n durante la cuenta hacia adelante "1..'AC$ (a salida generada toma el =alor . "#-$ cuando el timer alcanIa el =alor del registro de comparaci*n durante la cuenta hacia atr's "'AC..1$ 1 566 Reg. comparaci*n Salida generada Timers de Arduino Arduino tiene ( )i#ers ")i#er*, )i#er1, )i#er+$: !ada timer tiene + reistros de ,W que permiten configurar las opciones de %&' )CC-./ y )CC-.0 ".1*,1,+$ dependiendo del timer usado !ada timer tiene otros + reistros de ,W que act8an como registros !ada timer tiene otros + reistros de ,W que act8an como registros de comparaci*n: 2C-./ y #C-.0 ".1*,1,+$ dependiendo del timer usado !ada timer tiene + salidas que pueden conectarse a dos salidas PWM de /rduino& )i#er * salidas 6 !/" y 3 !0" )i#er 1 salidas 4 !/" y 1* !0" )i#er + salidas 11 !/" y ( !0" Timer 1 "9 7its$ )CC-*/ 5 )i#er6Counter Control -eister / )CC-*0 5 )i#er6Counter Control -eister 0 !#'1A. !#'1A1 !#'1J. !#'1J1 AA AA &G'1. &G'15 R/& R/& R/& R/& R R R/& R/& )CC-*0 5 )i#er6Counter Control -eister 0 7eyenda& &G' "&a=eform Generation 'ode$ permite seleccionar modo %&' !S "!loc3 Select$ permite especificar el factor de preAescalado (os 7its !#'1 permite ha7ilitar: desha7ilitar o in=ertir las salidas A y J F1!1A F1!1J AA AA &G'15 !S15 !S1. !S11 & & R R R/& R/& R/& R/& Timer . "./ 7its$ )CC-1/ 5 )i#er6Counter Control -eister / )CC-10 5 )i#er6Counter Control -eister 0 !#'.A. !#'.A1 !#'.J. !#'.J1 AA AA &G'.. &G'.1 R/& R/& R/& R/& R R R/& R/& )CC-10 5 )i#er6Counter Control -eister 0 7eyenda& &G' "&a=eform Generation 'ode$ permite seleccionar modo %&' !S "!loc3 Select$ permite especificar el factor de preAescalado (os 7its !#'. permite ha7ilitar: desha7ilitar o in=ertir las salidas A y J B!-!. B!3S. AA &G'.3 &G'.5 !S.5 !S.. !S.1 & & R R/& R/& R/& R/& R/& Timer 5 "9 7its$ )CC-+/ 5 )i#er6Counter Control -eister / )CC-+0 5 )i#er6Counter Control -eister 0 !#'5A. !#'5A1 !#'5J. !#'5J1 AA AA &G'5. &G'51 R/& R/& R/& R/& R R R/& R/& )CC-+0 5 )i#er6Counter Control -eister 0 7eyenda& &G' "&a=eform Generation 'ode$ permite seleccionar modo %&' !S "!loc3 Select$ permite especificar el factor de preAescalado (os 7its !#'5 permite ha7ilitar: desha7ilitar o in=ertir las salidas A y J F1!5A F1!5J AA AA &G'55 !S55 !S5. !S51 & & R R R/& R/& R/& R/& !onfiguraci*n de opciones ,n registro de K& se modifica como una =aria7le de S& )CC-+/13 #pciones %&' se configuran escri7iendo so7re los registros de K& %ara acti=ar/desacti=ar 7its de los registros se usa la macro %ara acti=ar/desacti=ar 7its de los registros se usa la macro 809!pin" donde pin es el nom7re del 7it que queremos acti=ar. Se utiliIan operadores de :its "L y M$ para hacer operaciones /;D y 2- con el resto de 7its de los registros )CC-+/109!C2M+/1" acti=a "pone a .$ el 7it !#'5A. del registro T!!R5A )CC-+/1)CC-+/<09!C2M+/1" acti=a "pone a .$ el 7it !#'5A. del registro T!!R5A y mantiene el =alor del resto de 7its del registro