jueves, 30 de mayo de 2019

Practica 4, El oscilador


Practica 4, El oscilador

La familia PIC32 dispone de 4 osciladores:
  • Oscilador primario (PRI). Es un oscilador externo que se construye con un cristal y dos capacitores.
  • Oscilador secundario. Es un oscilador interno de 32.768KHz
  • LPRC. Es un oscilador interno de 31.25KHz
  • Fast RC (FRC). Es un oscilador interno de 8MHz

La señal de los osciladores FRC y PRI puede elegirse que pase a través de multiplicadores y divisores PLL o elegirse que no pasen, ver tabla 4.1
Por ejemplo la señal del oscilador FRC puede pasar directamente al CPU usando la configuración “FNOSC = FRC” o pasar a través de multiplicadores(PLL) y divisores(PLL) usando la configuración “FNOSC = FRCPLL”.

FNOSC Configuración
Oscilador
FNOSC = FRC
Fast RC Osc (FRC)
FNOSC = FRCPLL
Fast RC Osc with PLL
FNOSC = PRI
Primary Osc (XT,HS,EC)
FNOSC = PRIPLL
Primary Osc w/PLL (XT+,HS+,EC+PLL)
FNOSC = SOSC
Low Power Secondary Osc (SOSC)
FNOSC = LPRC
Low Power RC Osc (LPRC)
FNOSC = FRCDIV16
Fast RC Osc w/Div-by-16 (FRC/16)
FNOSC = FRCDIV
Fast RC Osc w/Div-by-N (FRCDIV)
Tabla 4.1 Opciones de configuración del Oscilador


El Oscilador FRC (FNOSC = FRC)
En las prácticas 1, 2 y 3 se ha usado este oscilador, en la figura 4.1 se puede ver de forma esquemática el flujo de la señal de reloj de este oscilador.

Entre sus propiedades se puede mencionar:

  • Frecuencia de oscilación de 8 MHz
  • No requiere componentes externos
  • No es multiplicado ni dividido (PLL), la señal de reloj llega intacta al CPU
  • Antes de llegar a los periféricos pasa por un divisor de frecuencia (Peripheral Bus Clock Divisor)

Figura 4.1 Flujo de la señal de reloj del oscilador FRC sin PLL. Esta figura se basó en un segmento de la figura 6-1 del documento DS61112H.


Para su configuración solo se requieren dos líneas de programa:
#pragma config FNOSC = FRC     //Internal Fast RC oscillator (8MHz)
#pragma config FPBDIV = DIV_1  //Divide entre 1 el reloj a los periféricos

La primer línea define el oscilador FRC y la segunda línea define el divisor “Peripheral Bus Clock Divisor(PBCD)”.

El PBCD puede dividir la señal del reloj FRC entre 1,2,4 u 8. Ver tabla 4.2, es importante señalar que por default el valor del PBCD es 8. En la práctica del “timer” ya se comentó sobre el PBCD.


Instrucción de configuración
Divisor de la frecuencia de reloj que se entrega a los periféricos
FPBDIV = DIV_1
1
FPBDIV = DIV_2
2
FPBDIV = DIV_4
4
FPBDIV = DIV_8
8
Tabla 4.2

El Oscilador Primario con PLL(FNOSC = PRIPLL)

El oscilador primario es un oscilador externo que se construye con un cristal y dos capacitores(Ver figura 4.2), el manual DS61112H recomienda dos resistencias adicionales Rp = 1M y Rs <= 10K, pero sin ellas puede funcionar correctamente.

Entre sus propiedades se puede mencionar:
  • Frecuencia de oscilación en función de la frecuencia del cristal y multiplicadores y divisores PLL.
  • Requiere componentes externos
  • Pasa por multiplicadores y divisores, por lo tanto se pueden obtener diversas frecuencias de oscilación
  • Antes de llegar a los periféricos pasa por un divisor de frecuencia (Peripheral Bus Clock Divisor)
En la figura 4.2 se puede ver de forma esquemática el flujo de la señal de este oscilador,  en la cual se pueden observar los multiplicadores y divisores .


Figura 4.2 Flujo de la señal del oscilador primario usando PLL. Esta figura está basada en un segmento de la figura 6-1 del documento DS61112H.

De acuerdo a la figura 4.2, para configurar este oscilador se requiere poner los valores adecuados en cada uno de los registros de los multiplicadores y divisores PLL que atraviesa de la siguiente manera:

Cuando la señal sale del Oscilador primario llega al divisor de frecuencia PLL FPLLIDIV. A este divisor se le pueden asignar alguno de los valores que se muestran en la tabla 4.3.

Este divisor debe garantizar que la frecuencia de onda que llega a PLLMULT se encuentre entre 4 y 5 MHz (Ver FIN en figura 4.2)


FPLLIDIV
PLL Input Divider
FPLLIDIV = DIV_1
1x Divider
FPLLIDIV = DIV_2
2x Divider
FPLLIDIV = DIV_3
3x Divider
FPLLIDIV = DIV_4
4x Divider
FPLLIDIV = DIV_5
5x Divider
FPLLIDIV = DIV_6
6x Divider
FPLLIDIV = DIV_10
10x Divider
FPLLIDIV = DIV_12
12x Divider
Tabla 4.3

Por ejemplo
#pragma config FPLLIDIV=DIV_2 // Divide entre 2

Después que la señal sale del divisor FPLLIDIV, entra al multiplicador de frecuencia PLLMULT, los coeficientes disponibles se pueden ver en la tabla 4.4

FPLLMUL
PLL Multiplier
FPLLMUL = MUL_15
15x Multiplier
FPLLMUL = MUL_16
16x Multiplier
FPLLMUL = MUL_17
17x Multiplier
FPLLMUL = MUL_18
18x Multiplier
FPLLMUL = MUL_19
19x Multiplier
FPLLMUL = MUL_20
20x Multiplier
FPLLMUL = MUL_21
21x Multiplier
FPLLMUL = MUL_24
24x Multiplier
Tabla 4.4 Factores para FPLLMULT

Ejemplo de configuración para FPLLMULT:
#pragma config FPLLMUL=MUL_16 // Multiplica por 16

Después de que la señal sale de FPLLMULT llega al divisor de frecuencia FPLLODIV,  en este divisor la señal se divide entre alguno de los valores que se pueden ver en la tabla 4.5.


FPLLODIV
System PLL Output Clock Divider
FPLLODIV = DIV_1
PLL Divide by 1
FPLLODIV = DIV_2
PLL Divide by 2
FPLLODIV = DIV_4
PLL Divide by 4
FPLLODIV = DIV_8
PLL Divide by 8
FPLLODIV = DIV_16
PLL Divide by 16
FPLLODIV = DIV_32
PLL Divide by 32
FPLLODIV = DIV_64
PLL Divide by 64
FPLLODIV = DIV_256
PLL Divide by 256
Tabla 4.5

Ejemplo de configuración para FPLLODIV:
#pragma config FPLLODIV=DIV_4 // Divide entre 4

Cuando la señal de reloj sale de FPLLODIV ya va directo al CPU, pero no así a los periféricos, para llegar a ellos todavía pasa por un divisor de frecuencia, el FPBDIV. Los valores de este divisor se pueden ver en la tabla 4.2.

Ejemplo de su aplicación:
#pragma config FPBDIV = DIV_1 //Divide entre 1 el reloj a los periféricos

Ya que se tiene la descripción de la configuración de este oscilador, enseguida se presenta una práctica bastante simple:
Para su implementación, se usará un cristal de 4MHz y dos capacitores cerámicos de 33pF. El sistema mínimo con este oscilador se puede ver en la figura 4.3


Figura 4.3 Sistema mínimo con oscilador primario. Cristal 4MHz y dos capacitores de 33pF

Se va a generar una onda cuadrada con un ancho de pulso de 1ms, es el mismo programa de la práctica 3, pero ahora usando el oscilador primario.

El programa:

/*
* Autor: Jesus Acosta
* 26 Marzo 2019
* Genera una onda con un ancho de pulso = 1 ms
* Usa un cristal de 4MHz [XT]
* Micro = PIC32MX220F032B
*/

#include <p32xxxx.h>
#pragma config ICESEL = ICS_PGx2 //PGEC = pin 22
                                                                  //PGED = pin 21

#pragma config JTAGEN = OFF     // Deshabilita JTAG
#pragma config FSOSCEN = OFF    // Deshabilita oscilador secundario
#pragma config FWDTEN = OFF     // Deshabilita watchdog timer

#pragma config FNOSC=PRIPLL     // Usa el oscilador primario con PLL
#pragma config POSCMOD=XT       // cristal
#pragma config FPLLIDIV=DIV_2   // Divide entre 2 [Ahora 2MHz]
#pragma config FPLLMUL=MUL_16   // Multiplica por 16 [Ahora 32MHz]
#pragma config FPLLODIV=DIV_4   // Divide entre 4 [Ahora 8MHz]
#pragma config FPBDIV = DIV_1   // Divide entre 1 el reloj a los
                                                               // periféricos

int main(void);                //Prototipo funcion main
void retardo1ms(void);         //Prototipo función retardo
//************** Programa principal **********************

int main(void){
    TRISAbits.TRISA4 = 0; //Outputs
    LATAbits.LATA4 = 1;   //Se pone pin 12

    while(1){
       LATAbits.LATA4=1;
       retardo1ms();
       LATAbits.LATA4=0;
        retardo1ms();
    }
}

void retardo1ms(void ){
    /* Limpiar timer 1*/
    T1CON = 0;
    TMR1 = 0;
    PR1 = 7999; //Se asigna el periodo
    IFS0bits.T1IF = 0; //Clear the timer1 interrupt status flag
    IEC0bits.T1IE = 0; //Disable Timer1 interrupts
    T1CON = 0x8000; //Configura T1CON con un prescaler 1:1 y
    //arranca al timer
    while(IFS0bits.T1IF==0);
       return;
    }

Proyectos sugeridos:
Para esta práctica no se sugieren proyectos, se sugieren ejercicios.

Ejercicio 1: Generar una onda cuadrada con un ancho de pulso de 1ms usando el oscilador PRIPLL, pero que tanto el CPU como el timer 1, reciban una señal de reloj de 32 MHz. Hacer un reporte que describa con detalle todas las configuraciones.

Ejercicio 2: Generar una onda cuadrada con un ancho de pulso de 1ms usando el oscilador FRCPLL. Hacer un reporte que describa con detalle todas las configuraciones.


Fin de Práctica.



Bibliografía:
Capítulo 8 del manual de referencia del pic32 (DS60001168K)
Manual DS61112H
/opt/microchip/xc32/v2.15/docs/config_docs/pic32mx220f032b.html

No hay comentarios.:

Publicar un comentario