P11 Electronica

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 11

Índice de Contenido

1. Objetivos 3

2. Marco Teórico 3

3. Marco Conceptual 6

4. Desarrollo 7

4.1. Parte A 7

4.1.1. Simulación 9

4.2. Parte B 9

4.2.1. Simulacion 11

5. Análisis de Resultados y Conclusiones. 12

6. Aportaciones, Sugerencias, Etc. 12

7. Otros puntos adicionales que el alumno considere necesario agregar. 12

8. Bibliografía y Referencias Impresas (en formato digital).12

Anexo 14

Índice de Figuras

Figura 1 Modos de funcionamiento Timer Arduino 4

Figura 2 Registros 5

Figura 3 Cambios de estado 6

Figura 4 Señal obtenida en el osciloscopio Parte A 8

Figura 5 Circuito físico de Parte A 8

Figura 6 Señal obtenida en el osciloscopio en proteus Parte A 9

Figura 7 Simulacion Parte A 9

Figura 8 Señal obtenida en osciloscopio Parte B 10

Figura 9 Circuito físico Parte B 11

Figura 10 Señal obtenida en osciloscopio Proteus Parte B 11

Figura 11 Simulación Parte B 11

Índice de Tabla
Tabla 1 Registros de control 5

Objetivos

Conocimientos de los diferentes tipos de Interrupciones en el Microcontrolador.


Conocer el funcionamiento de las Interrupciones de Sistema de Microcontrolador
ATMEGA328P y RP2040.
Configuración de Interrupciones en la programación con Arduino IDE y Python,
para configuración del microcontrolador ATMEGA328P y RP2040.
Saber la inicialización de Interrupciones con el Microcontrolador.

Marco Teórico

Los temporizadores son registros del microprocesador que se incrementan según


los impulsos del reloj o los impulsos externos. Es posible configurarlos para
modificar su comportamiento.
El microprocesador Arduino UNO (ATmega328P) tiene 3 temporizadores:
timer0 (8 bits) cuenta de 0 a 256 y controla el PWM de los pines 5 y 6. También es
utilizado por las funciones delay(), millis() y micros().
timer1 (16 bits) cuenta de 0 a 65535 y se utiliza para el control PWM de los pines 9
y 10. También es utilizado por la biblioteca Servo.h
timer2 (8 bits) que es utilizado por la función Tone() y la generación de PWM en
los pines 3 y 11.

Teniendo en cuenta que los pulsos ocurren a frecuencia constante es posible


contar los pulsos que han ocurrido. También podrás determinar el tiempo que ha
transcurrido desde que se empezó a contar. Es decir, que si los pulsos ocurren
cada 0.5 segundos y se han contado 4 pulsos hace un total de 2 segundos.
Afortunadamente, el microcontrolador de las placas Arduino ya cuenta con un
módulo que es capaz de realizar esto por sí solo. Estos módulos son denominados
contadores o temporizadores y su tarea es muy simple: mantener un registro con
los pulsos generados por el hardware clock.

[Escriba aquí]
El timer está relacionado con las interrupciones de Arduino, ya que serán
ejecutados a través de ellas para atender alguna tarea específica. Dicho de otro
modo, el Timer de Arduino es una función que se dispara en un tiempo
determinado, ejecutando una función de interrupción. Por eso es importante
también conocer estas interrupciones.
Modos
El Timer de Arduino tiene 2 modos de funcionamiento, pudiéndolo usar en:
Señal PWM: se puede controlar los pines de Arduino (~).
CTC (Clear timer on compare match): contabiliza el tiempo dentro de un contador
y cuando alcanza el valor especificado en un registro de los timers, se ejecuta la
interrupción.

Figura 1 Modos de funcionamiento Timer Arduino

La función millis() con Arduino


La función millis() permite obtener la cantidad de milisegundos que han pasado
desde que comenzó la ejecución del código, es decir, que toma el registro de
pulsos generados por el contador y los emplea para calcular el tiempo en
milisegundos.
No requiere parámetros y retorna un valor entero, de tipo unisgned long, que
representa la cantidad de milisegundos transcurridos desde que la placa fue
encendida.
La función micros() con Arduino
En caso de que necesites manejar tiempos con mayor precisión es posible utilizar
la función micros(). Esta función es similar a millis() pero devuelve el tiempo en
microsegundos.

[Escriba aquí]
De igual manera no requiere parámetros y retorna un entero, de tipo unsigned
long.
Configuración del temporizador
La parte más complicada del uso del sensor es su configuración. Un temporizador
se configura mediante su registro de control. Aquí está el recordatorio de los
registros.

Tabla 1 Registros de control


Timer 0 Timer 1 Timer 2 Rôle
TCNT0 TCNT1L TCNT2 Timer (bit 0 a 7)
- TCNT1H - Timer (bit 8 à 15)
TCCR0A TCCR1A TCCR2A Registre de contrôle
TCCR0B TCCR1B TCCR2B Registre de contrôle
- TCCR1C - Registre de contrôle
OCR0A OCR1AL OCR2A Output Compare (bit 0 à 7)
- OCR1AH - Output Compare (bit 8 à 15)
OCR0B OCR1BL OCR2B Output Compare (bit 0 à 7)
- OCR1BH - Output Compare (bit 8 à 15)
- ICR1L - Input Capture (bit 0 à 7)
- ICR1H - Input Capture (bit 8 à 15)
TIMSK0 TIMSK1 TIMSK2 Interrupt Mask
TIFR0 TIFR1 TIFR2 Interrupt Flag

El registro TCNTx contiene el valor del temporizador/contador, los registros


TCCRxA y TCCRxB son los registros de control. OCRxA y OCRxB contienen los
valores de los registros a comparar. TIMSKx contiene la máscara de interrupción y
TIFRx contiene las banderas de habilitación.

[Escriba aquí]
Marco Conceptual

El Timer de Arduino, o temporizador, es una función implementada por hardware


(en el microcontrolador, con ayuda del cristal de cuarzo que genera los pulsos de
reloj y que marca el «ritmo», sin necesidad de hardware externo ni CIs 555) que
permite controlar eventos temporales gracias a unos relojes internos. Por ejemplo,
realizar que una tarea se realice a intervalos, realizar mediciones de tiempo
precisas, etc., de forma independiente del código del sketch.
Como Arduino UNO tiene un chip MCU que trabaja a 16 Mhz, se podrían ejecutar
16.000.000 cada segundo. Las instrucciones necesitan X ciclos para ejecutarse,
no todas se ejecutan en los mismos ciclos de reloj, por ejemplo, las de 16-bits
necesitan más ciclos en esta arquitectura AVR.
Un hardware clock es un circuito electrónico que genera una señal de voltaje
cuadrada a una frecuencia constante. Es decir, que la señal se mantiene en un
estado (alto o bajo) durante un tiempo fijo y luego cambia, tal y como se muestra
en la figura siguiente.

Figura 3 Cambios de estado

PWM (modulación por ancho o de pulso) es un tipo de señal de voltaje utilizada


para enviar información o para modificar la cantidad de energía que se envía a
una carga. Este tipo de señales es muy utilizada en circuitos digitales que
necesitan emular una señal analógica, en las cuales se les cambia el ancho
relativo respecto al período de la misma, el resultado de este cambio es llamado
ciclo de trabajo y sus unidades están representadas en términos de porcentaje.
Biblioteca Servo

[Escriba aquí]
Esta biblioteca permite a una placa Arduino controlar servomotores RC (hobby).
Los Servos integran engranajes y un eje que puede ser controlado con precisión.
Los servos estándar permiten que el eje sea colocado en distintos ángulos, por lo
general entre 0 y 180 grados. Los servos de rotación continua permiten la rotación
del eje para ajustarse a diferentes velocidades.

La biblioteca Servo soporta hasta 12 motores en la mayoría de las placas Arduino


y 48 en el Arduino Mega. En las placas que no sean las Mega, el uso de la
biblioteca desactiva analogWrite) funcionalidad ((PWM) en los pines 9 y 10, exista
o no un servo en los pines. En los Mega, hasta 12 servos pueden ser utilizados sin
interferir con la funcionalidad PWM; el uso de 12 a 23 motores desactivará PWM
en los pines 11 y 12.
Desarrollo

Material y equipo utilizado


1 Computadora
1 Software Arduino IDE y Thonny.
1 Tarjeta Arduino Uno ESP32 (KIT Microcontrolador).

Parte A

Este programa obtenemos una señal cuadrada (pulsos de reloj) la cual podemos
observar en el osciloscopio en donde se tienen intervalos cada 10ms. El código
que hará este trabajo está diseñado en el software de Arduino ID.
#include<avr/io.h>

#include<avr/interrupt.h>

#define RETARDO 1000  // 1000 milisegundos - 1 segundo

int main(void) {

    int milis=0;

     // Timer en modo normal, sin salida por OC0 con prescaler de 1024

    TCCR0B = (1 << CS00) | (1 << CS02);

     // Puerto PB0 como salida.

    DDRB = (1 <= 0); // si ya pasaron 10 milisegundos

[Escriba aquí]
    while(1){

            TCNT0=0;

            if((milis+=10) >= RETARDO) // si ya pasaron 1000 milisegundos

            {

                // cambia el estado del led

                PORTB ^= (1 << PB0);

                // reinicia el contador de milisegundos

                milis=0;

            }        

    }

    return 0;

Figura 4 Señal obtenida en el osciloscopio Parte A

[Escriba aquí]
Figura 5 Circuito físico de Parte A

Simulación

Figura 6 Señal obtenida en el osciloscopio en proteus Parte A

Figura 7 Simulacion Parte A

Parte B

Este programa obtenemos una señal cuadrada la cual podemos observar en el


osciloscopio en donde se tienen intervalos cada 10ms y el led enciende y apaga
con mucha velocidad. El código que hará este trabajo está diseñado en el software
de Arduino ID.
#include<avr/io.h>

[Escriba aquí]
#include<avr/delay.h>

#define LDT PD5

int main(void) {

    DDRD |= (1<<LDT);                    //Configura terminal PD4 como


salida    

    // Timer en modo normal, sin salida por OC0 con preescaler de 1024

    TCCR1B = (1 << CS10) | (1 << CS12);

    OCR1A = 781; //1562                        // Retrasode 100ms

    TCNT1=0;

   

    while(1){                            //Ciclo infinito

       while((TIFR1 & (1<<OCF1A)) == 0); // Espera al desbordamiento y se


habilita flag

          PORTD ^= 0xFF;                 // Se alterna cada vez que se


habilita flag

          TCNT1=0;

          TIFR1 |= (1<<OCF1A);           // se limpia el indicador de


desboramiento T1

    }

Figura 8 Señal obtenida en osciloscopio Parte B


[Escriba aquí]
Figura 9 Circuito físico Parte B

Simulacion

Figura 10 Señal obtenida en osciloscopio Proteus Parte B

[Escriba aquí]

Figura 11 Simulación Parte B


[Escriba aquí]

También podría gustarte