Página principal

DS1077

Divisor de frecuencia programable.
Generador de frecuencia

Arduino


En este artículo enseñaré como generar frecuencias diferentes con el chip DS1077.
El chip DS1077 es un doble divisor de frecuencia programable.
El oscilador de frecuencia se encuentra internamente en el chip, no tiene cristal, por lo cual la frecuencia no suele ser demasiado exacta.
Dependiendo del modelo, el oscilador interno puede estar entre 66Mhz y 133Mhz ( DS1077x-66 para 66Mhz).
Enl modelo que he utilizado para el montaje es el de 66Mhz.




En el primer divisor programable, salida OUT0, solo se programa el divisor P0 para que divida por 1,2,4,8.
 PRESCALER P0 (0M1-0M0)
0 MCLK /1   66,6 MHz
1 MCLK /2   33,3 MHz
2 MCLK /4   15,65 MHz
3 MCLK /8   8,32 MHz
Además se puede habilitar/deshabilitar la salida OUT0 internamente o externamente con el pin CTRL0.
En nuestro montaje colocaremos CTRL0 y CTRL1 a GND para que esté habilitado.

El segundo divisor programable, salida OUT1, también tiene el prescaler programable P1, para que divida por 1,2,4,8.
 PRESCALER P1 (1M1-1M0)
0 MCLK /1   66,6 MHz
1 MCLK /2   33,3 MHz
2 MCLK /4   15,65 MHz
3 MCLK /8   8,32 MHz

La salida del prescaler P1 se conecta a un segundo divisor programable N, que se puede programar para que divida entre 2 y 1025.
DIV
DIV-decimal
DIVISOR
0 000 000 000
0 000 000 001
0 000 000 010
0 000 000 011
1 111 111 111
0
1
2
3
1023
/2
/3
/4
/5
/1025


Por ejemplo para conseguir una frecuencia de 100Khz deberíamos programar los dos divisores porgramable de la siguiente forma:
-El prescaler P1 lo dejaríamos dividiendo por 1. Con lo que la frecuencia quedaría a 66666Khz.
-Para conseguir 100KHz deberemos dividir 66666Khz/100 =666.
-Al ser el divisor 666, el valor que debemos colocar en DIV será 666-2=664.
-664 en binario será  b0000 0010 1001 1000  , pero hay que desplazarlo 6 bit a la izquierda, b1010 0110 0000 0000 , 42496 en decimal.

Como segundo ejemplo, para conseguir 15Khz realizaremos los siguientes cálculos.
-El prescaler P1 lo dejaríamos dividiendo por 8. Con lo que la frecuencia quedaría a 8333Khz.
- 8333Khz/15=555, valor en DIV  555-2=553
- 553 -> b00 0010 0010 1001  , desplazado 6 bit a la izquierda, b1000 1010 0100 0000 -> 35392 en decimal.

En los cálculos he ignorado los decimales a modo de ejemplo.

El chip DS1077  se programa mediante 2-wire serial interface , que se conectan a los pin del arduino A4 y A5.
DS1077_ADDRESS 0b1011000
Access DIV [01]
If R/ W is 0, this command writes to the DIV register. After issuing this command, the next data byte value is to be written into the DIV register.
If R/ W is 1, the next data byte read is the value stored in the DIV register.
Access MUX [02]
If R/ W is 0, this command writes to the MUX register. After issuing this command, the next data byte value is to be written into the MUX register.
If R/ W is 1, the next data byte read is the value stored in the MUX register.
Access BUS [0D]
If R/ W is 0, this command writes to the BUS register. After issuing this command, the next data byte value is to be written into the BUS register.
If R/ W is 1, the next data byte read is the value stored in the BUS register.
Write E2 [3F]
If WC = 0 the EEPROM is automatically written to at the end of each command. This is a DEFAULT condition. In this case the command WRITE E2 is not needed.




Para todos los cálculos he supuesto que la frecuencia del MCLK es de 66.666.666 Hz para el chip empleado.
Pero después de mucha medidas, debido a que me daba error en las frecuencias, he descubierto que la frecuencia real es de aproximadamente 65800 Khz, lo que hay que tener en cuenta para los cálculos.
La tolerancia teórica es de 0,5% , pero como vemos en nuestro caso es de 1,29% .
Por este motivo, si se quiere tener una frecuencia precisa debemos ajustar la frecuencia real de MCLK con la orden:
    FREB 65800

En este chip también se puede programar en su EEPROM el valor inicial de los registros, y de esta forma, la frecuencia inicial que saldrá por OUT0 y OUT ,  sin haber programado el chip.

El programa realizado para el arduino escucha las ordenes que recibe por el puerto serie, y las ejecuta.
Comandos reconocidos
MDIV    [0-1]        Activar prescaler [0=enable, 1=disable]
DIVX    [0-1023]  Divider         dividir[2-1025]
        00000000 00000000    /2   
        00000000 00000001    /3   
        00000000 00000010    /4   
        00000000 00000011    /5   

MX0M    [0-3]    Prescaler 0        div[1,2,4,8]
MX1M    [0-3]    Prescaler 1        div[1,2,4,8]

FREB    [Frecuencia KHz]     Default=66666
FREC    [Frecuencia]
LIST    Lista todos los estados

RDIV    [0-65536]
RMUX
    [0-65536]
RBUS
    [0-65536]
RWRI
    [0-65536]
Existen dos versiones de programa arduino, versión 0 y versión 1.
La versión 0 solo admite los comandos FREB y FREC .
La versión 1 admite todos los comandos.


Con cualquier programa de terminal serie se pueden mandar las ordenes.
Ejemplo:
    FREC 35000
Nos generaría una frecuencia de 35000Hz en OUT1.

Para hacer mas fácil la programación del chip he realizado dos programas, uno en python y otro en Gambas (VB para Linux).
Su transformación para que funcionase en Windows en el caso de Phyton es fácil, solo cambiar la lista de dispositivos serie.


Programa en python.


Programa en Gambas (VB para Linux)


Visualización de la onda en mi osciloscopio digital DSO-6022BL.

Espero que os haya gustado este montaje, y que os de ideas para otros montajes.

PROGRAMA

VIDEO


Saludos.
Juan Galaz


Bibliografía:
http://wardy2.rssing.com/chan-9972730/all_p2.html
http://jondontdoit.blogspot.com/2012/08/using-ds1077-programmable-oscillator.html
http://ferretrobotics.blogspot.com/2013/08/ds1077-programmable-oscillator.html
https://www.sparkfun.com/products/retired/9089