Página principal

Generador de frecuencia con Raspberry

PLL

xsetaseta@gmail.com

En este montaje aprovechamos el anterior montaje raspfm y modificamos el código fuente para generar una onda de una frecuencia entre 123KHZ y 125MHZ.
He quitado en el programa PIFM todo lo relativo a la modulación de FM y el código de DMA.
El programa pll3 está realizado en C de donde recibe un parámetro de frecuencia a generar. Si por el contrario queremos parar el generador deberemos figurar como parámetro 0.
SETA43 ->Frecuencia: 0.123000 Mhz  Divisor 16650406
SETA43 ->Frecuencia: 0.555000 Mhz  Divisor 3690090
SETA43 ->Frecuencia: 1.000000 Mhz  Divisor 2048000
SETA43 ->Frecuencia: 5.000000 Mhz  Divisor 409600
SETA43 ->Frecuencia: 10.000000 Mhz  Divisor 204800
SETA43 ->Frecuencia: 15.000000 Mhz  Divisor 136533
SETA43 ->Frecuencia: 12.000000 Mhz  Divisor 170667
SETA43 ->Frecuencia: 10.000000 Mhz  Divisor 204800
SETA43 ->Frecuencia: 20.000000 Mhz  Divisor 102400
SETA43 ->Frecuencia: 30.000000 Mhz  Divisor 68267
SETA43 ->Frecuencia: 40.000000 Mhz  Divisor 51200

Salida del programa pll3

Para crear un interface gráfico he utilizado el lenguaje python con la librería gráfica tkinter.
Tiene dos interfaces gráficos pll1.py  y pll2.py , se puede utilizar el que mas guste.


pll2.py

pll1.py









Como vemos en la imágenes, a frecuencia bajas la onda es cuadrada, y según aumentamos la frecuencia se va haciendo senoidal. Con un filtro paso altos  podríamos llegar a una forma de onda casi perfecta.
Con mi osciloscopio podemos ver la forma de la onda hasta un máximo de unos 20MHZ. Con el frecuencímetro  hecho por mi, podemos medir la frecuencia. Existe una desviación de frecuencia que puede ser debido al propio frecuencímetro  por no estar bien tarado.
En cualquier receptor de radio de AM, OC y FM  podemos sintonizar la frecuencia generada.
Deberemos tener cuidado de no pisar las emisoras comerciales, que aunque la potencia es baja podemos tapar la señal de algún vecino.

Archivos de programa

Ahora voy a intentar explicar en lo que pueda, un poco del programa pll3.c .
El BCM2835 es un integrado que además de contener un procesador ARM dispone de una serie de periféricos auxiliares como:
Timers, Interrupt controller, GPIO, USB, PCM / I2S, DMA controller, I2C master, I2C / SPI slave, SPI0, SPI1, SPI2, PWM, UART0, UART1.
Existe un manual BCM2835 ARM Peripherals que explica mas o menos todas las funciones del integrado. Es muy completo pero muy difícil de comprender.
Para utilizarlo como PLL debemos ir a la página 105 , punto 6.3 General Purpose GPIO Clocks.
Colocamos en la dirección CM_GP0CTL las distintas opciones
 struct GPCTL setupword = {6/*SRC*/, 1, 0, 0, 0, 1,0x5a};
Que significan:
Clock source =PLLD
ENAB=1
KILL=0
BUSY=0
FLIP=0
MASH=1
PASSWD=0x5a

Seleccionamos como fuente de reloj PLLD, y MASH control a 1 (equivalente a no MASH divisores).
Ahora establecemos el divisor para el PLL que se coloca en CM_GP0DIV. Variando el valor de este registro podemos variar la frecuencia generada en tiempo real, este es el metodo empleado para generar FM en el montaje de PIFM. Existe dos programas de PIFM, uno que maneja mediante el procesador la frecuencia y otro que utiliza DMA para no sobrecargar el procesador.
Para calcular el divisor que debemos poner en CM_GP0DIV, que genere una frecuencia concreta en el PLL utilizamos la formula:

centerFreqDivider = (int)((500.0 / centerFreq) * (float)(1<<12) + 0.5);


Como ejemplo para una frecuencia de 40.000000Mhz debemos colocar un divisor 51200.
Podéis ver que la formula se puede optimizar bastante, pero no he querido modificar la original para no despistar mucho. El numero 500 se debe a que el PLL se basa en un reloj de 500MHZ y (1<<12) significa 4096, por lo que una forma más rápida sería:
 
centerFreqDivider =2048000/centerFreq

Como podemos ver, es un tanto difícil de entender.
Después de ver los manuales del ATMEGA del arduino y ver los manuales del BCM2835, la comparación es abismal en favor de ATMEGA,  hecho de menos todas sus explicaciones y esquemas.

Saludos
Juan Galaz



Bibliografía:
http://www.icrobotics.co.uk/wiki/index.php/Turning_the_Raspberry_Pi_Into_an_FM_Transmitter
https://github.com/Emerica/pifm/blob/master/pifm.c
https://github.com/Guzunty/Pi/blob/master/src/gzlib/src/gz_clk.c
http://www.raspberrypi.org/phpBB3/viewtopic.php?f=72&t=17975