Beruflich Dokumente
Kultur Dokumente
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 .
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).
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.
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.
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
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.