generador de impulsos STM32F4

0

Con STM32-H407 (STM32F407ZG), estoy tratando de hacer una salida de forma de onda rectangular como;

---_ _ ---_ _ _ _ <<>> _ _ --- _ _ _ _ <<>> _ _ - -_ _ _ _ _ _

Con números

---_ _ ---_ _ _ _ _ tiene una longitud de 125us (0.000125s u 8kHz) y se repite.

--- tiene una longitud de 3.5MHz o 0.2857 us.
En otras palabras, ---_ _ --- debe ser 0.2857 us + 0.2857 us + 0.2857 us long.

Para resumir, el pulso de 3.5MHz aparece dos veces cada 8 kHz.

Lo que se ha intentado es 1) PWM + Temporizador. Error al detener los pulsos de 3.5MHz después de dos ciclos. 2) Temporizador + Temporizador. Los temporizadores no trabajaron juntos.

¿Cómo codificarías esto? ¿Puedes dar algunos ejemplos simples?

Gracias.

    
pregunta nelm

2 respuestas

1

Con la adición de un poco de hardware puede reducir las demandas del controlador. El principal problema (señalado por Dave) es que las frecuencias no son múltiples, por lo que es difícil sincronizarlas. El hardware sincroniza el flanco ascendente de los pulsos de 3.5Mhz con la salida (asíncrona) de la uC. Los chips pueden ser TTL (serie 7400) o CMOS (serie 4000)

El uC produce la señal 125uS (temporizador de interrupción). La señal de 3.5MHz podría ser producida por un oscilador Xtal externo y es simplemente un tren de pulsos a esa frecuencia. También podría derivarse del oscilador uC a través de divisores.

El flip flop tipo D es un flanco positivo activado. Cuando la salida de uC es BAJA, la salida Q del flip flop es BAJA. La salida de la compuerta AND es también mantenida BAJA por el pin de salida de la uC (BAJA). Esto significa que no pueden pasar pulsos a través de la puerta AND.

Cuando el pin de salida de uC pasa a ALTO, la salida Q del flip flop tiene que esperar hasta el siguiente flanco ascendente del reloj de 3.5MHz antes de subir. Solo cuando las tres entradas a la compuerta AND sean ALTAS, el pulso se verá en la salida de la compuerta. Debido a que estas señales están sincronizadas con el flanco ascendente del pulso de 3.5Mhz, la salida será un pulso de longitud completa.

La salida de la puerta AND se retroalimenta a la unidad de control que necesita detectar DOS PULSOS. En el borde descendente del segundo pulso, luego restablece el pin SALIDA a BAJO, lo que evita que entren más pulsos a través de la puerta AND.

Con la adición de un poco más de electrónica, todo se podría hacer totalmente en hardware.

Metacode

Inicialice el temporizador de interrupción para 125uS

establece el pin de salida HIGH

compruebe si el primer pulso va alto - > bajo

compruebe si el segundo pulso va alto - > bajo

Establezca el pin de salida LOW

    
respondido por el JIm Dearden
0

Primero, tenga en cuenta que su período total (125 µs) no es un múltiplo entero de su tiempo de bit (1 / 3.5 MHz). Es un factor de 375.5.

Si tuviera que hacer esto, me sentiría inclinado a configurar una de las interfaces SPI para que se ejecute a 7,0 MHz y alimente un flujo de datos a través de DMA que produce los pulsos que necesita en la línea MOSI. La función que maneja las interrupciones DMA generará los datos sobre la marcha.

Puede intercambiar el tamaño del búfer por la frecuencia con la que se debe ejecutar el ISR. Si utiliza búferes dobles, podría tolerar bastante jitter en el manejo de interrupciones.

    
respondido por el Dave Tweed

Lea otras preguntas en las etiquetas