Source: http://ebah.com/content/ABAAAAM_AAC/tim
Timestamp: 2018-02-22 10:38:17+00:00

Document:
Tim - Arquivos para explicar como se faz a programação de um PWM com...
ING. DANIEL DI LELLA DDFAEFor Motorola Products
Curso de Microcontroladores Familia HC908 Flash de Motorola Parte I
68HC 08 CPU
Module (CGM)
Interface Module (TIM)
Direct Me mory Access Module (DMA)
Rando m Access Me mory (RAM)
Electronically Progr am mable ROM
•Input captures –x flanco ascendente, descendente, o cualquier flanco de disparo
•Output compares –Set, clear, o “toggle action” como nivel de salida
•Pulse width modulation (PWM) ( Modulación por Ancho de Pulso ) –Generación de señal “Buffereada o no Buffereada”
•Clock del sistema con “prescaler” de 7 pasos.
Modo de operación “Free-running’ o “ Modulo up-count” Acción “ togle” sobre cualquier pin de canal en “Overflow ” Stop y reset del TIM Counter !!!!!
16-Bit Counter TRST
16-Bit Comparator TMODH:TMODL
To Channel Logic
El módulo TIM como timer simple solamente…..
Como se puede observar en el cuadro anterior, el módulo de timerdel HC908, toma como referencia para su temporización el Clock interno del Bus (FBUS), que obviamente esta relacionado con la frecuencia del Xtal externo (Fxtal / 4)o bién con la frecuencia del oscilador interno en el caso que el dispositívo tenga la opción de oscilador interno o PLL.
El módulo posee un “prescaler” que divide “N”veces la frecuencia de referencia que entra al mismo, para de esta forma obtener mayor flexibilidad en los rangos de demoras a obtener. Este prescaler puede ser programado por medio de los bits PS2, PS1, PS0en el Timer Status and Control Register (TSC).
Luego que el clock há sido dividido en el prescaler, ingresa a un contador de 16 bits de longitud. Este contador es del tipo “free-running” (de cuenta libre) con rango desde $0 a $F. Existeun comparador de 16 bits vinculado al contador y a un registro, también de 16 bits, denominado “TMOD”(Timer Modulo register) que está dividido en parte “alta”(TMODH)y parte “baja” (TMODL).
Durante el funcionamiento del timer, el contador es comparado permanentemente con el registro TMOD (TMODH , TMODL), por medio del comparador asociado a ellos,cuando la cuenta del mismo coincide con el valor almacenado en dicho registro, se produce “desborde” del timer o “Timer Overflow” , provocando las siguientes acciones:
-Se genera un Señal de “Timer Overflow Flag” (TOF), que nos indicará la condición de overflow del contador/comparador.
-Se genera un pedido de interrupción (Timer Overflow Interrupt) si esta se encuentra habilitada y se atiende la misma saltando a la dirección indicada por el vector respectivo (TIMx Overflow Vector).
El módulo TIM como timer simple solamente…… continua.
-Se produce un RESET automático del contador “Free –Running” forzandolo a $0.
Esta configuración permite operar el timer en modo “Free –Running”,o en modo “Modulo Up Counter”, según el valor del registro TMOD.
Si el registro TMOD (TMODH y TMODL) tiene un valor igual a $F, el timer funcionará en modo freerunning, ya que al llegar a $F , recien allí, el comparador emitirá una señal de RESET del contador y de disparo del flag TOF y de la interrupción, si estubiera habilitada.
Si el registro TMOD, tiene un valor menor a $F, entonces el timer funcionará como “Módulo Up Counter”, ya que al llegar al valor establecido en TMOD, provocará el mismo efecto que en el modo “free –running”, lo que garantiza la generación de una temporización (delay) flexible y programable, a diferencia del tipico modo “free –running” del timer de los HC705.
Los 2 canales de timer reciben sus clock reference desde: •Free running counter
•Modulo up counter
Consisten de : •Timer counter “ free running ” de solo lectura de 16 bits
•Modulo Register de 16 bit de lectura/escritura por software
•Comparador de 16 bits (timer counter vs. modulo register) –Cuando el contador concuerda con el modulo register..
•Se setea el Timer Overflow Flag (TOF)
•Resetea el contador a $0
•Los contadores comienzan las cuentas nuevamente !!!!
•Clock select and prescaler bits(PS2-PS0)
•Timer Overflow Flag (TOF)
Seteado cuando el timer counter de 16 bits se resetea a $0
Limpiado por lectura del TSC y luego escritura de un “0” en el TOF
–Si ocurre un “overflow ” durante la operación de limpieza, la escritura no tiene efecto.
1 = Timer ha sido reseteado
0 = Timer no ha sido reseteado todavia
•Timer Overflow interrupt Enable (TOE) habilita interrupciones por “timer overflow “ 1 = Habilita interrupción 0 = Deshabilita interrupción
WR IT E: 0 TRST READ: TOF 0
TOETSTOPPS2PS1PS0 TSC
–Detiene el conteo del timer 1 = Timer stopped 0 = Timer active
•Timer Reset (TRST)
–Resetea el timer counter y el prescaler –Limpieza automática despues del counter reset 1 = Reset contador y prescaler 0 = No tiene efecto
NOTA: Seteando ambos TSTOP y TRST detiene el contador en $0 !!!!!
PS2PS1PS0TIM Clock Source
Timer Counter Register (TCNTH, TCNTL) •Contador de solo lectura “free running” de 16 bits
•Se lee el byte alto manteniendo el byte bajo “latcheado” hasta la lectura
READ:BIT 15 BIT 14 BIT 13 BIT 12BIT 1 BIT 10 B IT 9 BIT 8
READ:BIT 7BIT 6 B IT 5BIT 4 BIT 3 BIT 2BIT 1 BIT 0
BIT 15 BIT 14BIT 13 BIT 12BIT 1 BIT 10BIT 9 BIT 8
BIT 7 BIT 6BIT 5BIT 4 BIT 3BIT 2 BIT 1 BIT 0
Timer Modulo Register (TMODH, TMODL) •El Contenido se compara con TCNTH, TCNTL para determinar el tiempo de reset
•Escribiendo el TMODH deshabilita TOF y overflow interrupts, hasta escribir el TMODL
Resolución y Rango del Timer
La resolución de Timer está determinada por el Clock del sistemay el valor del prescaler Resolución (sec) = 1 ÷ (Bus Clock ÷ prescaler)
Rango = 0 Resolución x valor de TMOD
Max Rango = 0 Resolución x 65,535
El rango del Timer depende del valor en TMODH y TMODL
•Calculamos la resolución y el rango dado por un Bus clock de 4 Mhz, y un valor de prescaler de 4 (010), y TMOD = $0F
Resolución = 1 ÷ ( 4 MHz ÷ 4 ) = 1 ÷ 1 MHz = 1µs Rango = 1µs x $0F = 1µs x 255 = 255 µs
CHANNEL X PTx
Logic CHxIE
TCHxH : TCHxL 16-bit Latch
EL SxB X EL SxA
TO Vx CHxMAX
Compare/ Capture Unit 16-bit Free Running Counter
El Status Flag se setea durante la captura
LatchEdge Select
& Detect ICx
Mascara de Interrupción local opcional (habilitada por medio del software)
• Provee un mecanismo para capturar el tiempo en el cuál ocurre un evento externo
Función “Input Capture”
Ejemplo de Input Capture -Medición del Ancho de Pulso -
1.Configurar el canal del timer para “ input capture” , “ rising edge” 2.Tiempo de CapturaT1 3.Tiempo de Captura T2 4.Periodo =T2-T1
El Status Flag se setea cuando la comparación coincide
• Provee un mecanismo para sacar una señal a un tiempo especifico
Set Pin Clear Pin
Toggle Pin La acción ocurre cuando coincide el contenido del compare register con el contador
Función “Output Compare”
Usos Posibles: •Generación de formas de ondas o pulsos
•Indicador de tiempo transcurrido (a un circuito externo)
•Disparo de eventos externos
Ejemplo de “Output Compare” -Generación de Pulsos -
1.Setear el valor a comparar T1
2. Configurar el canal de timer para “output compare”, setear lasalida
3.Setear el valor a comparar T2
4.Configurar el canal de timer para “output compare”, limpiar la salida 5.Ancho de pulso generado= T2-T1
Acción “Timer Overflow”
•Toggle on Overflow (TOVx) –Tiene control solo en modo “Output Compare” y PWM
–No tiene efecto cuando el canal está configurado como “input capture”
1 = Cambia el estado de la salida cuando hay “ Timer Overflow ” 0 = No hace nada cuando hay “Timer Overflow ”
WRITE:0 READ:CHxF
CHxIEMSxBMSxAELSxB ELSxA TOVxCHxMAX
Timer Channel registers (TCHx)
•Input Capture –El valor del “Timer register ” es memorizado cuando aparece un “input capture”
•Output Compare –Valor a comparar con el timer
BIT 15BIT 14BIT 13BIT 12BIT 1 BIT 10BIT 9BIT 8 TCHxH
RESET:INDETERMINADO DESPUES DEL RESET x = número de canal 0, 1.
BIT 7 BIT 6BIT 5BIT 4 BIT 3BIT 2BIT 1BIT 0 TCHxL
Selección de Modo, Flanco, y Nivel
X000Output PresetPin under port control; initial output lvl high X100Output PresetPin under port control; initial output lvl low 0001Input CaptureCapture on Rising Edge Only 0010Input CaptureCapture on Falling Edge Only 0011Input CaptureCapture on ANY (rising or falling) Edge 0101Output CompareToggle output line on Output Compare 0110OrClear output line to 0 on output compare 0111PWMSet output line to 1 on output compare 1X01Buffered OutputToggle output on compare 1X10Compare OrClear output on compare 1X10Buffered PWMSet output on compare
MSxB:MSx A ELS xB :ELSx A Mode Configurati on
CHxIEMSxBMSxA ELSxB ELSxATOVx CHxMAX
•Channel x Interrupt Enable (CHxE)
–Habilita las interrupciones del TIM al CPU sobre el canal x. 1 = Canal x CPU interrupt requests habilitado 0 = Canal x CPU interrupt requests deshabilitado
•Channel Status Flag (CHxF)
–Input Capture •Seteado cuando ocurre un flanco activo
•Seteado cuando el valor en el “TIM counter registers” coincide con el valor en el TIM channel register
–Limpiado por la lectura del “status register “ luego de escribirun “ 1” en CHxF
1 = Input capture o output compare en canal x 0 = No evento capture o output compare en canal x
CHxIE MSxB MSxA ELSxB ELSxA T OVx CHxMAX TSCx
Señal PWM Unbuffered
(el más conocido de los modos de generación de PWM…)
Cualquier canal puede generar Unbuffered PWM •Se usa “output compare”
•La salida cambia de estado basada en el “timer overflow”
El período PWM puede fijarse por: •Valor de la cuenta del Modulo ( Modulo count value )
•La salida del “Clock prescaler”
La duración del ancho del pulso puede fijarse por:
•Valor del “Timer compare register”
–El canal del timer configurado para forzar el pin de salida para complementar nivel del ancho de pulso
Generación de la señal PWM (Ejemplo)
T1= Período PWM = comandado por el Timer overflow •Calcular el valor del prescaler y TMOD = T1
Ejemplo:Quiero un PWM con un 50% de duty cycle y período de 100 µs desde un
T2=Ancho del Pulso = Valor del “Output compare” system clock de 4 Mhz.
Selecciono un prescaler de 4, Resolución = 1 ÷ (4 MHz ÷ 4) = 1µs TMOD= T1 ÷ Resolución = 100µs ÷ 1µs = 100 TCHxH:TCHxL= T2 = Duty cycle x TMOD = 50% x 100 = 50
A = Output compare, limpia la salida cuando ocurreB= Timer overflow, “cambia” la salida
Inicialización del Unbuffered PWM
1)Parar y Resetear el timer
2)Seleccionar el valor del “timer counter modulo” y el “ timer clock prescaler” para proveer período PWM requerido.
3)Cargar el “ Timer compare register” con el valor del ancho del pulso
4)Configurar el canal del timer para operación “output compare”
5)Seleccionar la función “timer counter toggle on overflow”
6)Configurar el canal del timer para forzar el pin de salida para complementar el nivel del ancho de pulso
•No debe ser usado “Toggle on output compare”
7)Habilitar el timer
Limitación para el Unbuffered PWM
El metodo anterior para cambiar el ancho del pulso funciona bien en la mayoría de los casos, excepto cuando el cambio en el ancho del pulso es muy grande !!
Ejemplo: No se podría cambiar desde un duty cycle del 9% al 1%
•Supera la “sincronización”y limitación en el ancho del pulsode los unbuffered PWMs •Se pueden “linkear” los Canales 0 para formar un Buffered PWM
Seleccionado por los bits MS0B y/o MS2B
•“Linkea” las salidas de los canales de timer como si fueran I/O
–Bajo el control del DDR y el data register –Independiente del seteo de TSC1
Operación del HC08 Buffered PWM
Configurar el canal 0 como para “unbuffered PWM”
•Excepto MSxB bit que es puesto a set en TSCx register El ancho del pulso inicial debe ser cargado en el output compareregister del canal 0
Subsequentes valores de ancho de pulso son escritos en el canal linkeado inactivo en cualquier tiempo •Escribiendo en el compare register del canal inactivo habilita ese canal
•Los cambios en el control de salida cambian después del prox. “counter overflow “ – Auto sincronización
Arquivos para explicar como se faz a programação de um PWM com microcontrolador Freescale.

References: Resolución 
 resolución 
 Resolución 
 Resolución 
 Resolución 
 resolución 

Resolución 
 Resolución 
 Resolución