¿Cómo generar un reloj de alta frecuencia con alta estabilidad desde un microcontrolador?

4

Estoy usando el microcontrolador TM4C123G de TivaC launchpad, para generar un reloj de 40 MHZ, pero lo probé en el osciloscopio y no parece una onda cuadrada, es más como un sinusoidal. Aquí hay una captura de pantalla:

yaquíestámicódigo:

#include<lm4f120h5qr.h>#include<stdbool.h>#include<stdint.h>#include"driverlib/sysctl.c"
#include "driverlib/pin_map.h"

void SYS_CLOCK(){  SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ); }   
// Microcontroller Frequency 80MHZ

 void CLK1_SETUP(unsigned long Period){
 SYSCTL->RCGCWTIMER |= (0x1<<0);
 WTIMER0->CTL &= ~(1<<8);
 WTIMER0->CFG = 0x00000004;
 WTIMER0->TBMR |= (0xA<<0);
 WTIMER0->TBILR = Period;
 WTIMER0->TBMATCHR =Period/2;
 WTIMER0->CTL |= (1<<8);

 SYSCTL->RCGCGPIO |= (1<<2);
 GPIOC->DIR |= (0x1<<5); 
 GPIOC->DEN |= (0x1<<5);
 GPIOC->PUR |= (0x1<<5); 
 GPIOC->AFSEL |= (0x1<<5);
 GPIOC->AMSEL &= ~(0x1<<5);
 GPIOC->PCTL |= 0X00700000;
 }

 void CLK2_SETUP(unsigned long Period){
 SYSCTL->RCGCWTIMER |= (0x1<<1);
 WTIMER1->CTL &= ~(1<<8);
 WTIMER1->CFG = 0x00000004;
 WTIMER1->TBMR |= (0xA<<0);
 WTIMER1->TBILR = Period;
 WTIMER1->TBMATCHR =Period/2;
 WTIMER1->CTL |= (1<<8);

 GPIOC->DIR |= (0x1<<7); 
 GPIOC->DEN |= (0x1<<7);
 GPIOC->PUR |= (0x1<<7); 
 GPIOC->AFSEL |= (0x1<<7);
 GPIOC->AMSEL &= ~(0x1<<7);
 GPIOC->PCTL |= 0X70000000;
 }

 void main()
 {
 SYS_CLOCK();
 CLK1_SETUP(2); //40MHZ~25nsec~2
 CLK2_SETUP(190);//421KHZ~2.375usec~190
 ADC_SETUP(); 
 }

en el otro lado, generé otro reloj con el mismo código pero con una frecuencia de 421 KHZ y parece correcto:

¿Alguna sugerencia sobre cómo hacer que los 40 MHZ sean más estables y precisos?

    

2 respuestas

6

Sus pines GPIO no pueden cambiar entre señal alta y baja lo suficientemente rápido.

A 40 Mhz, el período de un solo ciclo es de 25 ns. Aquí está la definición de la velocidad de giro de los pines GPIO del documento enlace :

Para un solo ciclo necesita una elevación y una caída de borde.

Como se ve en la tabla anterior, en el mejor de los casos, se agregarán hasta 16.7ns (unidad de 8 mA con control de velocidad de giro desactivado). Por lo tanto, en este caso, sus pines pasarán la mayor parte del tiempo durante el período de giro de la señal hacia arriba o hacia abajo. Y eso es más o menos lo que estamos viendo en la imagen de su osciloscopio también.

    
respondido por el Nils Pipenbrinck
2

Primero descargue la frecuencia a 10MHz para ayudar a ver qué está pasando. Verás una parte plana entre el pico de borde ascendente y el borde descendente.

Luego mejore la sonda de alcance, mediante la compensación (efecto muy pequeño en estas frecuencias: la segunda imagen muestra una sonda bien compensada) y una conexión a tierra mejorada (puede hacer una gran diferencia ...)

A continuación, intente la terminación de la serie (término S). Una resistencia de 27-100 ohmios (comience con 56) puede cuadrar muy bien el borde de ataque: demasiado alto y se redondeará. El término S debe estar lo más cerca posible del pin de E / S, pero espero que adjuntarlo al pin Launchpad sea lo suficientemente bueno. También puede experimentar con las diferentes fortalezas de la unidad y el control de velocidad de giro: la mejor solución dependerá del cableado externo, pero la terminación S es una adición útil a algunas señales rápidas.

Finalmente, restaure el reloj a 40MHz y vea la mejora. (Puede que valga la pena agregar más imágenes a la pregunta).

    
respondido por el Brian Drummond

Lea otras preguntas en las etiquetas