Generar una determinada frecuencia a partir de una frecuencia del micro de 25 MHz

Hola a todos, la verdad es que no tengo mucho conocimiento sobre como generar una determinada frecuencia a partir de la frecuencia del micro, en este caso de 25 MHz.

Cabe señalar que este micro tiene un contador de 16 bits, osea, que cuenta hasta 65536 cuentas. También cuenta con pre-escaladores de 1, 2, 4, 8, 16, 32, 64 y 128

Lo que quiero es generar una frecuencia de 311.13 herz a partir de 25 MHz.

Mi profe me dijo que hiciera esta división:

25000000/311.13 = 80352 cuentas.

Ya con esto, sacas el numero de cuentas que necesitas. La verdad no le entiendo mucho por que hizo esto, si alguien me lo pudiera explicar porfas.

Pero como el timer máximo cuenta hasta 65536, necesitamos usar un pre-escalador para bajar la frecuencia.

El profe escogió un pre-escalador de 8 que por que según esto tendrá mas resolución. Pero la verdad no se por que utilizo un pre escalador de 8 y en que se baso para elegirlo.

Hizo la siguiente operación:


25000000/8/311.13 = 10044 cuentas.

Después dijo que usando este rango, podre genera frecuencias de:
47Hz a 31Khz

Y pues tampoco tengo mucha idea de como saco ese rango... Bueno, creo que si se de donde saco el rango, pero la verdad no entiendo el significado de como lo saco. El 47 Hz lo saco de dividir el resultado de la siguiente operación 25000000/8 entre 65536 y el 31 Khz lo saco de 25000000/8 = 3125000 pero pues lo pongo en Khz y me sale 3125Khz y no 31Khz como lo puso el profe, no se si se halla el profe equivocado?

Si me pudieran ayudar con mis dudas, les estaré agradecido eternamente.

Saludos
 
Tal vez viendolo en tiempo te resulta mas sencillo:

Como no mencionas nada, yo tomo que 1 cuenta en tu uC te lleva 1/25MHz= 40 nSeg.

Si queres obtener 311,13 Hz (bien redondo el numerito :D) tendrias un periodo de 3,21mSeg.

3,21mSeg/40 nSeg=80352,2 cuentas (que te menciono tu profesor)

Entonces a lo sumo podras generar 311,1310 Hz (80352 cuentas) o 311,1271 Hz

Tenes 2 opciones, usar prescaler o no, yo me evitaria lios y no lo usaria, ya que sino se complica un poco la cuenta.

Yo haria esto:

1- Configuro Timer para que cuente 65536 cuentas

2- Cuando llegue a 0 o a esa cuenta (dependera si tu timer es ascendente o no), se produce la interrupcion.

3- Activo un flag y reconfiguro al timer para que cuente las 14816 (siempre desactivando el timer antes cada vez que modifico su configuracion) cuentas que me faltan y espero nuevamente la interrupcion.

4- Llega la interrupcion del timer, cambio de estado un puerto que voy a usar como salida de la señal, y repito el proceso desde 1.

Con una maquina de estado, ese procedimiento lo haces en un toque.
 
Hola
Primeramente informate si los 25Mhz es la frecuencia de oscilacion del cristal de cuarzo, o si realmente las instrucciones se ejecutan a esa frecuencia, ya que normalmente las instrucciones del microcontrolador se ejecutan a 1/4 parte de la velocidad del oscilador.
Por otro lado te estan pidiendo una frecuencia de 311,13 hz, la que equivale a un periodo de tiempo de 3,2114 ms, en donde 1,6 ms estara en estado alto y otros 1,6 ms en estado bajo.
A partir de los 1,6ms que necesitas para cada cambio de estado, lo haces bien mediante el TIMER o solo mediante un BUCLE.
 
Tiene razon en lo que dice pepe, me equivoque ahi, si fijas el cambio de estado recien en los 3,... mseg vas a tener la mitad de la frecuencia pedida.

De hecho te favorece que sea asi, porque ni siquiera necesitarias usar un flag, simplemente fijando la cuenta en 40 mil y pico te alcanza, siempre y cuando tus cuentas tarden 40nSeg (25MHz).
 
Atrás
Arriba