Sie sind auf Seite 1von 14

OBJETIVO.

El objetivo principal de esta práctica es entender el funcionamiento de los módulos


temporizadores, y el ADC del PIC16f887, Dichos módulos son el TIMER1 y
TIMER2, los cuales serán utilizados para el control de un servomotor, un TIMER
será utilizado para crear una temporizacion de 20 ms, y con el otro TIMER será
utilizado para crear una temporizacion de 0.7ms a 2.3ms poniendo en alto por
determinado tiempo, esto se puede lograr gracias al timer 2, el cual consiste en
que se crea una interrupción cuando se compara un valor con un registro llamado
PR2, a través de un potenciómetro con el empleo del ADC el cual convertirá el
valor leído en el potenciómetro al valor correspondiente de acuerdo a una seri de
cálculos que se tendrán que realiza, par que después dicho valor se cargue aun
respectivo valor en una tabla con valores calculados para que se produzca un
pulso de 0.67 a 2.3 ms, controlando asi la posición del servomotor con el ángulo
del potenciómetro.
DIAGRAMA ELECTRICO.
TEORÍA BÁSICA

Potenciometro.
Un potenciómetro es un componente electrónico
similar a los resistores pero cuyo valor de resistencia
en vez de ser fijo es variable, permitiendo controlar la
intensidad de corriente a lo largo de un circuito
conectándolo en paralelo ó la caida de tensión al
conectarlo en serie. Un potenciómetro es un
elemento muy similar a un reostato , la diferencia es
que este último disipa más potencia y es utilizado
para circuitos de mayor corriente, debido a esta
carácterística, por lo general los potenciómetros son
generalmente usados para variar el voltaje en un circuito colocados en paralelo,
mientras que los reostatos se utilizan en serie para variar la corriente .

Un potenciómetro está compuesto por una resistencia de valor total constante a lo


largo de la cual se mueve un cursor, que es un contacto móvil que divide la
resistencia total en dos resistencias de valor variable y cuya suma es la resistencia
total, por lo que al mover el cursor una aumenta y la otra disminuye. A la hora de
conectar un potenciómetro, se puede utilizar el valor de su resistencia total o el de
una de las resistencias variables ya que los potenciómetros tienen tres terminales,
dos de ellos en los extremos de la resistencia total y otro unido al cursor.

Convertidor Analógico Digital.


El transductor elemental que se utiliza para digitalizar las señales de estos
fenómenos es el Conversor Analógico a Digital, ADC, que convierte una tensión
eléctrica en un valor numérico. De algún modo, cualquier otra señal puede llegar a
manifestarse eléctricamente, de allí a tensión eléctrica, y la tenemos. Así es como
funcionan por ejemplo los sensores de luz, de temperatura (de calor), etc.
Un conversor ADC es un
circuito que toma valores
analógicos de tensión y los
convierte en códigos binarios. Los valores que definen los límites de las tensiones
a medir se denominan voltajes de referencia y se representan por Vref- (el mínimo)
y Vref+ (el máximo).
La resolución del conversor queda determinada por la cantidad de bits que
representan el resultado de la conversión. Así, se pueden encontrar conversores
de 8 bits, de 12 bits, etc.
Entre Vref- y Vref+ se pueden concebir infinitos valores analógicos, pero con n bits
solo se pueden formar valores discretos diferentes. Por lo tanto habrá valores
analógicos que no podrán ser representados con exactitud.
La diferencia entre dos valores analógicos correspondientes a dos valores
digitales consecutivos se define como resolución de voltaje de ADC.

El módulo convertidor Análogo Digital (A/D) del PIC 16F887 tiene 8 canales de
entrada. La conversión de la señal analógica aplicada (a uno de los canales) se
plasma en número binario de 10 dígitos. El módulo A/D posee voltajes de
referencia que pueden ser seleccionados para emplear las tensiones VDD, VSS
del microcontrolador o puede emplear tensiones aplicadas a los pines RA2 o RA3
(incluso es posible establecer combinaciones de los anteriores valores).

Para operar el modulo ADC contamos con 4 registros:

Registro de resultado de byte alto de la conversión A/D (ADRESH). Banco 0, 0x1E


Registro de resultado de byte bajo de la conversión A/D (ADRESL). Banco 1, 0x9E
Registro 0 de control del módulo A/D (ADCON0). Banco 0, 0x1F
Registro 1 de control del móodulo A/D (ADCON1). Banco 1, 0x9F

El detalle del registro ADCON0 se muestra a continuación:


Y el detalle del registro ADCON1 se muestra a continuación:
El registro ADCON1 configura las funciones de los pines de entrada al módulo.
Como se aprecia se puede configurar los pines del puerto A como entradas
analógicas inclusive la línea RA3 puede funcionar como el votaje de referencia.

Los registros ADRESH:ADRESL contienen el resultado de la conversión (10 bits).


Cuando se ha completado una conversión el resultado es almacenado en
ADRESH:ADRESL y además el bit GO/-DONE (registro ADCON bit 2) se pone a
0-lógico y el bit ADIF (registro PIR1 bit 7) se pone como 1-lógico. El registro PIR1
ocupa la posición 0x0C del banco 0. He aquí parte del registro que volveremos a
tocar en el módulo de interrupciones:
Servomotor.
Un servomotor, es un motor con un eje de rendimiento controlado, es decir, que
podemos posicionarlo a nuestro antojo, siempre dentro de su rango de actuación.
Por lo general los servomotores suelen tener un rango de 180º aunque existen de
210º e incluso de rotación continua.

¿Como funcionan los servomotores?

Bien, los servomotores son en realidad


motores de corriente continua con una serie
de engranajes que transforman su
velocidad, en torque (fuerza) y un sistema
de control que utiliza un potenciómetro para
saber constantemente la ubicación del eje,
este sistema de control, además, responderá
a una señal que nosotros le enviemos para
establecer la posición del eje…

La señal que introducimos al servo, es una señal parecida, que no igual, a la del
tipo PWM que ya conocemos, digo esto ya que la función PWM de Arduino,
recordemos que la utilizábamos para simular una señal analógica con la función
analogWrite(), de manera que dependiendo del ancho de los pulsos digitales
emitidos con una frecuencia de 416Hz, nos emulaba una señal analógica, pero
para los servos no queremos eso, vamos a emitir pulsos con una frecuencia
mucho menor, 50Hz, y serán meramente digitales, sin intención de querer ser
nada analógico y dependiendo del ancho del pulso que le enviemos (he ahí el
parecido), nuestro servo se situará en una posición o en otra, los pulsos deben
llevar una frecuencia de 20ms (los 50Hz) entre ellos para que el servomotor los
interprete correctamente, aunque podrían funcionarnos igualmente en un intervalo
entre 10ms y 30ms, con esto queremos decir que el servomotor va a leer cada
20ms su entrada de señal, y dependiendo de lo que dure el 1 lógico (ancho del
pulso de +5v) calculará el grado del
eje en el que se debe situar

Timer 1
El Timer1 es un
temporizador/contador
ascendente parecido al
TMR0, pero con algunas
peculiaridades que lo
hacen muy interesante a
la hora de incluir
temporizaciones en
nuestros programas.
La primera de ellas, es que se trata de un contador de 16 bits cuyo valor se
almacena en dos registros de 8 bits el TMR1H y el TMR1L, ambos registros se
pueden leer y escribir su valor durante la ejecución del programa.

Cuando el Timer1 está habilitado, el valor de esos registros se incrementan desde


0000h a FFFFh y una vez que llega a su máximo valor empieza otra vez desde 0
avisándonos de ello por medio de la bandera TMR1F .
Si está activa la interrupción por desbordamiento del Timer 1 al desbordarse el
contador, el programa entra en la función de tratamiento a la interrupción por
desbordamiento del Timer1.

El diagrama de bloques es el siguiente:

Algunas características de este Timer son las siguientes:


El Timer1 puede funcionar con un oscilador externo y trabajar a una frecuencia
distinta a la del oscilador principal del PIC.
Al igual que el TMR0 el Timer1 puede operar en dos modos: como temporizador y
como contador. El modo de funcionamiento está determinado por el tipo de reloj
seleccionado (interno -->temporizador, externo -->contador), lo configuramos por
medio del bit TMR1CS del registro TICON. Cuando está en modo contador su
valor se incrementa en cada flanco de subida de la señal de reloj externa.
El tiempo que se tarda en incrementarse el contador se le suele llamar paso, el
paso del contador depende de la frecuencia del oscilador y del prescaler
seleccionado.
La fórmula para determinar los tiempos del Timer1 cuando es utilizado como
temporizador (Reloj interno) es la siguiente:

El Timer1 se
puede habilitar o deshabilitar por medio del bit TMR1ON del registro T1CON.

TIMER 2.
El Timer 2 es un temporizador de 8 bits que tiene la particularidad de tener un
preescalador y un post-escalador. Además este módulo cuenta con un registro de
periodo PR2 que marca el valor máximo que puede alcanzar la cuenta del registro
TMR2. A diferencia de los otros temporizadores, el temporizador Timer 2 no
incrementa su cuenta hasta llegar a 0xFF y después al desborde sino que
incrementa su cuenta desde 0x00 con cada ciclo de instrucción hasta que el valor
del registro TMR2 coincide con el del registro PR2 y después, en el siguiente ciclo
reinicia la cuenta desde 0x00.

Este módulo cuenta con un preescalador y un post-escalador. El preescalador


tiene la misma función que en los otros dos timers y sirve
como divisor de frecuencia antes de cada incremento. El post-escalador funciona
como un divisor de frecuencia después de cada coincidencia
entre los registros TMR2 y PR2. Si el post-escalador es 1:1 la bandera de
interrupción TMR2IF se habilitará en cada coincidencia entre TMR2 y PR2, en
cambio si por ejemplo el post-escalador es 1:16, la interrupción se presentará
cada 16 coincidencias.

Este temporizador, al igual que el Timer 1, puede habilitarse y deshabilitarse


mediante el bit TMR2ON.

El preescalador se selecciona con los bits T2CKPS1:T2CKPS0 y el post-escalador


con los bits T0UTPS3:TOUTPS0 de la siguiente manera:
Preescalador Post-escalador
00 = 1:1 0000 = 1:1
01 = 1:4 0001 = 1:2
1x = 1:16 0010 = 1:3
.
.
.
1111 = 1:16
Carga y Temporización

La temporización del Timer 2 está dada por la siguiente expresión:

TempTMR2 = [Preescaler*(PR2+1)*Postscaler]*Tinstr

Donde
Preescaler = Valor del preescalador
PR2 = Valor cargado al registro PR2
Postscaler = Valor del post-escalador
Tinstr = 4/frecuencia de oscilación
TempTMR2 = Temporización dada en segundos

La temporización máxima que puede alcanzar el Timer 2 es la misma que alcanza


el Timer 0. Utilizando el oscilador interno del pic 16f628 la temporización máxima
sería de 65536uS. Si se desea otra temporización se puede lograr cargando el
valor necesario al registro PR2.

PR2 = [([TempTMR2/(4/fosc)])/(Preescaler*Postscaler)]-1
Desarrollo en ASM y C
Para realizar el diagrama de flujo de esta práctica se realizaron algunos cálculos ya que se
utiliza el convertidor analógico digital (ADC), por lo que se mostraran las diferentes
consideraciones que se utilizaron. El nombre que le asignamos a esta práctica fue el de
Servomotor con ADC.
Lo primero que se realizo fue la configuración de nuestro programa en general, por lo que
se configuro el puerto B como salida digital ya que se utilizara el pin RB7 como el control
del servomotor. En seguida se configuro el pin RA0 como entrada analógica, la cual será
utilizada para el ADC, el cual está controlado por un potenciómetro.
A continuación se configuro el ADC, en el cual según el datasheet del PIC indica que debe
de trabajar a 4Mhz con una frecuencia de oscilador entre 8. En nuestro caso habilitamos el
canal AN0 el cual correspondo a la entrada RA0, la cual como ya se había mencionado es
la que nos ayudara para realizar la conversión. Se realizó la justificación a la izquierda, así
como los voltajes de referencia para el ADC serán VSS y VDD.
De igual forma que la práctica del servo con Switch se utilizaron dos TIMERS, el TIMER1 se
encargó de contar los 20ms que es el periodo completo del servomotor y el TIMER2 se
utilizó para contar el tiempo en alto del servomotor.
A diferencia de la práctica del servomotor con Switch, esta vez se tendrán 8 bits, es decir
tendremos 255 posiciones diferentes en el servomotor, para ser más exactos en sus
posiciones. Para esto se realizaron las siguientes configuraciones.
El TIMER1 al igual que la práctica anterior, se configuro con preescalador de 1:1, y tiene
como función contar 20ms que es el periodo completo del servomotor, por lo que se
cargó el número 45,536 en el TIMER1, para que solo necesite contar 20,000 (20ms) y se
genera la interrupción, ya que el TIMER1 es de 16 bits (65,536).
El TIMER2 al igual que la práctica anterior será el encargo de contar el ciclo de trabajo del
servomotor, sin embargo el ciclo de trabajo en esta práctica será de 0.6ms a 2.3ms, ya que
según el servomotor con el que trabajamos esos son los tiempos que maneja. Por lo tanto,
se realizaron los siguientes cálculos.
Como el TIMER2 tiene un preescalador, postescalador y PR2, se deben de realizar los
cálculos para que el PR2 no pase de 255 que es lo máximo que puede valer, por lo que al
tener los valores 0.7 y 2.3, lo multiplicamos por un postescalador de 1:10, con la finalidad
de obtener valores enteros, en este caso tendríamos que el PR2 puede varias de 70 a 230,
lo cual es un rango permitido ya que no sobrepasa los 250. Por tal razón el TIMER2 quedo
con la configuración Preescalador 1:1, Postescalador 1:10 y PR2 de 70 a 230.
En seguida se realizo una tabla en la cual sabremos cuanto cambiara en grados el
servomotor cada vez que se mueva 1bit en el potenciómetro (ADC). Para esto se utilizó
una ecuación como se muestra a continuación.
Como nuestro servo tendrá un periodo minimo de 0.7ms y un periodo máximo de 2.3ms
en alto, se tiene una diferencia de 1.6ms es decir nuestro ciclo de trabajo es de 1.6ms, al
ser multiplicado por el valor del postescalador tenemos el valor de 160. Es decir
tendremos un ciclo de trabajo de 160 para 255 bits, de esta forma obtenemos los grados
que se moverá.
160
𝐺𝑟𝑎𝑑𝑜𝑠 = = 0.627
255

En seguida multiplicamos los grados por lo que se tiene en el ADC, que puede ser de 0 a
255, y el resultado lo sumamos a 70, el cual es el valor mínimo del siglo de trabajo de
nuestro servomotor, por lo que la ecuación quedaría de la siguiente manera.
160
𝑃𝑅2 = (𝑉𝑎𝑙𝑜𝑟 𝑑𝑒𝑙 𝐴𝐷𝐶) ( ) + 70
255
Por ejemplo, si tenemos un valor en el ADC de 200, se realiza el cálculo y obtenemos:
160
𝑃𝑅2 = (200) ( ) + 70
255
𝑃𝑅2 = 125.49 + 70
𝑃𝑅2 = 195.49 = 195
Con ayuda de la ecuación anterior se realizó una tabla en Excel en la cual se metieron los
valores del PR2 en una columna, y después la ecuación anterior en la siguiente columna y
automáticamente, nos arrojó los resultados correspondientes a los 255 valores de PR2.
Por ultimo solo se redondeó el resultado con la función REDONDEAR de Excel. La tabla
quedo de la siguiente manera.
Después de realizar las configuraciones de los TIMER se habilitaron las interrupciones de
ambos, mientras están apagados. Una vez habilitadas se inició la conversión del ADC, esta
conversión se realiza con el bit GO del registro ADCON, cuanto este bit esta en 1 quiere
decir que se está realizando la conversión, y automáticamente cambia a 0 cuando se
terminó la conversión, una vez que termina la conversión se carga al registro W lo que
tenemos en el ADC. Como justificamos a la izquierda, se toman los valores del registro
ADRESH y se coloca en el PR2. Una vez que se tiene el valor de PR2, se inicia la cuenta con
el TIMER1 y esperamos la interrupción.
Para asegurarnos que se realizó la interrupción por TMR1 y no por TMR2, checamos que la
bandera de interrupción del TIMER1 este activada, si lo está atenderemos la interrupción
del TMR1 si no atenderemos la del TMR2.
Al atender la interrupción del TIMER1 ponemos en alto el pin RB7, el cual es el control del
servo, el cual tomara el valor del PR2. Después limpiamos la bandera de interrupción del
TIMER1 y cargamos de nuevo el valor de 45,536 para que después de que el TIMER2
cuente de según el PR2, vuelva a contar los 20ms del periodo completo. Una vez cargado
el valor al TIMER1, iniciamos la conversión del ADC, se enciende el TIMER2 y esperamos
interrupción.
Al atender la interrupción del TIMER2, se pone en bajo el pin RB7, lo cual indica que
termino el ciclo de trabajo, se apaga el TIMER2 y se borra su bandera de interrupción, en
seguida se toma el valor que este en el ADC, y se carga al registro w, para después
cargarlo al PR2 y regresar de nuevo a la rutina del programa normal.
El diagrama de flujo es el siguiente:
CONCLUSIONES.
Es de gran importancia conocer el funcionamiento de los temporizadores ya que con ellos
podemos realizer un sin fin de aplicaciones, sacando al maximo el aprovechamiento del
microcontrolador, en este caso lo aplicamos para el control de un servomotor, empleando
uno para la el periodo para la frecuencia en que opera el servomotor y con el otro el control
del cliclo de trabajo, a diferencia de la practicas anteriores que hizo el uso del TIMER0 y
TIMER2, en esta practica se empleo el uso del TIMER1 el cual es un timer muy util ya que
puede manejar una temporizacion mayor ya que tiene una resolucion de 16bits, el cual
genera una interrupcion dde pasar de 65536 a 0, su funcionamiento es casi igual que el del
Timer0, solo que este es de 16 bits.
Tambien se comprendio el funcionamiento del modulo ADC in corporado en el
microcontrolador, con el cual en este caso lo empleamos para determinar la posicion de un
servomotor, convirtendo una señal analogica (voltaje), en una señal digital que tomaba
valores de 0 a 1023 esto debido a que se empleo una resolucion de 10 bits, que de acuerdo
al valor leido del ADC tomabaun valor correspondiente a este, en una tabla calculada para
cargar un valor correspondiente en el PR2 y asi controlar el tiempo en alto que permanecia,
variando la posicion del servomotor.

Das könnte Ihnen auch gefallen