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