Rectificación fallida del diseño del oscilador de cristal MCU

2

Estoy trabajando en un proyecto de pasatiempos SMD (tablero de 2 capas) en el que utilizo una MCU STM32F405 que funciona a 3.3 V, sincronizada desde un cristal externo de 25MHz. Siendo impaciente, rápidamente diseñé una tabla y la ordené. Sin embargo, aparentemente he perdido muchos puntos con respecto al diseño de PCB con respecto al cristal externo.

El resultado no funcionó tan bien, como cabría esperar. Cuando cambio al oscilador externo, la CPU parece funcionar. Pero el reloj de la MCU es muy lento, y encender y apagar un GPIO en el bucle principal produce una onda cuadrada de aproximadamente 1 kHz (aún no he tenido tiempo de verificar la frecuencia con un pin de salida).

El cristal está oscilando a 25 Mhz, pero solo mido una onda sinusoidal con una amplitud p-p ligeramente inferior a 500 mV (utilizando una sonda de osciloscopio x10). Espero que esto esté más cerca de la tensión de alimentación de 3.3 V (no puedo encontrar mucha documentación que indique lo que se debe esperar). Tampoco entiendo cómo funciona la MCU, ya que definitivamente no se detiene en el bucle. esperando que el oscilador arranque. Pero al menos no corre a la velocidad correcta. Así que cualquier sugerencia sobre lo que está sucediendo sería apreciada.

Después de estudiar el tema del diseño de MCU de cristal MCU con más detalle, tengo una idea bastante buena de lo que hice bien y de dónde fallé espectacularmente. Pero todavía estoy bastante confundido sobre cuál es la forma correcta definitiva de hacer esto.

Lo que tengo correcto:

  • Las huellas del cristal son cortas, a unos 6 mm de la MCU.
  • Las huellas son simétricas.

Lo que me equivoque es:

  • Utilicé un plano de tierra debajo del cristal y las pistas a la MCU, probablemente causando una capacitancia parásita muy alta.

  • Malinterpreté completamente el concepto de "anillo de guardia". Agregué una zona de relleno de la capa superior (que rodea el cristal) y la cosí al plano del suelo.

  • Usando un cristal de 25 MHz en lugar de uno de 8 Mhz. La configuración de PLL sugerida por STMCubeMx parece dividir la entrada a 1 Mhz, antes de multiplicarla hasta 168 Mhz. Así que un cristal de 8 MHz debería funcionar bien, supongo.

  • La línea de reinicio se ejecuta justo debajo del cristal. Sin embargo, eso a su vez está conectado a la JTAG y un botón, y por lo demás es pasivo.

Por lo tanto, sospecho que la capacidad parásita del diseño explica la baja Vp-p en el oscilador de 25MHz. Entonces, como primer remedio, estoy planeando cambiar a un cristal de 8MHz para que funcione. ¿Mi suposición aquí tiene sentido, y tendría un cristal de 8 MHz una mejor oportunidad de trabajar en mi mal tablero? (Me gustaría que la placa actual funcione, incluso si el diseño es subóptimo / muy malo).

Por supuesto, el plan final es hacer una segunda tabla de revisión donde el diseño sea fijo. Pero hay un par de cosas que aún encuentro confusas en los documentos que he leído hasta ahora:

  • Algunos documentos recomiendan NO usar un plano de tierra debajo del cristal, pero coloque un anillo protector alrededor del circuito y conéctelo al pin de tierra MCU más cercano. Esto tiene sentido para mí, sin embargo:

  • Algunos otros documentos recomiendan colocar un plano de tierra separado debajo del cristal (además del anillo de la capa superior), y conectarlo a la tierra de MCU más cercana en el lugar uno . Sin embargo, no veo cómo esto sería mejor que mi capacidad de diseño actual, ya que el plano "separado" también se conectaría al plano de tierra principal. Entiendo que el ruido de RF sería mucho mejor. Pero contradice mi suposición de que la capacidad parásita es la razón por la que mi diseño actual produce una salida de oscilación tan débil.

Así que cualquier explicación con respecto a esta aparente contradicción sería apreciada. Además, cualquier otra sugerencia para mí con respecto a la "mejor manera" de diseñar mi placa Rev2 sería muy apreciada.

EDITAR: Las imágenes de la PCB se encuentran a continuación. C3 y C4 son los condensadores y R6 (que está entre las tapas) es Rext. (Perdón por el mal contraste).

    
pregunta Johnny Egeland

3 respuestas

4

Si el cristal está oscilando a 25MHz, entonces su problema aparente está en otra parte, tal vez la configuración del divisor de reloj, PLL o lo que sea que incorpore ese chip en particular. Asegúrese de que su medida no esté afectando la oscilación.

Ninguno de los elementos que mencionas son probablemente asesinos de trato. Es bastante normal que los voltajes en el cristal sean pequeños en relación con el voltaje de suministro, incluso cuando se miden correctamente con una sonda FET.

A veces, incluso se usa una resistencia en serie para reducir la unidad y evitar dañar el cristal con una potencia de unidad excesiva, especialmente para los cristales SMT pequeños que están limitados a una unidad de 100uW o menos.

    
respondido por el Spehro Pefhany
3

Como se señaló en las respuestas anteriores y en varios comentarios, resulta que el problema se debió en todo momento a una configuración incorrecta de PLL. El problema parece estar en "libopencm3", que utilicé por su simplicidad para la configuración del reloj. Lo he usado con éxito en varios tableros de desarrollo, pero parece tener algunos problemas con la configuración de cristal de 25 MHz para STM32F405 al menos. (Lo notificaré a los desarrolladores).

Creé una configuración muy básica usando STM32CubeMX, y la placa ahora ronronea como un gatito. También habilité el MCO1 para HSE, y me da una salida estable de 24.9998Mhz en el PA8.

Muchas gracias a todos los colaboradores en este post, por tomarse su tiempo para señalarme la dirección correcta. Probablemente hubiera pasado muchas más horas y probablemente hubiera diezmado mi pizarra completamente sin su ayuda. Además, ahora tengo una entrada muy valiosa sobre los cambios de diseño para mi próxima revisión, y he aprendido muchas cosas muy útiles :-)

EDITAR: Resulta que el problema raíz no fue causado por mi código original, ni por LibOpenCm3. El problema fue causado por el sistema de construcción Meson, y es la primera vez que intento usarlo en un proyecto STM32. De forma predeterminada, inyecta el indicador del compilador gcc "-fPIC", que a su vez dio como resultado que se pasara un puntero NULL a la función de configuración del reloj libopencm3 (no sé por qué, pero puede ser un error de GCC).

Entonces, la función de configuración del reloj terminó configurando el PLL a partir de los datos ubicados en la dirección de memoria 0x00000000. Estoy bastante sorprendido de que esto haya resultado en una salida de PLL de 2.44 Mhz, y no se bloqueó.

Es bastante simple desactivar este indicador al pasar las siguientes opciones predeterminadas de mesón al definir el proyecto en el archivo raíz meson.build: 'b_staticpic = false', 'b_pie = false'

Luego eliminé y regeneré el script de construcción ninja, y todo estaba en orden. Mi código de prueba original ahora se ejecuta a la velocidad deseada de reloj de 168Mhz :-)

    
respondido por el Johnny Egeland
2

Para el diseño de tu pcb:

  • Utilicé un plano de tierra debajo del cristal y las pistas a la MCU, probablemente causando una capacitancia parásita muy alta.

Probablemente este no sea un gran problema y es poco probable que sea tu problema

  • Entendí mal el concepto del "Anillo de la Guardia". Agregué una zona de relleno de la capa superior (que rodea el cristal) y la cosí al plano de tierra.

También no es crítico y probablemente no sea tu problema.

  • Usando un cristal de 25 MHz en lugar de uno de 8 Mhz. La configuración de PLL sugerida por STMCubeMx parece dividir la entrada a 1 Mhz, antes de multiplicarla hasta 168 Mhz. Así que un cristal de 8 MHz debería funcionar bien, supongo.

Esto debe consultar con la hoja de datos de su microcontrolador, por lo general, puede configurar los PLL para que se adapten a su cristal, pero seguro que esto puede ser un problema. Las frecuencias deben permanecer dentro de un rango en cada paso del PLL (divisor, multiplicador).

  • La línea de reinicio se ejecuta justo debajo del cristal. Sin embargo, eso a su vez está conectado a la JTAG y un botón, y por lo demás es pasivo.

Tampoco es probable que se trate de un problema, y parece que no tienes el "restablecimiento".

En la placa de nuevo diseño, el cristal es a menudo un problema, no solo el diseño sino también la configuración correcta del chip, porque es difícil de depurar y es más un proceso de prueba y error hasta que funciona.

En un nivel de hardware, primero debe verificar su condensador de carga, es probable que tenga un problema allí (especialmente si cambió el cristal). Algunos cristales con algunos MCU también necesitan una resistencia en serie, pero nunca he visto "reglas" para definir cuándo se deben usar o los valores, parece más un proceso de prueba y error.

Intente cambiar el límite de carga del cristal con diferentes valores, deben ser aproximadamente el doble del valor de la hoja de datos porque están efectivamente en serie. Aquí hay más detalles al respecto.

También es muy probable que compruebe la configuración y el código para el cambio de reloj.

Dejé de usar el cristal cuando puedo y utilizo un reloj externo, por lo general es menos doloroso.

    
respondido por el Damien

Lea otras preguntas en las etiquetas